



所谓寻址方式,就是指某一个CPU指令系统中规定的寻找操作数所在地址的方式,或者说通过什么样的方式找到操作数。每一种计算机都具有多种寻址方式。寻址方式的多少是反映指令系统优劣的主要指标之一。在MCS-51单片机指令系统中,有7 种寻址方式包括寄存器寻址、直接寻址、立即数寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。
在这种寻址方式中,操作数以数字形式直接出现在指令中,它紧跟在操作码的后面,作为指令的一部分与操作码一起存放在程序存储器内,可以立即得到并执行,不需要另去寄存器或存储器等处寻找和取数,故称为立即寻址。该操作数称为立即数,并在其前冠以“#”号作前缀,以表示并非地址。立即数可以是8位或16位,用十六进制数表示。
操作过程如图 3-1 所示。
该指令的功能是将立即数 0FH传送到累加A中,对应的机器码为 74H。它隐含了寄存器寻址累加器A方式,长是一个字节,占用一个存储单元;立即数 20H紧跟在操作码之后,成为指令代码的一部分,长度也是一个字节,占用紧跟在后面的另一个存储单元。故该指令为双字节指令,其机器码为 74H 20H。
图 3-1立即寻址示意图
在指令中直接给出操作数的地址,这种寻址方式就属于直接寻址方式。在这种方式中,指令的操作数部分直接是操作数的地址。在MCS-51单片机指令系统中,直接寻址方式中可以访问 3 种存储器空间。
(1)片内数据存储器的低 128 个字节单元(00H~7FH)。
(2)特殊功能寄存器。特殊功能寄存器只能用直接寻址方式进行访问。对特殊功能寄存器直接寻址可以用字节地址,也可用特殊功能寄存器名。
(3)位地址空间。
该指令的功能是把内部数据存储器RAM 20H单元的内容送到累加器A。指令直接给出了源操作数的地址 20H。该指令的机器码为E5H 20H。
操作过程如图 3-2 所示。
图 3-2 直接寻址示意图
该指令的机器码为F5H F0H。
该指令的机器码为F5H F0H。
直接地址在指令表中用direct表示,范围为00H~FFH。对于低地址段(00H~7FH)除工作寄存器(R0~R7)代表的单元外,都是以两位 16 进制数的形式在指令中出现。而高地址段(80H~FFH)属特殊功能寄存器(SFR)区,一般用对应的符号表示相应的单元地址。
例如:
其中的30H、31H、32H、SP、B、A、DPL都表示的是直接地址。
选定某寄存器,自该寄存器中读取或存放操作数,以完成指令规定的操作,称为寄存器寻址。在该寻址方式中,操作数中有一个是寄存器。采用寄存器寻址方式的指令都是一字节的指令,指令中以符号名称来表示寄存器。寄存器一般指8个工作寄存器R0~R7,累加器A,数据指针DPTR和布尔处理器的位累加器C。实际上寄存器寻址也可以看作是一种直接寻址。
该指令的功能是把工作寄存器R0中的内容传送到累加器A中,如R0内容为FFH,则执行该指令后A的内容也为FFH。在该条指令中,源操作数和目的操作数是由寻址R0 和A寄存器得到的,故属于寄存器寻址。该指令为单字节指令,机器代码为E8H。
若PSW中的RS1、RS0都等于零,则R0代表00H单元。示意图如图3-3所示。
图 3-3 寄存器寻址示意图
指令MOV A,00H和本例中的MOV A,R0 在单片机中执行的效果相同。但前者是直接寻址(双字节指令),而后者是寄存器寻址(单字节指令)。
所谓寄存器间接寻址就是以寄存器中的内容作为RAM地址,该地址中的内容才是操作数。寄存器间接寻址也需在指令中指定某个寄存器,也是以符号名称来表示寄存器的,为了区别寄存器寻址和寄存器间接寻址,用寄存器名称前加“@”标志,来表示寄存器间接寻址。例如:
其操作示意图如图 3-4 所示:
图 3-4 寄存器间接寻址示意图
这时R0 寄存器的内容 3AH是操作数地址,内部RAM的 3AH单元的内容 65H才是操作数,并把该操作数传送到累加器A中,结果(A)= 65H。若是寄存器寻址指令:
则执行结构(A)= 3AH。对这两类指令的差别和用法,一定要区分清楚。间接寻址理解起来较为复杂,但在编程时是极为有用的一种寻址方式。
MCS -51系列单片机规定只能用寄存器R0、R1、DPTR作为间接寻址的寄存器。间接寻址可以访问的存储空间为内部RAM和外部RAM。
(1)内部RAM的低 128 个单元采用R0、R1 作为间址寄存器。
(2)外部RAM的寄存器间接寻址有两种形式:一是采用R0、R1 作为间址寄存器,可寻址 256 个单元;二是采用 16 位的DPTR作为间址寄存器,可寻址外部RAM的整个 64KB地址空间。
对于 52 子系列的单片机,其内部RAM是 256 个字节,其高 128 字节与特殊功能寄存器的地址是重叠的,两者由不同的寻址方式加以区分。对 52 子序列的高 128 字节RAM,必须采用寄存器间接寻址方式访问。
变址寻址是指将基址寄存器与变址寄存器的内容相加,结果作为操作数的地址。DPTR或PC是基址寄存器,累加器A是变址寄存器。该类寻址方式主要用于查表操作。例如:
该指令执行的操作是将累加器A和基址寄存器DPTR的内容相加,相加结果作为操作数存放的地址,再将操作数取出来送到累加器A中。
设累加器A = 02H,DPTR = 0300H,外部ROM中,0302H单元的内容是 55H,则指令MOVCA,@A+DPTR的执行结果是累加器A的内容为55H。该指令的执行过程如图3-5所示。
图 3-5 变址寻址示意图
又如:
此条指令的功能是将A的内容与PC的内容相加形成操作数的地址(ROM16位地址),把该地址中的内容送入累加器A中。
这两条指令常用于访问程序存储器中的数据表格,且都为一字节指令。
相对寻址是指程序计数器PC的当前内容与指令中的操作数相加,其结果作为跳转指令的转移地址(也称目的地址)。该类寻址方式主要用于跳转指令。假设:
(1)PC代表相对转移指令第一个字节的地址。
(2)PC*表示现行PC值,即把相对转移指令从程序存储器中取走后的PC值。
PC*= PC +相对转移指令字节数
(3)rel为偏移量,8位二进制补码,取值范围-128~+127。rel取值为正表示正跳转,取值为负表示负跳转。在汇编程序中常以标号的形式表示。
(4)PC^表示相对转移指令转移到的目的地址。
PC^= PC*+ rel;该式即表示相对寻址方式
例如:指令SJMP 54H执行的操作是将PC当前的内容与 54H相加,结果再送回PC中,成为下一条将要执行指令的地址。
图 3-6 相对寻址示意图
设指令SJMP 54H的机器码 80H,54H存放在2000H处,当执行到该指令时,先从 2000H和2001H单元取出指令,PC自动变为 2002H;再把PC的内容与操作数 54H相加,形成目标地址2056H,再送回PC,使得程序跳转到 2056H单元继续执行。该指令的执行过程如图 3-6 所示。
位寻址是指按位进行的寻址操作,而上述介绍的指令都是按字节进行的寻址操作。MCS-51单片机中,操作数不仅可以按字节为单位进行操作,也可以按位进行操作。当我们把某一位作为操作数时,这个操作数的地址称为位地址。
位寻址区包括专门安排在内部RAM中的两个区域:一是内部RAM的位寻址区,地址范围是20H~2FH,共 16 个RAM单元,位地址为 00H~7FH;二是特殊功能寄存器SFR的可寻址位,凡是字节地址能被 8 整除的特殊功能寄存器都可以位寻址。
例如:指令SETB 3DH执行的操作是将内部RAM位寻址区中的 3DH位置 1。
设内部RAM 27H单元的内容是 00H,执行SETB 3DH后,由于3DH对应内部RAM 27H的第 5 位,因此该位变为 1,也就是 27H单元的内容变为 20H。该指令的执行过程如图 3-7 所示。
在MCS-51系列单片机中,位地址的表示可以采用以下3 种方式:
图 3-7 位寻址示意图
(1)直接使用位地址。对于 20H~2FH共 16 个单元的128位,其位地址是00H~7FH,例如,20H单元的0~7位的位地址为00H~07H,而特殊功能寄存器的可寻址的位地址可参照第二章的对应表。
(2)用单元地址加为序号表示。如 25H.5 表示 25H单元的D5 位(位地址是 2DH),而PSW中的D3 可表示为D0H.3,这种表示方法可以避免查表或计算,比较方便。
(3)用位名称表示。特殊功能寄存器中的可寻址位均有位名称,可以用位名称来表示该位,如用RS0 表示PSW中的D3~D0H.3。
习惯上,对于特殊功能寄存器的寻址位常使用位名称表示其位地址。
在指令系统中,操作数是一个重要的组成部分,他指出了参加运算的数或数所在的单元地址。而如何找到这个操作数就称为寻址方式。寻址方式越多,则计算机的功能越强,灵活性亦越大,但指令系统也就越复杂。
寻址方式是汇编语言程序设计中最基本的内容之一,需十分熟悉,牢固掌握。在上一章中,已介绍过MCS-51系列单片机系统的存储器分布,在学习寻址方式时,要特别注意在各种不同的存储区中,分别可以采用什么寻址方式。在MCS-51单片机的指令系统中,指令对哪一个存储器空间进行操作,是由指令的操作码和寻址方式确定的。对程序存储器只能采用立即寻址和基址加变址寻址方式;对特殊功能寄存器只能采用直接寻址方式,不能采用寄存器间接寻址,对8052/8032等单片机内部RAM高128字节(80H~FFH),只能采用寄存器间接寻址,不能使用直接寻址方式;对位操作指令只能对位寻址区操作;外部扩展的数据存储器只能用MOVX指令访问,而内部RAM的低 128字节(00H~7FH)既能用直接寻址,也能用间接寻址,操作指令最丰富。
综合上述的 7 种寻址方式,可列出每种寻址方式涉及的存储器空间见表 3-1。
表 3-1 操作数寻址方式及寻址空间