更新时间:2022-10-25 12:38
寄存器间接寻址是将指定的寄存器内容为地址,由该地址所指定的单元内容作为操作数。MCS-51规定R0或R1为间接寻址寄存器,它可寻址内部RAM低位地址的128个字节单元内容。还可采用数据指针(DPTR)作为间接寻址寄存器,寻址外部数据存储器的64K字节空间,但不能用本寻址方法寻址特殊功能寄存器。
在单片机的一种指令寻址方式,寄存器间接寻址方式中,寄存器内存放的是操作数的地址,而不是操作数本身,即操作数是通过寄存器间接得到的,因此称为寄存器间接寻址。
操作数放在RAM某个单元中,该单元的地址又放在寄存器R0或R1中。 如果RAM的地址大于256,则该地址存放在16位寄存器DPTR(数据指针)中,此时在寄存器名前加@符号来表示这种间接寻址。如MOV A,@ R0。其它还有变址寻址、相对寻址、位寻址等。如用单片机控制温度时,时时需要将给定的控制温度(如20℃)减去环境温度,而环境温度时时有变化,显然无法在程序指令中给出,只有通过一定方式,将其送入某个输入/输出口,再存放在某个寄存器中,这就必须用到寄存器寻址。又如要进行算术运算,要计算每班学员各科成绩的平均值,如果把每个学员的各科都编一个程序,在程序中直接给出该学员各科成绩,再求平均值,显然太麻烦。这里可以编一个求平均成绩的通用程序,把每位学员的成绩送入存贮器的各个单元中,这时可采取直接寻址,所以,寻址方式越多,编制程序就越方便、灵活,适用范围就越广。
例如,设将内部RAM的65H单元内容(47H)送A,可执行指令:MOV A,@R0,其中R0内容为65H
指令的执行过程为:当程序执行到本指令时,就以指令中所指定的工作寄存器R0的内容(65H)为指针,将内部数据存储器65H单元的内容(47H)送累加器A。
寄存器的间接寻址需要以寄存器符号的形式来表示,且在寄存器名称前面加上间接寻址符号“@”。例如指令MOV A,@R0就使用了寄存器间接寻址方式,这条指令的意义为将地址指针R0指向的内部数据存储器单元中的数据送入累加器A中.
假设R0中内容为30H,则此指令的功能是以R0寄存器的内容30H为地址,把内部RAM 30H单元中的内容传送给累加器A。
8051规定,采用R0、R1 DPTR作为间接寻址寄存器,可寻址片内数据存储器RAM的低128B单元和片外数据存储器的低256单元。
采用DPTR作间址寄存器,可寻址片外数据存储器的整个64KB地址空间。堆栈指针SP用于指示堆栈操作的地址,因此,PUSH和POP指令也是寄存器间接寻址。