8051的寻址方式

在本节中,我们将看到 8051 微控制器的不同寻址模式。在 8051 中,有 1 字节、2 字节指令,很少有 3 字节指令。操作码是 8 位长。由于操作码是 8 位数据,因此有 256 种可能性。在 256 个中,实现了 255 个操作码。

时钟频率为12MHz,因此64种指令类型在1 µs内执行完毕,其余时间仅为2 µs。乘法和除法运算需要 4 µsto 来执行。

在8051中有六种寻址方式。 

  • 立即寻址模式

  • 寄存器寻址方式

  • 直接寻址方式

  • 寄存器间接寻址模式

  • 索引寻址模式

  • 隐式寻址模式

立即寻址模式

在这种立即寻址模式中,数据在指令本身中提供。在操作码之后立即提供数据。这些是立即寻址模式的一些示例。

MOVA, #0AFH;
MOVR3, #45H;
MOVDPTR, #FE00H;

在这些指令中,# 符号用于立即数。在最后一条指令中,有 DPTR。DPTR 代表数据指针。使用它,它指向外部数据存储器位置。在第一条指令中,立即数是AFH,只是在开头加了一个0。所以当数据以A到F开头时,数据前面要加0。

寄存器寻址方式

在寄存器寻址模式中,源或目标数据应存在于寄存器中(R0 到 R7)。这些是 RegisterAddressing 模式的一些示例。

MOVA, R5;
MOVR2, #45H;
MOVR0, A;

在 8051 中,没有像MOVR5, R7这样的指令。但是我们可以通过使用这条指令MOV R5, 07H或使用MOV 05H, R7得到相同的结果。但是当所选的寄存器银行是RB0时,这两个指令将起作用。要使用另一个寄存器组并获得相同的效果,我们必须将寄存器组的起始地址与寄存器号相加。例如,如果选择了 RB2,而我们要访问 R5,那么地址将是 (10H + 05H = 15H),因此指令看起来像这样MOV 15H, R7。这里 10H 是 Register Bank 2 的起始地址。

直接寻址模式

在直接寻址模式下,源地址或目的地址通过指令中的 8 位数据指定。在这种模式下只能使用内部数据存储器。这里有一些直接寻址模式的例子。

MOV80H, R6;
MOVR2, 45H;
MOVR0, 05H;

第一条指令将寄存器R6的内容发送到端口P0(端口0的地址为80H)。第二个是忘记从 45H 到 R2 的内容。第三个用于从寄存器R5(选择寄存器组RB0时)获取数据到寄存器R5。

寄存器间接寻址方式

在这种模式下,源地址或目标地址在寄存器中给出。通过使用寄存器间接寻址方式,可以访问内部或外部地址。R0 和 R1 用于 8 位地址,DPTR 用于 16 位地址,没有其他寄存器可用于寻址目的。让我们看看这种模式的一些例子。

MOV0E5H, @R0;
MOV@R1, 80H

在指令中,@符号用于寄存器间接寻址。在第一条指令中,它显示使用了 R0 寄存器。如果 R0 的内容为 40H,则该指令将取内部 RAM 的 40H 位置的数据。在第二个中,如果R1的内容是30H,则表示P0端口的内容将存储在内部RAM的30H位置。

MOVXA, @R1;
MOV@DPTR, A;

在这两条指令中,MOVX 中的 X 表示外部数据存储器。外部数据存储器只能以寄存器间接模式访问。在第一条指令中,如果 R0 持有 40H,那么 A 将获取外部 RAM 位置 40H 的内容。而在第二个中,A的内容在DPTR指向的位置被覆盖。

索引寻址方式

在变址寻址模式下,只能从程序存储器访问源存储器。目标操作数始终是寄存器 A。这些是变址寻址模式的一些示例。

MOVCA, @A+PC;
MOVCA, @A+DPTR;

MOVC 指令中的 C 指的是代码字节。对于第一条指令,让我们考虑 A 持有 30H。而PC值为1125H。程序存储单元 1155H (30H + 1125H) 的内容被移动到寄存器 A。

隐式寻址模式

在隐式寻址模式下,将有一个操作数。这些类型的指令只能在特定的寄存器上工作。这些类型的指令也称为寄存器特定指令。以下是隐式寻址模式的一些示例。

RLA;
SWAPA;

这些是 1 字节指令。第一个用于将 A 寄存器内容向左旋转。第二个用于交换 A 中的半字节。