嵌入式系统 - 编址模式
编址模式是指访问给定内存位置的方式。执行此指令有五种不同的方式或五种编址模式,如下所示:
- 立即寻址模式
- 直接寻址模式
- 寄存器直接寻址模式
- 寄存器间接寻址模式
- 索引寻址模式
立即寻址模式
让我们从一个例子开始。
MOV A, #6AH
一般来说,我们可以写成:
MOV A, #data
它被称为立即,因为 8 位数据立即传输到累加器(目标操作数)。
下图描述了上述指令及其执行过程。操作码 74H 存储在地址 0202。数据 6AH 存储在程序存储器地址 0203。读取操作码 74H 后,程序存储器下一个地址的数据被传输到累加器 A(E0H 是累加器的地址)。由于指令为 2 字节并在一个周期内执行,因此程序计数器将增加 2 并指向程序存储器的 0204。
注意 - 6AH 前面的 '#' 符号表示操作数是数据(8 位)。如果没有 '#',十六进制数将被视为地址。
直接寻址模式
这是另一种寻址操作数的方式。这里,数据的地址(源数据)作为操作数给出。让我们举个例子。
MOV A, 04H
寄存器组#0(第 4 个寄存器)的地址为 04H。当执行 MOV 指令时,存储在寄存器 04H 中的数据被移动到累加器。由于寄存器 04H 保存数据 1FH,因此 1FH 被移动到累加器。
注意 - 与立即寻址模式不同,我们在直接寻址模式中没有使用 '#'。如果我们使用了 '#',则数据值 04H 将被传输到累加器,而不是 1FH。
现在,让我们看一下下面的图示。它显示了指令如何执行。
如上图所示,这是一个 2 字节指令,需要 1 个周期才能完成。PC 将增加 2 并指向 0204。MOV A,address 指令的操作码为 E5H。当执行地址 0202 处的指令(E5H)时,累加器被激活并准备接收数据。然后 PC 转到下一个地址 0203 并查找地址 04H 的位置,源数据(要传输到累加器)位于该位置。在 04H 处,控制单元找到数据 1F 并将其传输到累加器,因此执行完成。
寄存器直接寻址模式
在这种寻址模式下,我们直接使用寄存器名称(作为源操作数)。让我们尝试通过示例来理解。
MOV A, R4
一次,寄存器可以取值从 R0 到 R7。有 32 个这样的寄存器。为了仅使用 8 个变量来寻址寄存器而使用 32 个寄存器,使用了寄存器组。有 4 个寄存器组,命名为 0 到 3。每个组包含 8 个寄存器,命名为 R0 到 R7。
一次只能选择一个寄存器组。寄存器组的选择可以通过名为处理器状态字(PSW)的特殊功能寄存器(SFR)实现。PSW 是一个 8 位 SFR,其中每个位都可以根据需要进行编程。位从 PSW.0 到 PSW.7 指定。PSW.3 和 PSW.4 用于选择寄存器组。
现在,让我们看一下下面的图示,以清楚地了解其工作原理。
操作码 EC 用于 MOV A,R4。操作码存储在地址 0202,当它被执行时,控制直接转到相应寄存器组的 R4(在 PSW 中选择)。如果选择了寄存器组#0,则寄存器组#0 的 R4 中的数据将被移动到累加器。这里 2F 存储在 04H。04H 表示寄存器组#0 的 R4 的地址。
数据(2F)移动以粗体突出显示。2F 从数据内存位置 0C H 传输到累加器,并显示为虚线。0CH 是寄存器组#1 的寄存器 4(R4)的地址位置。上述指令为 1 字节,需要 1 个周期才能完成执行。这意味着您可以通过使用寄存器直接寻址模式来节省程序内存。
寄存器间接寻址模式
在这种寻址模式下,数据的地址存储在寄存器中作为操作数。
MOV A, @R0
这里 R0 内的值被视为地址,该地址保存要传输到累加器的数据。例如:如果 R0 的值为 20H,并且地址 20H 处存储了数据 2FH,则执行此指令后,值 2FH 将被传输到累加器。请参见下图。
因此,MOV A,@R0 的操作码为 E6H。假设选择了寄存器组#0,则寄存器组#0 的 R0 保存数据 20H。程序控制移动到 20H,在那里它找到数据 2FH 并将其传输到累加器。这是一个 1 字节指令,程序计数器增加 1 并移动到程序存储器的 0203。
注意 - 只有 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)中的数据与累加器相加以获得目标地址。