第二节 寻址方式
指令的一个重要组成部分是操作数,指令给出参与运算的数据的方式称为寻址方式。一、寄存器寻址
由指令指出某一个寄存器的内容作为操作数,这种寻址方式称为寄存器寻址。
寻址空间:R0~R7
A、B、C、AB、DPTR
例如指令:
INC R0
;(R0)+1→R0
其功能为对R0进行操作,使其内容加1。二、直接寻址
在指令中含有操作数的直接地址,该地址指出了参与运算或传送的数据所在的字节单元或位的地址。
直接寻址方式访问以下三种存储空间:
(1)特殊功能寄存器(特殊功能寄存器只能用直接寻址方式访问)。(2)内部数据存储器的低128字节。
(3)位地址空间。例如指令:
ANL 70H,#48H
;(70H)∧48H→70H
其功能是把内部RAM中70H单元的内容和常数48H逻辑与后,结果写入70H单元。
三、寄存器间接寻址
由指令指出某一个寄存器的内容作为操作数的地址,这种寻址方式称为寄存器间接寻址(特别应注意寄存器的内容不是操作数,而是操作数所在的存储器地址)。
寄存器间接寻址使用所选定的寄存器区中R0或R1作地址指针(对堆栈操作指令用栈指针SP)来寻址内部RAM(00~0FFH)。寄存器间接寻址也适用于访问外部扩展的数据存储器,用R0、R1或DPTR作为地址指针。寄存器间接寻址用符号@表示。
寻址空间:内部RAM(@R0、@R1、SP)
外部数据存储器(@R0、@R1、@DPTR)
例如指令:
ANL A,@R0
;(A)∧((R0))→A
其功能为R0所指出的内部RAM单元内容和累加器A的内容进行逻辑与,结果送累
加器A。
四、立即寻址
立即寻址方式中操作数包含在指令字节中,即操作数以指令字节的形式存放于程序存储器中。
例如指令:
MOV A,#70H
其功能为把常数70H传送到累加器A。五、基寄存器加变址寄存器间接寻址
这种寻址方式以16位的程序计数器PC或数据指针DPTR作为基寄存器,以8位的累加器A作为变址寄存器。基寄存器和变址寄存器的内容相加形成16位的地址,该地址即为操作数的地址。
寻址空间:程序存储器(@A+PC、@A+DPTR)
例如指令:
MOVC A,@A+PC
;((A)+(PC))→A
MOVC A,@A+DPTR
;((A)+(DPTR))→A
六、相对寻址
相对寻址方式是为实现程序的相对转移而设计的,为相对转移指令所采用。
在相对寻址的转移指令中,给出了地址偏移量(在MCS-51指令中以rel表示),把PC的当前值加上偏移量就构成了程序转移目的地址。但这里的PC当前值是指执行完该转移指令后的PC值,即转移指令的PC值加上它的字节数。因此转移的目的地址可用如下公式表示:
目的地址:转移指令地址+转移指令字节数+rel
在MCS-51指令系统中,有多条相对转移指令,这些指令多数为二字节指令,但也有个别为三字节的。偏移量rel是一个带符号的8位二进制补码数。所能表示的数的范围是-128~+127,因此相对转移是以相对转移指令所在地址为基点,向前最大可转移(127+转移指令字节数)个单元地址,向后最大可转移(128-转移指令字节数)个单元地址。
MCS51有五个存储器空间,且多数从零地址开始编址:程序存储器空间
0000H~0FFFFH
内部RAM空间
00H~0FFH
特殊功能寄存器空间
80H~0FFH
位地址空间
00H~0FFH
外部RAM/IO空间
0000H~0FFFFH
指令对哪一个存储器空间进行操作是由指令的操作码和寻址方式确定的。对程序存储器只能采用立即寻址和基寄存器加变址寄存器间接寻址方式,特殊功能寄存器只能采用直接寻址方式,不能采用寄存器间接寻址,8052/8032等单片机内部RAM的高128字节(80H~0FFH)只能采用寄存器间接寻址,不能使用直接寻址方式,位操作指令只能对位寻址区操作。外部扩展的数据存储器只能用 MOVX指令访问,而内部RAM的低128字节(00~7FH)既能用直接寻址,也能用寄存器间接寻址,操作指令最丰富。