嵌入式系统 - 寻址模式

  • 简述

    一个 寻址模式指的是您如何寻址给定的内存位置。有五种不同的方式或五种寻址模式来执行该指令,如下所示 -
    • 立即寻址模式
    • 直接寻址方式
    • 寄存器直接寻址方式
    • 寄存器间接寻址方式
    • 索引寻址方式
  • 立即寻址模式

    让我们从一个例子开始。
    
    MOV A, #6AH 
    
    一般来说,我们可以写,
    
    MOV A, #data
    
    它被称为 立即数 因为 8 位数据会立即传输到累加器(目标操作数)。
    下图描述了上述指令及其执行。操作码 74H 保存在地址 0202。数据 6AH 保存在程序存储器的 0203 地址处。读取操作码 74H 后,将下一个程序存储器地址处的数据传送到累加器 A(E0H 为累加器地址)。由于该指令为 2 字节,在一个周期内执行,因此程序计数器将增加 2 并指向程序存储器的 0204。
    立即寻址模式
    Note− 6AH 前的“#”符号表示操作数为数据(8 位)。在没有“#”的情况下,十六进制数将被视为地址。
  • 直接寻址模式

    这是另一种寻址操作数的方式。这里,数据(源数据)的地址作为操作数给出。让我们举个例子。
    
    MOV A, 04H 
    
    寄存器 bank#0(第 4 个寄存器)的地址为 04H。当执行 MOV 指令时,寄存器 04H 中存储的数据被移动到累加器中。由于寄存器 04H 保存着数据 1FH,因此 1FH 被移动到累加器。
    Note− 与立即模式不同,我们没有在直接寻址模式中使用“#”。如果我们使用“#”,数据值 04H 将被传送到累加器而不是 1FH。
    现在,请看下图。它显示了指令是如何执行的。
    直接寻址模式
    如上图所示,这是一条 2 字节指令,需要 1 个周期才能完成。PC 将加 2 并指向 0204。指令 MOV A 的操作码,地址为 E5H。当执行 0202 处的指令(E5H)时,累加器被激活并准备好接收数据。然后PC转到下一个地址为0203并查找源数据(要传输到累加器)所在位置04H的地址。在 04H,控制找到数据 1F 并将其传送到累加器,从而完成执行。
  • 寄存器直接寻址模式

    在这种寻址方式中,我们直接使用寄存器名称(作为源操作数)。让我们试着借助一个例子来理解。
    
    MOV A, R4 
    
    一次,寄存器可以采用从 R0 到 R7 的值。有 32 个这样的寄存器。为了使用只有 8 个变量的 32 个寄存器来寻址寄存器,使用了寄存器组。有 4 个寄存器组,名称从 0 到 3。每个组包含 8 个寄存器,名称从 R0 到 R7。
    一次可以选择一个寄存器组。寄存器组的选择可以通过Special Function Register (SFR) 命名 Processor Status Word(PSW)。PSW 是一个 8 位 SFR,其中每一位都可以根据需要进行编程。位从 PSW.0 到 PSW.7 指定。PSW.3 和 PSW.4 用于选择寄存器组。
    现在,请看下图,以清楚地了解其工作原理。
    寄存器直接寻址模式
    操作码 EC 用于 MOV A、R4。操作码存储在地址 0202 处,当它被执行时,控制权直接转到相关寄存器组的 R4(在 PSW 中选择)。如果选择寄存器组#0,则寄存器组#0 的R4 中的数据将被移动到累加器。这里 2F 存储在 04H。04H 代表寄存器 bank #0 的 R4 的地址。
    数据 (2F) 移动以粗体突出显示。2F 正在从数据存储位置 0C H 传输到累加器,并显示为虚线。0CH 是寄存器组 #1 的寄存器 4 (R4) 的地址位置。上面的指令是 1 个字节,需要 1 个周期才能完整执行。它的意思是,您可以通过使用寄存器直接寻址方式来节省程序内存。
  • 寄存器间接寻址模式

    在这种寻址方式下,数据的地址作为操作数存储在寄存器中。
    
    MOV A, @R0 
    
    这里 R0 中的值被认为是一个地址,它保存要传输到累加器的数据。 Example: 如果R0 的值为20H,并且数据2FH 存储在地址20H,则执行该指令后,值2FH 将被传送到累加器。请参阅下图。
    寄存器间接寻址模式
    所以操作码为 MOV A, @R0是 E6H。假设选择寄存器组#0,寄存器组#0的R0保存数据20H。程序控制移动到 20H,在那里它定位数据 2FH,并将 2FH 传输到累加器。这是一条 1 字节指令,程序计数器递增 1 并移至程序存储器的 0203。
    Note− 仅允许 R0 和 R1 组成寄存器间接寻址指令。换句话说,程序员可以使用@R0 或@R1 创建一条指令。允许所有寄存器组。
  • 索引寻址模式

    我们将通过两个例子来理解索引寻址模式的概念。看看以下说明 -

    MOVC A, @A+DPTR

    MOVC A, @A+PC

    其中 DPTR 是数据指针,PC 是程序计数器(都是 16 位寄存器)。考虑第一个例子。
    
    MOVC A, @A+DPTR
    
    源操作数是@A+DPTR。它包含来自该位置的源数据。这里我们将 DPTR 的内容与累加器的当前内容相加。此添加将给出一个新地址,即源数据的地址。该地址指向的数据随后被传送到累加器。
    索引寻址模式
    操作码是 93H。DPTR 的值为 01FE,其中 01 位于 DPH(高 8 位)中,FE 位于 DPL(低 8 位)中。累加器的值为 02H。然后执行 16 位加法,01FE H+02H 产生 0200 H。位置 0200H 的数据将被传输到累加器。累加器 (02H) 中的先前值将被 0200H 中的新数据替换。图中突出显示了累加器中的新数据。
    这是一条 1 字节指令,执行需要 2 个周期,与之前的指令(每条指令均为 1 个周期)相比,该指令所需的执行时间较长。
    另一个例子 MOVC A, @A+PC工作方式与上述示例相同。这里不是将 DPTR 与累加器相加,而是将程序计数器 (PC) 内的数据与累加器相加以获得目标地址。