2.2 寻址方式
从指令格式知道,指令的重要组成部分是操作数,指出了参与操作的数据或数据的地址。寻找操作数地址的方式称为寻址方式。一条指令采用什么样的寻址方式,是由指令的功能决定的,寻址方式越多,指令功能就越强。
MCS-51指令系统共使用了7种寻址方式,包括寄存器寻址、直接寻址、立即数寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。
1.立即数寻址
在这种寻址方式中,指令多是双字节的。立即数寻址是指将操作数直接写在指令中。例如:指令MOV A,#3AH执行的操作是将立即数3AH送到累加器A中,该指令就是立即数寻址。注意:立即数前面必须加“#”号,以区别立即数和直接地址。该指令的执行过程如图2-1所示。
图2-1 立即数寻址示意图
2.直接寻址
在这种寻址方式中,把存放操作数的内存单元的地址直接写在指令中。在MCS-51单片机中,可以直接寻址的存储器主要有内部RAM区和特殊功能寄存器SFR区。例如:指令MOV A,3AH执行的操作是将内部RAM中地址为3AH的单元内容传送到累加器A中,其操作数3AH就是存放数据的单元地址,因此该指令是直接寻址。设内部RAM 3AH单元的内容是88H,那么指令MOV A,3AH的执行过程如图2-2所示。
图2-2 直接寻址示意图
3.寄存器寻址
寄存器寻址是指将操作数存放于寄存器中,寄存器包括工作寄存器R0~R7、累加器A、通用寄存器B、地址寄存器DPTR等。例如:指令MOV R1,A的操作是把累加器A中的数据传送到寄存器R1中,其操作数存放在累加器A中,所以寻址方式为寄存器寻址。
如果程序状态寄存器PSW的RS1RS0=01(选中第二组工作寄存器,对应地址为08H~0FH),设累加器A的内容为20H,则执行MOV R1,A指令后,内部RAM 09H单元的值就变为20H,如图2-3所示。
图2-3 寄存器寻址示意图
4.寄存器间接寻址
在这种寻址方式中,操作数所指定的寄存器中存放的不是操作数本身,而是操作数地址,这种寻址方式用于访问片内数据存储器或片外数据存储器。
在MCS-51指令系统中,用于寄存器间接寻址的寄存器有R0、R1和DPTR,称为寄存器间接寻址寄存器。注意:间接寻址寄存器前面必须加上符号“@”。
例如:指令MOV A,@R0执行的操作是将R0的内容作为内部RAM的地址,再将该地址单元中的内容取出来送到累加器A中。
设R0=3AH,内部RAM 3AH中的值是65H,则指令MOV A,@R0的执行结果是累加器A的值为65H,该指令的执行过程如图2-4所示。
5.变址寻址
在这种寻址方式中,是将基址寄存器与变址寄存器的内容相加,结果作为操作数的地址。DPTR或PC是基址寄存器,累加器A是变址寄存器。该类寻址方式主要用于查表操作。例如:指令MOVC A,@A+DPTR执行的操作是将累加器A和基址寄存器DPTR的内容相加,相加结果作为操作数存放的地址,再将操作数取出来送到累加器A中。
设累加器A=02H,DPTR=0300H,外部ROM(0302H)=55H,则指令MOVC A,@A+DPTR的执行结果是累加器A的内容为55H。该指令的执行过程如图2-5所示。
图2-4 寄存器间接寻址示意图
图2-5 变址寻址示意图
6.相对寻址
相对寻址是指程序计数器PC的当前内容与指令第二字节所给出的数相加,其结果作为跳转指令的转移地址(也称目的地址)。该类寻址方式主要用于跳转指令。
例如:JC rel
这条指令表示若进位C=0,则不跳转,程序继续向下执行;若进位C=1,则以PC中的当前值为基地址,加上偏移量rel后所得到的结果为该转移指令的目的地址。
现假设该指令存放于0100H、0101H单元,且rel=30H,若(C)=1,因PC当前值(下一条指令的地址)为0102H,故执行完该指令后,程序转向(PC)+30H=0132H地址执行。0132H地址称为目的地址,0100H称为源地址。该指令执行过程如图2-6所示。
图2-6 相对寻址示意图
在实际工作中,有时需根据已知的源地址和目的地址计算偏移量rel。现以两字节相对转移指令为例,讨论偏移量rel的计算。
正向跳转时:
rel=目的地址-源地址-2=地址差-2
反向跳转时,目的地址小于源地址,rel用负数的补码表示:
7.位寻址
位寻址是指按位进行的操作,MCS-51单片机中,操作数不仅可以按字节为单位进行操作,也可以按位进行操作。当我们把某一位作为操作数时,这个操作数的地址称为位地址。而上述介绍的指令都是按字节进行的操作。
位寻址区包括专门安排在内部RAM中的两个区域:一是内部RAM的位寻址区,地址范围是20H~2FH,共16个RAM单元,位地址为00H~7FH;二是特殊功能寄存器SFR中有11个寄存器可以位寻址。
例如:指令SETB 3DH执行的操作是将内部RAM位寻址区中的3DH位置1。
设内部RAM 27H单元原来的内容是00H,执行SETB 3DH后,由于3DH对应着内部RAM 27H的第6位,因此该位变为1,也就是27H单元的内容变为20H。该指令的执行过程如图2-7所示。
图2-7 位寻址示意图