3.2 MCS-51的寻址方式
寻址方式就是寻找操作数地址的方式。在用汇编语言编程时,数据的存放、传送、运算都要通过指令来完成。编程者必须自始至终都要十分清楚操作数的位置,以及如何将它们传送到适当的寄存器中去参与运算。寻址方式的多少是反映指令系统优劣的主要指标之一。
MCS-51系列单片机的寻址方式主要有7种:寄存器寻址、直接寻址、寄存器间接寻址、立即寻址、变址寻址、位寻址和相对寻址。
1.寄存寻址方式
寄存器寻址就是操作数在寄存器中,指定了寄存器就能得到操作数。在寄存器寻址方式的指令中以符号名称来表示寄存器。
【例3-6】
MOV A,R7
其功能是把寄存器R7中的操作数传送到累加器A中。由于操作数在R7中,因此在指令中指定了R7,就能从中取得操作数。
● 寄存器寻址的主要对象是通用寄存器,通用寄存器共有4组,每组8个共32个,寄存器寻址只能使用当前寄存器组。因此,指令中的寄存器名称只能是R0~R7。在使用本指令前,有时需通过对PSW中RS1、RS0位的状态设置,来进行当前寄存器组的选择。
● 部分专用寄存器,如累加器A、AB寄存器及数据指针DPTR等。
2.直接寻址方式
在指令中直接给出操作数的地址,这是直接寻址方式。在直接寻址方式中,指令的操作数部分就是操作数的地址。在MCS-51单片机指令系统中,直接寻址方式中可以访问3种存储器空间。
① 内部数据存储器的低128B的单元(00H~7FH)。
② 特殊功能寄存器。特殊功能寄存器只能用直接寻址方式进行访问。
③ 位地址空间。
【例3-7】
MOV A,30H
其功能是把片内RAM中30H单元的数据传送给累加器A。
3.寄存器间接寻址方式
在这种寻址方式中,寄存器的内容为操作数的地址。寄存器间接寻址只能使用寄存器R0、R1作为地址指针,寻址片内RAM区的数据;当访问片外RAM时,可使用R0、R1以及DPTR作为地址指针。寄存器间接寻址符号为“@”。
【例3-8】 已知R0的值为30H,则指令为
MOV A,@R0
其功能是把以R0的值为地址的存储单元的值送入累加器A中,即把30H单元的值送入累加器A中。寄存器间接寻址示意图如图3-1所示。
图3-1 寄存器间接寻址示意图
MCS-51系列单片机规定,只有工作寄存器R0与R1可用于寄存器间接寻址,并且规定对片内RAM间接寻址用MOV指令,对片外RAM间接寻址用MOV×指令。
在单片机系列扩展中,片外RAM的地址可以是8位,也可以是16 位。若是8 位,使用R0 和R1 间接寻址,如“MOV× A,@R0”;若是16位,则用数据指针DPTR间接寻址,如“MOV× A,@DPTR”。
4.立即寻址方式
立即寻址方式是指操作数包含在指令字节中。跟在指令操作码后面的数就是参加运算的数,该操作数称为立即数,书写时前面要加“#”。立即数有一字节和二字节两种可能。
【例3-9】
MOV A,#3AH MOV DPTR,#0DFFFH
上述两条指令均为立即寻址方式,第一条指令的功能是将立即数3AH送到累加器A中,第二条指令的功能是将立即数0DFFFH送到数据指针DPTR中(0DFH→DPH,0FFH→DPL)。
5.变址寻址方式
变址寻址方式用于访问程序存储器中的数据表格,它以基址寄存器DPTR或PC的内容为基本地址,加上变址寄存器A的内容作为操作数的地址,常有如下3种指令。
MOVC A,@A+DPTR JMP @A+DPTR MOVC A,@A+PC
【例3-10】
MOVC A,@A+DPTR
该指令是把累加器和DPTR中的内容相加作为操作数在程序存储器中的单元地址,再将该单元的值送入累加器。其变址寻址示意图如图3-2所示。执行该条指令前A的值为A4H,DPTR为1234H,则A+DPTR的值为12D8H。执行该条指令后,则把以12D8H地址单元的内容3FH送给A,最终A的值变为3FH。
图3-2 变址寻址示意图
6.位寻址方式
位寻址方式是指对片内RAM的位寻址区和某些可位寻址的特殊功能寄存器进行位操作的寻址方式。MCS-51系列单片机具有位寻址的功能,即指令中直接给出位地址,可以对片内数据存储器RAM中的128位和特殊寄存器SFR中的93位进行寻址,并且位操作指令可对地址空间的每一位进行传送及逻辑操作。
【例3-11】
SETB PSW.3 ;PSW.3←1
该指令的功能是给程序状态字PSW中的RS0置1。该指令为双字节指令,指令的第二字节直接给出位地址D3H(PSW.3的位地址)。
需要指出的是,位地址与直接寻址中的字节地址形式相同,主要由操作码来区别。
【例3-12】
MOV C,3AH ;把3AH位的状态送位累加器C
7.相对寻址方式
在MCS-51指令系统中设有转移指令,分为直接转移指令和相对转移指令,在相对转移指令中采用相对寻址方式。相对寻址方式是把PC的当前值加上指令中给出的偏移量rel,所得结果作为转移的目的地址。它用于访问程序存储器,常出现在相对转移指令中。
在使用相对寻址时要注意以下两点。
① 当前PC值是指相对转移指令所在地址(一般称为源地址)加上转移指令字节数,即当前PC值=源地址+转移指令字节数。例如,“JZ rel”是一条累加器A的值为零就转移的双字节指令,若该指令地址(源地址)为2050H,则执行该指令时的当前PC值即为2052H。
② 偏移量rel是有符号的单字节数,以补码表示,其相对值的范围是-128~+127(即00H~FFH),负数表示从当前地址向上转移,正数表示从当前地址向下转移。所以,相对转移指令满足条件后,转移的地址(一般称为目的地址)应为目的地址=当前PC值+rel=源地址+转移指令字节数+rel。
【例3-13】
JZ 08H JZ 0F4H
以【例3-13】的第一条指令为例,若该条指令在程序存储器中的源地址为2050H,而该条指令为双字节指令,则当前PC值=2050H+2=2052H,执行该指令后的目的地址=2052H+08H=205AH,则从源地址向下转移了10个单元。第二条指令也如此,只是偏移量为负数,所以从源地址向上转移10个单元,使PC值变为2046H。
图3-3 相对寻址示意图
MCS-51系列单片机的指令对哪一个存储器空间进行操作,是由指令的操作码和寻址方式确定的。对程序存储器只能采用立即寻址方式和变址寻址方式,特殊功能寄存器只能采用直接寻址方式,不能采用寄存器间接寻址方式。52系列单片机片内RAM的高128B(80H~0FFH)只能采用寄存器间接寻址方式,不能采用直接寻址方式,位寻址区中的可寻址位只能采用直接寻址方式。外部扩展的数据寄存器只能用寄存器间接寻址方式,而片内RAM的低128B(00~7FH)既能用直接寻址方式,也能用寄存器间接寻址方式,操作指令最丰富。表3-1概括了每一种寻址方式可以存取的存储器空间。
表3-1 寻址方式及相关的存储器空间