单片机原理及应用教程(第4版)
上QQ阅读APP看书,第一时间看更新

3.2 寻址方式

所谓寻址方式就是寻找或获得操作数的方式。

指令的一个重要组成部分是操作数。指令中的操作数必须由寻址方式来指定参与运算的操作数或操作数所在单元的地址。

寻址方式是指令系统中最重要的内容之一,寻址方式越多样,则计算机的功能越强,编程灵活性越强。寻址方式的一个重要问题是:如何在整个存储范围内,灵活、方便地找到所需要的数据单元。51单片机因它特有的存储器地址空间,设计了以下7种寻址方式。

1.立即寻址

在立即寻址方式中,操作数直接出现在指令中。操作数前加“#”号表示,也称立即数。指令的操作数可以是8位或16位数。

源操作数立即寻址指令示例:

指令执行结果:(A)=26H,即把立即数26H直接送到A中。

指令执行结果:(DPTR)=2000H。DPTR是数据存储器地址指针,由两个特殊功能寄存器DPH和DPL组成。立即数的高8位送DPH,低8位送DPL,所以,(DPH)=20H,(DPL)=00H。

在立即寻址方式中,立即数作为指令的一部分同指令一起放在程序存储器中。

2.直接寻址

在直接寻址方式中,操作数所在的存储单元地址直接出现在指令中,这一寻址方式可进行内部存储单元的访问。它包括特殊功能寄存器地址空间和内部RAM的低128字节存储单元。

(1)特殊功能寄存器地址空间的直接寻址

在指令中使用特殊功能寄存器符号表示数据的存储地址,这也是唯一可寻址特殊功能寄存器(SFR)的寻址方式。

源操作数直接寻址指令示例:

指令执行结果:源操作数地址为E0H单元(累加器A)的内容传送给寄存器TCON。

指令执行结果:源操作数P1的内容传送给A。

其中,TCON、P1是特殊功能寄存器SFR,其对应的直接地址是88H和90H。

注意:P0口的直接地址是80H,指令MOV A,P0与MOV A,80H是等价的。

(2)内部RAM的低128B单元的直接寻址

源操作数直接寻址指令示例:

指令执行结果:内部RAM地址为76H单元的内容传送给A。

指令执行结果:A的内容与内部RAM地址为43H单元的内容相加的和传送给A。

3.寄存器寻址

在寄存器寻址方式中,寄存器中的内容就是操作数。

源操作数寄存器寻址指令示例:

指令执行结果:把寄存器R1中的内容送到累加器A中。若R1中存放的操作数为3CH,则指令执行的结果是(A)=3CH。

寄存器寻址方式可用于访问的寄存器有如下几种。

1)当前工作寄存器Rn(n=0~7,机器语言的低3位指明所用的寄存器)。

2)累加器A[隐含在机器语言操作码中(下同)]。

3)寄存器B(以AB寄存器成对出现)。

4)位累加器C。

5)数据指针DPTR。

需要说明,指令中对累加器的操作,使用“A”和“ACC”其执行结果是一样的。但使用“ACC”属于直接寻址,使用“A”则属于寄存器寻址(因为“A”不表示累加器的地址,而是累加器的代号)。

4.寄存器间接寻址

在寄存器间接寻址方式中,指定寄存器中的内容是操作数的地址,该地址对应存储单元的内容才是操作数。可见,这种寻址方式中寄存器实际上是地址指针。寄存器名前用间址符“@”表示寄存器间接寻址。该方式可用于编程时操作数单元地址并不明确、在汇编时才能明确的场合。

对外部RAM进行读取操作时,必须采用寄存器间接寻址方式。

例如,操作数45H存放在内部RAM的3FH单元中,地址信息3FH存放在R0寄存器中,则执行以下指令。

其功能是将R0所指的3FH单元中内容45H送A中,执行结果:(A)=45H。

寄存器间接寻址使用方法的规定如下。

1)访问内部数据存储器时,用当前工作寄存器R0和R1进行间接寻址,即@R0、@R1,在堆栈操作中则用堆栈指针SP作间址。

例如,源操作数寄存器间接寻址访问内部数据存储器指令示例:

2)访问外部数据存储器时,0页内256单元(0000H~00FFH)用R0和R1工作寄存器进行间接寻址。使用16位数据指针寄存器DPTR进行间址寻址时,可以访问全部64KB(0000H~FFFFH)地址空间的任一单元。

例如,源操作数寄存器间接寻址访问外部数据存储器指令示例:

5.变址寻址

变址寻址方式是以程序指针PC或数据指针DPTR为基址寄存器,以累加器A作为变址寄存器(地址偏移量),两者内容相加形成16位的操作数地址,变址寻址方式主要用于访问固化在程序存储器中的某个字节。

变址寻址方式有以下两类。

1)用程序指针PC作基地址,A作变址,形成操作数地址:@A+PC。

例如,执行下列指令:

当执行到MOVC A,@A+PC时,当前PC=2103H,A=06H,因此@A+PC指示的地址是2109H,该指令的执行结果是(A)=32H。

2)用数据指针DPTR作基地址,A作变址,形成操作数地址:@A+DPTR。

例如,执行下列指令:

程序中,变址偏移量(A)=01H,基地址为表的首地址TABLE,指令执行后将地址为TABLE+01H程序存储器单元的内容传送给A,所以执行结果是(A)=42H。

6.相对寻址

相对寻址是以程序计数器PC的当前值作为基地址,与指令中的第二字节给出的相对偏移量rel进行相加,所得和为程序的转移地址。

这种寻址方式用在相对转移指令中。相对偏移量rel是一个用补码表示的8位有符号数,程序的转移范围在相对PC当前值的+127~-128B之间。

例如,相对寻址转移指令示例:

设PC=2000H为本指令的地址,则PC的当前值为2002H,转移目标地址为

例如,相对寻址条件转移指令示例:

这是一个零跳转指令,是双字节指令。

指令执行完后,PC当前值为该指令首字节所在单元地址+2,所以,

目的地址=当前PC的值+rel

在程序中,目的地址常以标号表示,在汇编时由汇编程序将标号汇编为相对偏移量,但标号的位置必须保证程序的转移范围在相对PC当前值的+127~-128B之间。

例如,以标号表示的相对寻址转移指令:

7.位寻址

51单片机中有独立的性能优越的布尔处理器,包括位变量操作运算器、位累加器(C符号表示,与累加器是不同的)和位存储器,可对位地址空间的每个位进行位变量传送、状态控制、逻辑运算等操作。

位地址包括:内部RAM地址空间的可进行位寻址的128位和SFR地址空间的可位寻址的11个8位寄存器的88位。位寻址给出的是直接地址。

例如,位直接地址指令示例:

07H是内部RAM的位地址空间的1个位地址,该指令的功能是将07H内的位操作数送位累加器C中。若(07H)=1,则指令执行结果C=1。

再如,以符号表示的位直接地址指令示例:

EX0是IE寄存器的第0位,相应位地址是A8H,指令的功能是将EX0位置1,指令执行的结果是EX0=1。

若需要对累加器进行位寻址时,必须使用ACC。例如,ACC.7表示累加器的第7位,而不能写成A.7。

由以上7种寻址方式可以看出,不同的寻址方式所寻址的存储空间是不同的。正确地使用寻址方式不仅取决于寻址方式的形式,而且取决于寻址方式所对应的存储空间。例如,位寻址的存储空间只能是片内RAM的20H~2FH字节地址中的所有位(位地址为00H~7FH)和部分SFR的位,决不能是该范围之外的任何单元的任何位。

51单片机的7种寻址方式与所涉及的存储器空间对应关系如下。

1)立即寻址:立即数在程序存储器ROM中。

2)直接寻址:操作数的地址在指令中,操作数在片内RAM低128B和专用寄存器SFR。

3)寄存器寻址:操作数在工作寄存器R0~R7,A,B,Cy,DPTR。

4)寄存器间接寻址:操作数的地址在指令中,操作数在片内RAM低128B[以@R0、@R1、SP(仅对PUSH、POP指令)形式寻址]、片外RAM(以@R0、@R1、@DPTR形式寻址)。

5)基址加变址寻址:操作数在程序存储器ROM。

6)相对寻址:操作数在程序存储器-128~+127B范围内。

7)位寻址:操作数为片内RAM的20H~2FH字节地址中的所有位(位地址为00H~7FH)和部分SFR的位。