寻址方式
寻址空间
对程序存储器,片外数据存储器都是以字节为单位寻址的。而对片内数据存储器,有些存储单元既可以字节为单位寻址,又可以位为单位寻址。位地址空间包括特殊功能寄存器SFR中能被8整除的寄存器地址中的88个位地址。格式如下:
特殊功能寄存器:(MSB:最高有效位–Most S Bit)
A(ACC) -> E0HB -> F0HPSW:程序状态字 -> D0HSP:堆栈指针 ->DPTR:数据指针(由DPH和DPL组成,DPH是高位,DPL是低位)->P0P3:P0口锁存器P3口锁存器 ->IP:中断优先级控制寄存器 ->IE:中断允许级控制寄存器 ->TMOD:定时器/计数器方式控制寄存器(Time MOD) ->TCON:定时器/计数器控制寄存器(Time CON)->TH0:定时器/~0(高字节)->TL0 ->TH1 ->TL1 ->SCON:串行口控制寄存器SBUF:串行口数据缓冲器PCON:电源控制寄存器(Power CON)
一共有22个特殊功能寄存器,其中有11个特殊功能寄存器由于字节地址正好能被8整除,所以既可以按字节寻址,又可以按位寻址,不带括号。剩余的11个寄存器只能按字节地址进行寻址。
位地址空间还包括片内数据存储器地址20H~2FH区间内的128个位地址字节地址和位地址对应如下:
符号注释
Rn:当前选中的工作寄存器组R0R7(n=07)。它在RAM中的地址由PSW中的R0和R1决定【RAM有四个工作寄存器区,刚好由0,1决定】Ri:当前选中的工作寄存器组中可以作为地址指针的两个工作寄存器R0,R1。片内的地址通过计算可得。# data:8位立即数。其中"#"是立即寻址符,符号后面的数是立即数。# data 16:16位立即数direct :8位片内RAM(包括SFR)的直接地址。addr 11:11位目的地址addr 16:16位目的地址rel:相对地址,用于相对转移指令,书写源程序时,rel一般用符号表示,汇编程序自动计算rel的偏移量。bit:片内RAM或SFR的直接寻址位地址@:寄存器间接寻址符/:位操作命令中,表示对该为先取反再参与操作,但不影响该原位原值
立即寻址
MOV A,#45H ;MOV DPTR,#DATA;机器代码 74(PC) 45
直接寻址
由指令直接给出参加操作的数的字节地址。由于操作数地址只能以8位数指定。所以直接寻址方式只能在SFR和RAM的低128字节地址空间进行寻址
MOV A,45H;该指令中,直接给出了操作数的地址45H,实际参加的数就在45H单元中。
注意:指令助记符中的direct是操作数所在的存储单元地址,由2位16进制数表示。当直接地址为SFR中某个寄存器的地址时,direct既可以用SFR的实际地址,也可以用SFR的名字符号(通常使用后者),有利于增强程序的可读性。
PUSH DPH;机器码:C0 83PUSH 83H;机器码:C0 83;利用直接寻址的方式访问累加器A的时候,应该用ACC(或0EH)表示累加器A,以免与寄存器寻址混淆。PUSH A;错误PUSH ACC;正确
寄存器寻址
寄存器寻址是由指令指出某一个寄存器的内容为操作数。在寄存器寻址方式的指令中,寄存器用寄存器名来表示。对选定的工作寄存器区中的R0~R7、累加器A,B,DPTR以及进位CY中的数进行操作,当前工作寄存器组的选择,由PSW的RS1和RS2来指定。
MOV A,R3;将R3中的数给累加器A;;机器代码 EB;指令操作码为EBH,其二进制形式为11101011,即操作码的低三位为011,表示工作寄存器R1~R3的地址.;流程图如图
执行结果:累加器A中的内容为58H,R3(13H)中的内容不变
寄存器间接寻址
这种寻址方式中,指令操作数所指定的寄存器中存放的是操作数的地址,而不是操作数本身。在MSC-51中,可以作为寄存器间接寻址有工作寄存器R0、R1和堆栈指示器SP以及数据指针DPTR
当寻址片内RAM低于128或者片外低于256字节时,可以使用R0或R1。采用DPTR作为间接地址寄存器,可以寻址片外64K的数据存储器。
例如:
MOV A,@R0;机器代码:11100110;设工作寄存器为第0组,R0中存放5EH,它为片内RAM的一个存储单元,其中的内容是78H.执行指令后,再将78H传送给累加器A.
注意:在使用@R0,@R1对片外RAM的0000H~00FFH单元进行寻址的时候,应该先将P2口置为0输出
变址寻址(基址寄存器+变址寄存器间接寻址)
变址寻址方式以PC或DPTR作为基址寄存器,存放操作数的基本地址。累加器A为变址寄存器,存放被寻址操作数地址相对于基地址的偏移量,该偏移量为1字节无符号数。操作数的有效地址为:
有效地址=基址寄存器PC(或DPTR)+A 表现为A=PC+A
MOVC A,@A+DPTR;机器代码:93;设累加器A=47H,DPTR=2000H,(2047H)=5CH,该指令是将操作数的有效地址2047H单元中的内容传送给累加器A.指令执行后,A=5CH
相对寻址
相对地址是仅用于相对转移指令的一种寻址方式。这种寻址方式是要寻找指令地址,而不是数,即寻找下一条要执行指令的地址。相对寻址的有效地址为:
D=PC+rel
式子中,rel是相对地址。相对地址的机器码称为偏移量disp,rel=disp+b。若转移指令为二字节,则b=2,若转移指令为三字节,则b=3。
偏移量为一字节二进制补码数,取值为-128~+127。对应的相对地址取值范围容易计算。
JC 18H;机器代码:40 16(18-2);这是一个二字节指令,它是以进位标志CY为条件的相对转移指令。若CY等于0,则不转移,PC=PC=2,顺序往下执行;若CY等于1,则以PC当前内容(+2)与机器代码的第二字节数相加,结果得到转移指令的目的地址PC.
位寻址
位寻址仅用于位操作指令的一种寻址方式,它是指对片内RAM位寻址区和某些可以位寻址的特殊功能寄存器(11个)进行位操作的寻址。在进行位操作时,首先借助于进位标志CY作为位操作累加器。当位地址与直接寻址中的字节地址形式完全一样的时候,主要有操作码加以区分。
SETB 3AH;RAM可寻址区内位地址3AH是片内RAM中27H单元中的第二位。若设(27H)=00H,执行SETB操作后,第二项的值置为1,变为00000100B,此时(27H)=04H.