Embedded Systems 简明教程

Embedded Systems - Addressing Modes

addressing mode 表示如何寻址给定的存储器位置。有五种不同的方式或五种寻址模式可用于执行此指令,如下所示 −

  1. Immediate addressing mode

  2. Direct addressing mode

  3. Register direct addressing mode

  4. Register indirect addressing mode

  5. Indexed addressing mode

Immediate Addressing Mode

让我们从一个示例开始。

MOV A, #6AH

一般而言,我们可以编写,

MOV A, #data

它被称为 immediate ,因为 8 位数据即刻传输到累加器(目标操作数)。

以下插图描述了上述指令及其执行。操作码 74H 保存于 0202 地址。数据 6AH 保存于程序存储器中的 0203 地址。在读取操作码 74H 后,下一个程序存储器地址中的数据将传输到累加器 A(E0H 是累加器的地址)。由于该指令为 2 字节并且在一个周期内执行,程序计数器将递增 2,并将指向程序存储器的 0204。

immidiate addressing mode

Note' symbol before 6AH indicates that the operand is a data (8 bit). In the absence of ' ,十六进制数字将作为地址。

Direct Addressing Mode

这是另一种寻址操作数的方式。在此,数据地址(源数据)提供为操作数。让我们举个例子。

MOV A, 04H

寄存器库#0(第 4 个寄存器)的地址为 04H。当执行 MOV 指令时,存储于寄存器 04H 中的数据将移动到累加器。由于寄存器 04H 保存数据 1FH,因此 1FH 移动到累加器。

Note − 我们未使用 ' in direct addressing mode, unlike immediate mode. If we had used ' ,数据值 04H 会传输到累加器,而不是 1FH。

现在,看一看以下插图。它显示了指令如何执行。

direct addressing mode

如上图所示,这是一条 2 字节指令,需要 1 个周期才能完成。PC 将递增 2,并将指向 0204。指令 MOV A, address 的操作码为 E5H。当执行 0202 处的指令(E5H)时,累加器激活并准备接收数据。然后 PC 转到下一个地址 0203 并查找位置 04H 的地址,即源数据(传送到累加器)所在的位置。在 04H 处,控制找到数据 1F 并将其传输到累加器,因此完成执行。

Register Direct Addressing Mode

在此寻址模式中,我们直接使用寄存器名称(作为源操作数)。让我们尝试在示例中进行理解。

MOV A, R4

一次,寄存器可以获取从 R0 到 R7 的值。有 32 个这样的寄存器。为了使用 32 个寄存器仅使用 8 个变量来寻址寄存器,使用寄存器库。有 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 用于选取寄存器库。

现在,看一看以下插图,从而清晰了解它是如何工作的。

register direct mode

操作码 EC 用于 MOV A,R4。操作码存储于地址 0202 处,当执行它时,控制直接转到所选 PSW 中的寄存器库的 R4(即 PSW 中选择的)。如果选取寄存器库#0,则寄存器库#0 的 R4 中的数据将移动到累加器。此处 2F 存储于 04H。04H 表示寄存器库#0 的 R4 的地址。

数据(2F)移动以粗体突出显示。2F 从数据存储器位置 0CH 传输到累加器,并显示为虚线。0CH 是寄存器库#1 的寄存器 4(R4)的地址位置。上述指令为 1 字节,需要 1 个周期才能完全执行。这意味着,你可以使用寄存器直接寻址模式来保存程序存储器。

Register Indirect Addressing Mode

在此寻址模式中,数据地址存储于操作数中的寄存器内。

MOV A, @R0

此处 R0 中的值被视为地址,其中包含要传输到累加器的值。 Example : 如果 R0 的值为 20H,并且数据 2FH 存储在地址 20H 中,那么在执行此指令后,值 2FH 将传输到累加器中。请参见以下说明:

register indirect mode

因此 MOV A, @R0 的操作码为 E6H。假设选择了寄存器组 #0,则寄存器组 #0 的 R0 保存数据 20H。程序控制移动到 20H,它在其中找到数据 2FH 并将其传输到 2FH,累加器。这是一条 1 字节指令,程序计数器递增 1 并且移动到程序存储器的 0203。

Note - 仅允许 R0 和 R1 形成寄存器间接寻址指令。换句话说,程序员可以使用 @R0 或 @R1 创建指令。所有寄存器组均被允许。

Indexed Addressing Mode

我们将举两个示例以理解索引寻址模式的概念。请看以下说明:

MOVC A, @A+DPTR

MOVC A, @A+PC

其中 DPTR 是数据指针,PC 是程序计数器(两者都是 16 位寄存器)。考虑第一个示例。

MOVC A, @A+DPTR

源操作数为 @A+DPTR。它包含此位置的源数据。在这里,我们正在将 DPTR 的内容与累加器的当前内容相加。此加法将给出一个新地址,该地址是源数据的地址。然后将此地址指出的数据传输到累加器。

indexed mode

操作码为 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)中的数据与累加器相加以获得目标地址。