一:ARM汇编寻址
1. 立即数寻址 (Immediate Addressing)
指令中直接给出一个常数值(立即数),并对其进行操作。
MOV R0, #5 ; 将立即数5载入寄存器R0
2. 直接寻址 (Direct Addressing)
指令中给出的地址直接指定了内存中的一个位置,通常在数据段中。
LDR R0, =0x1000 ; 将地址0x1000的值加载到R0寄存器
3. 间接寻址 (Indirect Addressing)
使用寄存器中的地址来访问内存中的数据。
LDR R0, [R1] ; 将R1寄存器中存储的地址所指向的值载入R0
4. 基址寻址 (Base Addressing)
通过一个基址寄存器,加上一个偏移量来访问内存。
LDR R0, [R1, #4] ; 从R1寄存器所指向的地址加上4的偏移量处加载数据到R0
5. 偏移寻址 (Offset Addressing)
在基址的基础上,通过增加一个偏移值来访问数据。
STR R0, [R1, R2] ; 将R0的值存储到地址为R1 + R2的内存位置
6. 自增和自减寻址 (Pre-Indexed & Post-Indexed Addressing)
通过预增或后增来访问数据。
- 预索引 (Pre-Indexed): 在访问内存前,先修改基址寄存器的值。
LDR R0, [R1, #4]! ; 加载R1地址加4处的值到R0,并将R1更新为R1 + 4
- 后索引 (Post-Indexed): 在访问后修改基址寄存器的值。
LDR R0, [R1], #4 ; 首先加载R1地址处的值到R0,然后将R1增加4
7. 结构体寻址 (Struct Addressing)
通常在处理结构体时,利用基址和字段偏移量进行访问。
LDR R0, [R1, #OFFSET] ; 读取R1寄存器指向的位置加上字段偏移量存入R0
8. 无条件跳转和条件跳转
无条件跳转 B
和带条件的跳转指令 BEQ
、BNE
等,这些也是寻址模式的体现,因为它们影响程序计数器 (PC) 的值。
B label ; 跳转到 label
BEQ label ; 如果 ZF (零标志位) 为 1,跳转到 label
示例汇编程序
以下是一个简单的 ARM 汇编程序示例,展示了不同寻址方式的使用:
.section .data
value: .word 10
.section .text
.global _start
_start:
LDR R0, =value ; 使用直接寻址加载 value 地址
LDR R1, [R0] ; 使用间接寻址加载 value 的值 (10)
ADD R1, R1, #1 ; R1 = R1 + 1,结果 R1 = 11
STR R1, [R0] ; 使用间接寻址将 R1 的值存回 memory location
MOV R7, #1 ; 系统调用号 (exit)
SWI 0 ; 触发系统调用,退出程序
在 ARM 汇编语言中,寄存器移位寻址、加载/存储寻址方式以及栈寻址是非常重要的寻址模式。
1. 寄存器移位寻址 (Register Shift Addressing)
寄存器移位寻址允许在操作数中对寄存器的值进行位移操作。这种模式通常用于算术和逻辑操作中,可以通过左移、右移等方式改变寄存器中的值。
示例
MOV R0, #1 ; 将立即数1加载到R0
LSL R1, R0, #2 ; 将R0左移2位,结果存储在R1中 (R1 = 4)
LSR R2, R1, #1 ; 将R1右移1位,结果存储在R2中 (R2 = 2)
- LSL (Logical Shift Left): 左移操作,低位补零。
- LSR (Logi