2.4.3 寻址方式
所谓寻址方式,通常是指寻找操作数的方法,或者说通过什么方式找到操作数。寻址方式是否灵活方便是衡量一个指令系统好坏的重要指标。MCS-51单片机有立即寻址、寄存器寻址、寄存器间接寻址、直接寻址、基址加变址寻址、相对寻址、位寻址7种寻址方式。
1.立即寻址
立即寻址方式(也称立即数寻址)是直接在指令中给出操作数。出现在指令中的操作数也称立即数。为了与直接地址加以区别,需要在操作数前面加前缀标志“#”。例如,指令表示把立即数05H送给A。该指令是双字节,第一个字节是操作码,第二个字节是立即数本身。因此,立即数就是放在程序存储器内的常数。
2.寄存器寻址
寄存器寻址方式就是指令中的操作数为某一寄存器的内容。
例如,指令
的功能是把寄存器R0的内容传送到累加器A中,若R0的内容为30 H,则执行该指令后A的内容也为30 H,如图2-16所示。
图2-16 执行指令MOV A,R0的示意图
可用于寄存器寻址的寄存器有:
(1)4组通用工作寄存器区(共有32个工作寄存器)。但是它只对当前工作寄存器区的8个工作寄存器寻址,因此指令中的寄存器名称只能是R0~R7。
(2)部分特殊功能寄存器。它包括累加器A、寄存器B、数据指针寄存器(DPTR)等。
3.寄存器间接寻址
前面所述的寄存器寻址是在寄存器中存放的是操作数,而寄存器间接寻址方式在寄存器中存放的是操作数的地址,即先从寄存器中找到操作数的地址,再按该地址找到操作数。由于操作数是通过寄存器间接得到的,因此称为寄存器间接寻址。
为了区别寄存器寻址和寄存器间接寻址,在寄存器间接寻址方式中,应在寄存器名称前面加前缀标志“@”,如指令
其中,R0的内容为30H,即从R0中找到源操作数所在单元的地址30H,然后把内部RAM中30H地址单元的内容5AH传送到累加器A中,如图2-17所示。
图2-17 执行指令MOV A,@R0的示意图
4.直接寻址
在这种寻址方式中,指令中直接给出操作数的单元地址,该单元地址中的内容就是操作数直接的操作数单元地址,用“direct”表示。例如,对于指令
指令中的“direct”就是操作数的单元地址。
例如,指令
表示把内部RAM 50H单元的内容传送到累加器A。指令中源操作数采用的是直接寻址方式。
例如,对于指令
它的目的操作数和源操作数都是以直接地址的形式给出的。
5.基址加变址寻址
这种寻址方式是以DPTR或者PC的内容作为基地址,然后在这个基地址的基础上加上累加器A中的地址偏移量,形成真正的操作数地址。在MCS-51单片机中,用基址加变址寻址方式只能访问程序存储器,访问的范围为64 KB。当然,这种访问只能从ROM中读出数据,而不能写入。例如,对于指令
A的原有内容为03H,DPTR的内容为1000H,该指令访问的结果是把ROM中1003H单元的内容传送给累加器A。
该寻址方式指令只有3条:
前两条指令用来读取程序存储器中的数据(查表指令),如读取建立在程序存储器中的常数和表格。第三条指令为散转指令,执行该指令时可根据累加器A中的不同内容,来实现不同程序入口的跳转。
6.相对寻址
相对寻址只出现在相对转移指令中。相对转移指令执行时,是以当前的PC值加上指令中规定的偏移量rel而形成实际的转移地址。这里所说的PC值是执行完相对转移指令后的PC值。一般将相对转移指令操作码所在地址称为源地址,转移后的地址称为目的地址。于是有:
目的地址=源地址+相对转移指令字节数+rel
其中,偏移量rel是单字节的、带符号的8位二进制补码数。它所能表示的数的范围是—128~+127。因此,程序转移的范围是以转移指令的下一条指令首地址为基准地址,相对偏移在—128~+127单元之间。
7.位寻址
采用位寻址方式的指令操作数是8位二进制数中的某一位。指令中给出的是位地址,即片内RAM某一单元中的一位。位地址在指令中用bit表示,如SETB bit。
MCS-51单片机片内有两个区域可以位寻址:一个是RAM中20H~2FH的16个单元共128位的位地址(00H~7FH);另一个是特殊功能寄存器区中可以直接位寻址的寄存器。
MCS-51单片机具有位处理功能,可直接对数据位实现置1、清0、取反、传送、判跳转和逻辑运算等操作,这为测控系统的应用提供了最佳代码和速度,提高了实时性。