ARM基本寻址方式寻址方式是根据指令中给出的地址码字段来寻找真实操作数地址的方式。ARM处理器支持的基本寻址方式有:寄存器寻址,立即寻址,寄存器移位寻址,寄存器间接寻址,变址寻址,堆栈寻址,块复制寻址,相对寻址。寄存器寻址:ADD R0,R1, R2 ; R0R1+R2这条指令将2个寄存器(R1和R2)的内容相加,结果放入第3个寄存器R0中。必须注意写操作数的顺序,第1个是结果寄存器,然后是第一操作数寄存器,最后是第二操作数寄存器。立即寻址:ADD R3,R3,#1;R3R3+1AND R8,R7,#0xff; R8R7[7:0]第2个源操作数为一个立即数,以“#”为前缀,十六进制值以在“#”后加“0x”或“”表示。寄存器移位寻址:ADD R3,R2,R1,LSL #3 ; R3R2+8×R1LSL:逻辑左移(Logical Shift Left)。寄存器中字的低端空出的位补0。LSR:逻辑右移(Logical Shift Right)。寄存器中字的高端空出的位补0。ASR:算术右移(Arithmetic Shift Right)。算术移位的对象是带符号数,若源操作数为正数,则字的高端空出的位补0。若源操作数为负数,则字的高端空出的位补1。ROR:循环右移(ROtate Right)。从字的最低端移出的位填入字的高端空出的位。RRX:扩展为1的循环右移(Rotate Right eXtended by 1 place)。操作数右移一位,空位(位[31])用原C标志值填充。寄存器间接寻址:LDR R0,[R1] ; R0[R1]STR R0,[R1] ; R0[R1]指令中的地址码给出某一通用寄存器的编号。在被指定的寄存器中存放操作数的有效地址,而操作数则存放在存储单元中,即寄存器为地址指针。寄存器间接寻址使用一个寄存器(基址寄存器)的值作为存储器的地址。第1条指令将寄存器R1指向的地址单元的内容加载到寄存器R0中。第2条指令将寄存器R0存入寄存器R1指向的地址单元。变址寻址:变址寻址就是将基址寄存器的内容与指令中给出的位移量相加,形成操作数有效地址。变址寻址用于访问基址附近的存储单元,包括基址加偏移和基址加索引寻址。寄存器间接寻址是偏移量为0的基址加偏移寻址。________前索引寻址方式:例如:LDRR0,[R1,#4] ; R0[R1+4]自动索引寻址方式:例如:LDR R0,[R1,#4]! ; R0[R1+4] ; R1R1+4后索引寻址方式:基址不带偏移作为传送的地址,传送后自动索引。例如:LDR R0,[R1],#4 ; R0[R1]; R1R1+4________指令指定一个基址寄存器,再指定另一个寄存器(索引),其值作为位移加到基址上形成存储器地址。例如:LDR R0,[R1,R2] ; R0[R1+R2]堆栈寻址:堆栈是按“先进后出”(FILO)的特定顺序进行存取的存储区。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储器区域(堆栈)。栈指针所指定的存储单元就是堆栈的栈顶。块复制寻址:是多寄存器传送指令LDM/STM的寻址方式。通过一条指令可以把一个数据块加载到多个寄存器中,也可以把多个寄存器中的内容保存到存储器中。这种寻址方式中的寄存器可以是R0-R15这16个通用寄存器中的部分或全部。LDMIA R0,(R1,R2,R3,R4);R1←[R0];R2←[R0+4];;R3←[R0+8];R4←[R0+12];相对寻址:相对寻址是变址寻址的一种变通,由程序计数器PC提供基地址。指令中的地址码字段作为位移量,两者相加后得到操作数的有效地址。位移量指出的是操作数与现行指令之间的相对位置。例如指令:BL SUBR ;转移到SUBR…;返回到此SUBR…;子程序入口地址MOV PC,R14;返回
ARM基本寻址方式
寻址方式是根据指令中给出的地址码字段来寻找真实操作数地址的方式。ARM处理器支持的基本寻址方式有:寄存器寻址,立即寻址,寄存器移位寻址,寄存器间接寻址,变址寻址,堆栈寻址,块复制寻址,相对寻址。
寄存器寻址:ADD R0,R1, R2 ; R0R1+R2
这条指令将2个寄存器(R1和R2)的内容相加,结果放入第3个寄存器R0中。必须注意写操作数的顺序,第1个是结果寄存器,然后是第一操作数寄存器,最后是第二操作数寄存器。
立即寻址:ADD R3,R3,#1;R3R3+1
AND R8,R7,#0xff; R8R7[7:0]
第2个源操作数为一个立即数,以“#”为前缀,十六进制值以在“#”后加“0x”或“”表示。
寄存器移位寻址:ADD R3,R2,R1,LSL #3 ; R3R2+8×R1
LSL:逻辑左移(Logical Shift Left)。寄存器中字的低端空出的位补0。
LSR:逻辑右移(Logical Shift Right)。寄存器中字的高端空出的位补0。
ASR:算术右移(Arithmetic Shift Right)。算术移位的对象是带符号数,若源操作数为正数,则字的高端空出的位补0。若源操作数为负数,则字的高端空出的位补1。
ROR:循环右移(ROtate Right)。从字的最低端移出的位填入字的高端空出的位。
RRX:扩展为1的循环右移(Rotate Right eXtended by 1 place)。操作数右移一位,空位(位[31])用原C标志值填充。
寄存器间接寻址:LDR R0,[R1] ; R0[R1]
STR R0,[R1] ; R0[R1]
指令中的地址码给出某一通用寄存器的编号。在被指定的寄存器中存放操作数的有效地址,而操作数则存放在存储单元中,即寄存器为地址指针。
寄存器间接寻址使用一个寄存器(基址寄存器)的值作为存储器的地址。第1条指令将寄存器R1指向的地址单元的内容加载到寄存器R0中。第2条指令将寄存器R0存入寄存器R1指向的地址单元。
变址寻址:变址寻址就是将基址寄存器的内容与指令中给出的位移量相加,形成操作数有效地址。变址寻址用于访问基址附近的存储单元,包括基址加偏移和基址加索引寻址。寄存器间接寻址是偏移量为0的基址加偏移寻址。
________前索引寻址方式:例如:LDRR0,[R1,#4] ; R0[R1+4]
自动索引寻址方式:例如:LDR R0,[R1,#4]! ; R0[R1+4] ; R1R1+4
后索引寻址方式:基址不带偏移作为传送的地址,传送后自动索引。
例如:LDR R0,[R1],#4 ; R0[R1]; R1R1+4
________指令指定一个基址寄存器,再指定另一个寄存器(索引),其值作为位移加到基址上形成存储器地址。
例如:LDR R0,[R1,R2] ; R0[R1+R2]
堆栈寻址:堆栈是按“先进后出”(FILO)的特定顺序进行存取的存储区。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储器区域(堆栈)。栈指针所指定的存储单元就是堆栈的栈顶。
块复制寻址:是多寄存器传送指令LDM/STM的寻址方式。通过一条指令可以把一个数据块加载到多个寄存器中,也可以把多个寄存器中的内容保存到存储器中。这种寻址方式中的寄存器可以是R0-R15这16个通用寄存器中的部分或全部。
LDMIA R0,{R1,R2,R3,R4};R1←[R0];R2←[R0+4];
;R3←[R0+8];R4←[R0+12];
相对寻址:相对寻址是变址寻址的一种变通,由程序计数器PC提供基地址。指令中的地址码字段作为位移量,两者相加后得到操作数的有效地址。位移量指出的是操作数与现行指令之间的相对位置。例如指令:
BL SUBR ;转移到SUBR
…;返回到此
SUBR…;子程序入口地址
MOV PC,R14;返回
题目解答
答案
基址加偏移寻址: 基址加索引寻址:
解析
本题考查ARM处理器的变址寻址方式,重点区分基址加偏移寻址和基址加索引寻址的核心概念。
- 变址寻址的本质是通过基址寄存器与位移量的组合生成有效地址。
- 基址加偏移寻址:基址寄存器与立即数偏移量相加,例如
[R1, #4]。 - 基址加索引寻址:基址寄存器与另一个寄存器中的位移量相加,例如
[R1, R2]。
关键在于理解偏移量是立即数,而索引是寄存器中的值。
基址加偏移寻址
定义:基址寄存器与指令中给出的立即数偏移量相加,形成操作数的有效地址。
示例:LDR R0, [R1, #4]
- 基址寄存器为
R1,偏移量为#4(立即数)。 - 有效地址为
R1 + 4,从该地址加载数据到R0。
基址加索引寻址
定义:基址寄存器与另一个寄存器中的位移量相加,形成操作数的有效地址。
示例:LDR R0, [R1, R2]
- 基址寄存器为
R1,索引寄存器为R2。 - 有效地址为
R1 + R2,从该地址加载数据到R0。