8051寻址方式
在本节中,我们将了解8051微控制器的不同寻址方式。在8051中,存在1字节、2字节指令,以及极少数的3字节指令。操作码长度为8位。由于操作码是8位数据,因此共有256种可能性。在256种可能性中,实现了255个操作码。
时钟频率为12MHz,因此仅需1 µs即可执行64种指令类型,其余指令则需2 µs。乘法和除法运算需要4 µs才能执行。
8051共有六种寻址方式。
立即寻址方式
寄存器寻址方式
直接寻址方式
寄存器间接寻址方式
索引寻址方式
隐含寻址方式
立即寻址方式
在此立即寻址方式中,数据直接包含在指令中。数据紧跟在操作码之后。以下是一些立即寻址方式的示例。
MOVA, #0AFH; MOVR3, #45H; MOVDPTR, #FE00H;
在这些指令中,#符号用于表示立即数。在最后一条指令中,使用了DPTR。DPTR代表数据指针。使用它可以指向外部数据存储器位置。在第一条指令中,立即数为AFH,但在开头添加了一个0。因此,当数据以A到F开头时,数据前应加上0。
寄存器寻址方式
在寄存器寻址方式中,源或目标数据应位于寄存器(R0到R7)中。以下是一些寄存器寻址方式的示例。
MOVA, R5; MOVR2, #45H; MOVR0, A;
在8051中,没有像MOV R5, R7这样的指令。但是,我们可以使用指令MOV R5, 07H或MOV 05H, R7来获得相同的结果。但是,这两条指令只有在选择的寄存器组为RB0时才有效。要使用其他寄存器组并获得相同的效果,必须将该寄存器组的起始地址与寄存器编号相加。例如,如果选择了RB2,并且想要访问R5,则地址将为(10H + 05H = 15H),因此指令将如下所示:MOV 15H, R7。这里10H是寄存器组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中的半字节。