8051单片机的寻址方式
扫描二维码
随时随地手机看文章
寻址方式:寻址就是寻找操作数的地址。绝大多数指令执行时都需要操作数,因此就存在如何确定操作数地址的问题。所谓寻址方式就是通过什么途径获取操作数的方式。根据指令操作的需要,计算机总是提供多种寻址方式。一般来说,寻址方式越多计算机的寻址能力就越强,但指令系统也就越复杂。
8051指令系统有7种寻址方式:寄存器寻址,直接寻址,寄存器间接寻址,立即寻址,基址寄存器加变址寄存器间接寻址,相对寻址,位寻址,下面分别介绍。
寄存器寻址
寄存器寻址:寄存器寻址就是操作数在寄存器中,因此指定了寄存器就得到了操作数。采用寄存器寻址方式的指令都是一字节的指令,指令中以符号名称来表示寄存器。例如:MOV A R1 这条指令的功能是把工作寄存器R1的内容传送到累加器A中,由于操作数在R1中,因此指令中指定了R1,也就得到了操作数。
寄存器寻址方式的寻址范围包括:工作寄存器组R0~R7,部分特殊寄存器ACC,B,DPTR等。
直接寻址
直接寻址:直接寻址就是在指令中直接给出操作数所在单元的真实地址。这里给出的操作数直接地址为8位二进制地址。程序中一般用十六进制数表示。例如:指令MOV A,30H 把内部RAM单元30H中的数据传送给累加器A,指令中30H就是操作数的直接地址。
直接寻址方式的寻址范围包括:内部数据存储器低128单元,特殊功能寄存器。
特殊功能寄存器在指令的表示中除了可以以直接地址形式给出外,还可以以寄存器符号形式给出,如对累加器A,在指令中可使用其直接地址OEOH,也可使用其符号形式ACC。
立即寻址
立即寻址:立即寻址方式就是实际操作数作为指令的一部分,在指令中直接给出,取指令时,可在程序存储器中直接取得操作数。
通常把出现在指令中的操作数称为立即数。采用立即寻址方式的指令,在立即数前面加上立即寻址符“#”。例如指令MOV A,#30H中30H就是立即数,指令功能为将30H赋给累加器A。
8051中除了一条指令需16位长的立即数外,其余都是8位的立即数,这条16位的立即寻址指令是:MOV DPTR,#data16 指令的功能是将16位的立即数赋给数据指针DPTR寄存器。
寄存器间接寻址
寄存器间接寻址:寄存器间接寻址方式中,寄存器内存放的是操作数的地址,即操作数是通过寄存器间接得到的,因此称为寄存器间接寻址。
寄存器的间接寻址需要以寄存器符号的形式来表示,且在寄存器名称前面加上间接寻址符号“@”。例如指令MOV A,@R0就使用了寄存器间接寻址方式,这条指令的意义为将地址指针R0指向的内部数据存储器单元中的数据送入累加器A中。
假设R0中内容为30H,则此指令的功能是以R0寄存器的内容30H为地址,把内部RAM 30H单元中的内容传送给累加器A。
8051规定,采用R0、R1 DPTR作为间接寻址寄存器,可寻址片内数据存储器RAM的低128B单元和片外数据存储器的低256单元。
采用DPTR作间址寄存器,可寻址片外数据存储器的整个64KB地址空间。堆栈指针SP用于指示堆栈操作的地址,因此,PUSH和POP指令也是寄存器间接寻址。
基址寄存器加变址寄存器间接寻址
基址寄存器加变址寄存器间接寻址:这种寻址方式用于寻址程序存储器的地址空间,它是以DPTR或PC作基址寄存器,以累加器A作为变址寄存器,以两者的内容之和形成的16位数作为操作数地址,也称为变址寻址。
例如指令MOVC A,@A+DPTR就是变址寻址,其功能为把DPTR和A的内容之和作为程序存储器的地址,再将程序存储器中该地址单元的内容传送给累加器A。
假如执行指令前,A=30H。 DPTR=22F1H。根据本寻址方式形成的操作数地址为22F1H+30H=2321H。程序存储器ROM的地址单元2321H中内容为68H。故指令执行结果为A的内容变为68H。
这种寻址方式是专门针对程序存储器的寻址方式。基址寄存器不同,其寻址范围不同。
用PC作基址寄存器时,寻址范围为以当前PC值为起始的256B。
MOVC A,@A+PC 寻址范围为64KB程序存储器空间。
采用这种寻址方式的指令只有3条。MOVC A,@A+DPTR MOVC A,@A+PC JMP @A+DPTR前2条是程序存储器读指令,也称查表指令。后1条是无条件转移指令,又叫散转指令。
相对寻址
相对寻址:相对寻址方式是为实现程序的相对转移而设计,由相对转移指令所采用。在这种寻址方式下,将程序计数器PC的当前值加上由指令中给出的偏移量rel,从而构成了程序转移的目的地址。
这里应注意,PC的当前值为该相对转移指令的下一条指令的地址。因而转移目的地地址可表示如下:目的地址=转移指令地址+转移指令字节数+rel,相对地址的偏移量rel是一个8位带符号二进制补码,范围为+127—-128。即相对寻址时,向前可跳转127字节,向后可跳转128字节。
例如在程序存储器地址2000H处有一条采用相对寻址方式的两字节转移指令JC 35H,并且在执行此指令前进位CY=1,按照指令的功能应发生相对转移JC 35H为两字节指令,因此在计算目的地址时,PC的当前值为下一条指令的地址2002H,偏移量为35H,因此计算出的目的地址为2037H,将它赋给PC,则程序转移到2037H地址继续运行。
位寻址
位寻址:8051具有独立的位处理机即布尔处理机,对寻址的位进行处理。相应的,在指令系统中有一类位操作指令,它们仅允许采用位寻址方式,直接寻址内部数据存储器16个字节单元的128个位,以及特殊功能寄存器中可直接寻址的位,可位寻址的各位都具有独立的8位二进制表示的位地址。
在布尔处理机中,以进位位CY作为位累加器。例如指令ANL C,31H就是一条位寻址指令,其功能是布尔累加器C的值与位地址31H中的值进行逻辑“与”操作。
位寻址方式的寻址范围是内部ROM中字节地址20H~2FH的16字节单元共128个二进制位,位地址为00~7FH。在8051中,位地址的表示可以采用下面几种形式:
直接使用位地址表示 ,例如进位位CY的位地址为0D7H。
采用字节单元地址加位的表示法,如20H.5,表示字节单元地址20H的位5。这种表示法可以避免查表或计算,比较方便。对可位寻址的特殊功能寄存器可直接用寄存器名称加位的方法。如以PSW.7表示进位位CY,以ACC.5表示累加器ACC的第五位。
使用位名称:在可位寻址的特殊功能寄存器中,一些位是有符号名称的,例如PSW中位5是F0标志,可用直接F0表示该位,进位位可用CY表示等。