安卓逆向之ARM汇编寻址,汇编指令

一: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 和带条件的跳转指令 BEQBNE 等,这些也是寻址模式的体现,因为它们影响程序计数器 (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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值