
2.1 寻址方式
所谓寻址方式,通常是指某一个CPU指令系统中规定的寻找操作数所在地址的方式,或者说通过什么方式找到操作数。寻址方式的方便与快捷是衡量CPU性能的一个重要方面,MCS-51单片机有七种寻找方式。
1.立即数寻址
立即寻址方式是操作数包括在指令字节中,指令操作码后面字节的内容就是操作数本身,其数值由程序员在编制程序时指定,以指令字节的形式存放在程序存储器中。立即数只能作为源操作数,不能当作目的操作数。
例如:

立即寻址示意图如图2-1所示。

图2-1 立即寻址示意图
a)MOV A, #52H b)MOV DPTR, #5678H
2.直接寻址
在指令中含有操作数的直接地址,该地址指出了参与操作的数据所在的字节地址或位地址。
例如:

在MCS-51单片机指令系统中,直接寻址方式可以访问2种存储空间,如图2-2所示:

图2-2 直接寻址方式示意图
1)内部数据存储器的低128B单元(00H~7FH)
2)80H~FFH中的(SFR)特殊功能寄存器。
这里要注意,指令MOV A,#52H与MOV A,52H的区别,后者表示把片内RAM字节地址为52H单元的内容传送到累加器(A)中。
3.寄存器寻址
由指令指出某一个寄存器中的内容作为操作数,这种寻址方式称为寄存器寻址。寄存器一般指累加器A和工作寄存器R0~R7。例如:


寄存器寻址方式的寻址范围包括:
● 寄存器寻址的主要对象是通用寄存器,共有4组32个通用寄存器,但寄存器寻址只能使用当前寄存器组。因此指令中的寄存器名称只能是R0~R7。在使用本指令前,需通过对PSW中RS1、RS0位的状态进行设置,来选择当前寄存器组。
● 部分专用寄存器。累加器A、寄存器B以及数据指针DPTR等。
4.寄存器间接寻址方式
由指令指出某一个寄存器的内容作为操作数,这种寻址方式称为寄存器间接寻址。这里要注意,在寄存器间接寻址方式中,存放在寄存器中的内容不是操作数,而是操作数所在的存储器单元地址。
寄存器间接寻址只能使用寄存器R0或R1作为地址指针,来寻址内部RAM(00H~FFH)中的数据。寄存器间接寻址也适用于访问外部RAM,可使用R0、R1或DPTR作为地址指针。寄存器间接寻址用符号“@”表示。例如:

指令功能是把R0或R1所指出的内部RAM地址60H单元中的内容送累加器A。假定(60H)=3BH,则指令的功能是将3BH这个数送到累加器A。
例如:

指令功能是把DPTR寄存器所指的那个外部数据存储器(RAM)的内容传送给A,假设(3456H)=99H,指令运行后(A)=99H。
同样,指令MOVX @DPTR,A;MOV @R1,A;也都属于寄存器间接寻址方式。寄存器间接寻址方式的示意图如图2-3所示。

图2-3 寄存器间接寻址方式示意图
5.位寻址
MCS-51单片机中设有独立的位处理器。位操作指令能对内部RAM中的位寻址区(20H~2FH)和某些有位地址的特殊功能寄存器进行位操作。也就是说可对位地址空间的每个位进行位状态传送、状态控制和逻辑运算操作。例如:

6.基址寄存器加变址寄存器间接寻址
这种寻址方式用于访问程序存储器中的数据表格,它以基址寄存器(DPTR或PC)的内容为基本地址,加上变址寄存器A的内容形成16位的地址,访问程序存储器中的数据表格。例如:

这种寻址方式的示意图如图2-4所示。

图2-4 变址寻址方式示意图
7.相对寻址
相对寻址以程序计数器(PC)的当前值作为基地址,与指令中给出的相对偏移量rel进行相加,把所得之和作为程序的转移地址。这种寻址方式用于相对转移指令中,指令中的相对偏移量是一个8位带符号数,用补码表示。该值可正可负,转移的范围为-128~+127。使用中应注意rel的范围不要超出。例如:
