嵌入式系统 - 寻址模式
寻址模式是指如何寻址给定的内存位置。执行该指令有五种不同的方法或五种寻址模式,如下所示 −
- 立即寻址模式
- 直接寻址模式
- 寄存器直接寻址模式
- 寄存器间接寻址模式
- 索引寻址模式
立即寻址模式
让我们从一个例子开始。
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 的操作码,地址为 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) 内的数据与累加器相加以获得目标地址。