首页 理论教育7种MCS-51单片机寻址方式及其应用

7种MCS-51单片机寻址方式及其应用

【摘要】:MCS-51单片机共有7种寻址方式,即立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。了解寻址方式是正确理解和使用指令的前提。1.立即寻址立即寻址是指在指令中直接给出操作数的寻址方式。具体来说,直接寻址方式访问以下存储空间。第二条指令是将立即数85H传送至专用寄存器IE,其目的操作数的寻址方式是直接寻址。图3-6寄存器间接寻址示意图同样采用“MOVX”类寄存器间接寻址方式操作片外RAM的指令。

MCS-51单片机指令系统具有功能强、指令短、执行快等特点。MCS-51单片机指令系统共有42种操作助记符,代表了33种操作功能,操作助记符与操作数的各种寻址组合共构造111条指令,同一种指令所对应的操作码最多可至8种(如指令中Rn对应的寄存器可以是R0~R7),操作码共有255种。

MCS-51单片机共有7种寻址方式,即立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址(基址寄存器加变址寄存器间接寻址)、相对寻址和位寻址。了解寻址方式是正确理解和使用指令的前提。

1.立即寻址

立即寻址是指在指令中直接给出操作数的寻址方式。指令中的操作数也称为立即数,其标志为前面加“#”,以区别直接寻址。立即数通常采用8位二进制数#data,例如:

假定立即数是30H,则指令为

指令代码为74H 30H。

除了8位立即数外,指令系统中还有一条立即数为#data16的指令。该指令为

假定立即数为1234H,则指令为

指令代码为90H 12H 34H。立即寻址示意图如图3-3所示。

图3-3 立即寻址示意图

2.直接寻址

直接寻址是指在指令中直接给出操作数的单元地址的寻址方式。在MCS-51指令系统中,直接寻址方式可以访问内部RAM的低128个单元及所有的专用寄存器。具体来说,直接寻址方式访问以下存储空间。

1)专用寄存器。专用寄存器只能用直接寻址方式访问,既可以使用它们的地址,也可以使用它们的名称,专用寄存器的名称同时也是符号化的地址。

2)片内数据存储器的低128个字节。需要注意的是,对于52子系列单片机,其内部数据存储器高128字节(80H~0FFH)不能直接寻址,必须使用寄存器间接寻址方式。

由于52子系列单片机的片内RAM有256个字节,其高128个字节与专用寄存器(SFR)的地址是重叠的。为了避免混乱,单片机规定:直接寻址的指令不能访问片内RAM的高128个单元(80H~0FFH),若要访问这些单元只能用寄存器间接寻址方式,而要访问专用寄存器(SFR)只能使用直接寻址方式。

【例3-2】假设(43H)=55H,执行如下两条指令可以实现什么功能,采用的是什么寻址方式?

【解】第一条指令的功能是将片内RAM中地址为43H单元的内容传送至累加器(A)。其源操作数寻址方式是直接寻址。第二条指令是将立即数85H传送至专用寄存器IE,其目的操作数的寻址方式是直接寻址。专用寄存器IE的字节地址为0A8H,因此该指令也可用专用寄存器的字节地址代替专用寄存器符号。MOV 0A8H,#85H,这两种方式的指令是等价的,即具有相同的机器代码。

直接寻址示意图如图3-4所示。

图3-4 直接寻址示意图

3.寄存器寻址

寄存器寻址是指将操作数存放于寄存器中,寄存器包括工作寄存器R0~R7、累加器A、通用寄存器B、地址寄存器DPTR等。例如:该指令的操作是把寄存器R0中的数据传送到累加器A中,其操作数存放在寄存器R0中,所以寻址方式为寄存器寻址。

由第2章可知,MCS-51单片机共有4组工作寄存器,每组8个工作寄存器R0~R7,共32个。但寄存器寻址只能使用当前寄存器组,因此指令中的寄存器名称只能是R0~R7。在使用本指令前,有时需要通过对PSW中RS1、RS0位的状态设置,来选择当前工作寄存器组。如果程序状态寄存器PSW的RS1、RS0=0、1(选中第二组工作寄存器,对应地址为08H~0FH),设累加器A的内容为20H,则执行

指令后,内部RAM地址09H的单元的值就变为20H,如图3-5所示。

图3-5 寄存器寻址示意图

4.寄存器间接寻址

寄存器间接寻址是指在指令中给出的寄存器存放的不是操作数而是操作数的地址,操作数是通过寄存器间接得到的,而寄存器寻址中寄存器存放的就是操作数。它们相区别在寄存器间接寻址的寄存器前加前缀标志“@”,而寄存器寻址没有这个标志。同时,寄存器间接寻址时访问片内RAM和片外RAM有一些区别:

1)由于片内RAM共有128字节,访问片内RAM时寄存器间接寻址采用形式为@R0、@R1或SP。访问时用MOV操作符。需要注意的是,MCS-51单片机寻址范围不能超过00H~7FH。对于52子系列单片机,其内部数据存储器高128字节(80H~0FFH)只能使用寄存器间接寻址方式。

2)由于片外RAM存储空间最大达到64KB,仅@R0、@R1无法寻址整个空间。当寻址片外存储空间时由P2口提供高8位地址,R0、R1提供低8位地址共同寻址64KB范围。也可用16位的DPTR作寄存器间接寻址64KB存储空间,访问时用MOVX操作符。

【例3-3】已知使用的第一组工作寄存器,其中(R0)=3AH,内部RAM地址3AH的单元内容为5DH,即(3AH)=5DH,分析执行指令 MOV A,@R0 后A中的内容。

【解】该指令采用寄存器间接寻址将片内RAM中由R0的内容为地址所指示的单元的内容传送到累加器(A),寻址方式如图3-6所示,结果(A)=5DH。

图3-6 寄存器间接寻址示意图

同样采用“MOVX”类寄存器间接寻址方式操作片外RAM的指令。例如:

(www.chuimin.cn)

5.变址寻址

变址寻址是指在指令中把基址寄存器的内容和变址寄存器的内容作为无符号数相加和作为操作数地址。基址寄存器是程序计数器(PC)或数据指针(DPTR),变址寄存器是A,形成的地址是16位地址。这种寻址方式用来访问ROM的查表操作,所以变址寻址操作只有读操作而无写操作。变址寻址指令操作符有MOVC查表指令。

【例3-4】已知(A)=05H,(DPTR)=2000H,即(DPH)=20H,(DPL)=00H,(2005H)=0AAH。试分析执行指令:MOVC A,@A+DPTR后累加器A中的内容。

【解】执行该指令时,首先将DPTR的内容2000H与累加器(A)的内容05H相加,得到地址2005H。然后将该地址的内容0AAH取出传送到累加器(A),这时累加器(A)的内容为0AAH,原来累加器(A)的内容05H被改变,变成0AAH。寻址方式如图3-7所示。

变址寻址方式有几点说明如下:

1)变址寻址方式只能对程序存储器ROM进行寻址,或者说它是专门针对程序存储器的寻址方式,寻址范围可达64KB。

2)变址寻址指令只有以下3条:

其中前两条是程序存储器读指令,后一条是无条件转移指令。

3)尽管变址寻址方式复杂,但这3条指令却是单字节指令。

4)变址寻址方式主要用于查表操作。

图3-7 变址寻址示意图

【例3-5】已知(A)=50H,(1051H)=55H,执行ROM的1050H处的指令:

试分析执行指令后累加器A中的内容。

【解】这条指令是单字节指令,即占用ROM的一个字节空间,那么下一条指令的地址为1001H,即执行MOVC A,@A+PC指令后,(PC)=1001H,再加上累加器(A)的内容50H,即为1051H,执行该指令就是将ROM的地址1051H处的单元内容55H取出,传送至累加器(A),因此执行结果累加器(A)=55H。值得注意的是,PC寄存器的内容没有改变。

例如,若(A)=06H,(DPTR)=3000H,执行指令JMP @A+DPTR后,(PC)=3006H,程序从ROM的3006H地址开始执行。虽然PC寄存器是只读寄存器,指令不能对其直接进行写操作,但是通过转移指令间接修改了PC寄存器的内容。

6.相对寻址

相对寻址是指程序计数器PC的当前内容(指读出该指令后,PC指向的下一条指令的地址)与指令中的操作数相加,其结果作为跳转指令的转移地址(也称目的地址)。该类寻址方式主要用于跳转指令。因此,转移的目的地址可用如下公式表示:

此种寻址方式修改了PC值,所以主要用于实现程序的分支转移。其中rel是一个带符号的8位二进制数,取值范围是-128~+127,以补码形式置于操作码之后存放。执行跳转指令时,先取出该指令,PC的内容是指向下一条指令地址,再把rel的值加到PC上以形成转移的目标地址。

例如,如图3-8所示的一段程序,图中SJMP LOOP指令存放于ROM的地址为3000H,指令汇编成指令代码后为80H 03H,占用2个字节,称之为双字节指令,其中80H为操作码,03即为操作数,接着就是转移的偏移量rel的值,利用上述的目的地址计算公式,程序计数器PC的当前内容是指向下一条指令的地址,即为3002H,故目的地址为3002H+03H=3005H,也就告知单片机下一条执行的程序的地址应为3005H,即LOOP标号处的程序,再一次说明标号就是地址的符号化。同理,利用公式的第二个等式也可知,转移指令的存储地址是3000H,转移指令的字节数是2个,故也可得出转移的目的地址也为3005H。

图3-8 相对寻址程序段图

为了方便起见,汇编程序中都有计算偏移量rel的功能。用户编写汇编源程序时,只需在相对转移指令中直接写上要转移的地址符号即可,程序汇编时会自动计算和填入。

7.位寻址

位寻址是指按位进行的寻址操作,而上述介绍的指令都是按字节进行的寻址操作。MCS-51单片机中,操作数不仅可以按字节为单位进行操作,也可以按位进行操作。当我们把某一位作为操作数时,这个操作数的地址称为位地址。

位寻址区包括专门安排在内部RAM中的两个区域:

1)内部RAM的位寻址区,地址范围是20H~2FH,共16个字节单元,128个位,位地址为00H~7FH。访问这些位有以下两种方法:

·直接使用位地址(00H~7FH)的方法

例如,MOV C,01H ;将位寻址区的第01H位的内容送至PSW寄存器中的CY位。

·字节单元地址加位数的方法

位寻址的字节单元地址有16个,范围为20H~2FH。例如,MOV C,20H.1,这条指令的功能同上,也是将位寻址区的第01H位(即20H字节单元的第1位)的内容送至PSW寄存器中的CY位,因此这两条指令是等价的。

2)专用寄存器SFR中有11个寄存器,只有83位可以位寻址,具体参见第2章中位地址的定义。观察发现,这11个可位寻址的专用寄存器的字节地址均可被8整除。访问这些专用寄存器的位有以下4种方法:

·直接使用位地址的方法

例如,PSW寄存器的位5(F0)的位地址为0D5H。如SETB 0D5H。

·位名称的方法

例如,PSW寄存器的位5是F0标志位,则可以使用F0表示该位。如SETB F0。

·字节单元地址加位数的方法

例如,PSW寄存器的字节单元地址是0D0H,要置F0位,即访问其第5位。如SETB 0D0H.5。

·专用寄存器的符号加位数的方法

例如,清除F0位,可使用指令CLR PSW.5。

一个寻址位有多种表示方法,初看起来有些复杂,但实际上这将为程序设计带来方便。