嵌入式系统 - 寻址模式
寻址模式是指如何对给定的内存位置进行寻址。有五种不同的方式或五种寻址模式来执行该指令,如下所示 -
- 立即寻址方式
- 直接寻址方式
- 寄存器直接寻址方式
- 寄存器间接寻址方式
- 变址寻址方式
立即寻址模式
让我们从一个例子开始。
MOV A, #6AH
一般来说,我们可以写,
MOV A, #data
之所以称为立即数,是因为 8 位数据立即传输到累加器(目标操作数)。
下图描述了上述指令及其执行。操作码74H保存在0202地址处。数据6AH保存在程序存储器的0203地址处。读取操作码74H后,下一个程序存储器地址的数据被传送到累加器A(E0H是累加器的地址)。由于该指令为 2 个字节,并且在一个周期内执行,因此程序计数器将加 2,并指向程序存储器的 0204。
注- 6AH 之前的“#”符号表示操作数是数据(8 位)。如果没有“#”,则将十六进制数视为地址。
直接寻址模式
这是寻址操作数的另一种方式。这里,数据(源数据)的地址作为操作数给出。让我们举个例子。
MOV A, 04H
寄存器bank#0(第四个寄存器)的地址为04H。当执行MOV指令时,寄存器04H中存储的数据被移至累加器。由于寄存器04H保存数据1FH,因此1FH被移至累加器。
注意- 与立即模式不同,我们在直接寻址模式中没有使用“#”。如果我们使用“#”,则数据值 04H 将被传输到累加器,而不是 1FH。
现在,看看下面的插图。它显示了指令如何被执行。
如上图所示,这是一条 2 字节指令,需要 1 个周期才能完成。PC 将加 2,并指向 0204。指令 MOV A 的操作码,地址为 E5H。当执行 0202 处的指令(E5H)时,累加器被激活并准备好接收数据。然后 PC 到下一个地址 0203,查找源数据(要传送到累加器)所在位置 04H 的地址。在04H,控制器找到数据1F,并将其传送到累加器,从而执行完成。
寄存器直接寻址模式
在这种寻址模式下,我们直接使用寄存器名称(作为源操作数)。让我们尝试通过一个例子来理解。
MOV A, R4
寄存器一次可以取 R0 到 R7 的值。这样的寄存器有32个。为了使用 32 个寄存器和仅 8 个变量来寻址寄存器,使用了寄存器组。有 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,并且数据 2FH 存储在地址 20H 处,则执行该指令后,值 2FH 将被传送到累加器。请参见下图。
因此MOV A, @R0的操作码是 E6H。假设选择寄存器组#0,则寄存器组#0的R0保存数据20H。程序控制移至 20H,在此处定位数据 2FH 并将 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)内部的数据与累加器相加以获得目标地址。