开始逆向objc基础准备(一)简单认识一下arm32,以及与x86汇编指令类比

ARM32体系结构详解
本文详细介绍了ARM32体系结构中的寄存器布局及用途,包括通用寄存器、状态寄存器及其在不同工作模式下的作用。此外,对比了ARM与x86指令集的特点,并列举了两种体系中常见指令的对应关系。

ARM32体系中有31或33个通用寄存器,没有特定的某种态下有r0-r15一共16个寄存器,快速中断态下有另一组r8-r12备份寄存器,在用户态和系统态之外其它态下都各自有一组r13-r14备份寄存器,总共33个寄存器,在特定的态下会使用其各自的特有的备份寄存器。一般用户态常用的通用寄存器为r0-r12。而r13用作堆栈指针sp,r14用作返回地址lr,r15用作程序计数器pc。

另外还有一个状态寄存器CPSR,在用户态和系统态还各自有一个用于备份的SPSR寄存器,用于在退出其它态时恢复CPSR。

ARM有两种指令集分别为arm指令和thumb指令,指令长度固定,分别是32位和16位。

arm指令不能直接对内存进行运算,没有串传输指令。

arm指令可以同时对状态标志进行判断,如addeq, movne, bcc。我猜这个指令特性可以减少许多在运算中的跳转,降低分支命中出错,或避免像x86越来越复杂的指令预取和分支预测技术。

 arm和x86各有所长各有所专,系统平台也一样。

arm32 与 x86 寄存器类比:

arm32x86
r0-r7

eax, ebx, ecx, edx, edi, esi, ebp (还少一个)

r8-r12

 
r13esp
r14 
r15eip
CPSRflags

 

 

 

 

 

 

 

 

常用指令类比:

arm32           x86

str r0, [r1]         mov [r1], r0         movl %r0, (%r1)

ldr r0, [r1]         mov r0, [r1]         movl (%r1), %r0

str r0, [r1, r2]        mov [r1+r2], r0

ldr r0, [r1, r2]        mov r0, [r1+r2]

str r0, [r1, #4]       mov [r1+4],  r0

ldr r0, [r1, #4]       mov r0, [r1+4]

str r0, [r1, r2, LRL #3]   mov [r1+r2*8], r0

str r0, [r1, r2, LSR #3]   mov r3, r2                       x86须借用r3作中间运算

              shr r3, 3          

              mov [r1+r3], r0

ldr r0, =0xcdcdcdcd      mov r0, [0cdcdcdcdh]

ldr r0, [r1], #4       mov r0, [r1]

              lea r1, [r1+4]

ldr r0, [r1], LRL #3     mov r0, [r1]

              shl   r1, 3

ldr r0, [r1], r2, LRL #3   mov r0, [r1+r2*8]

              lea r1, [r1+r2*8]

ldr r0, [r1, #4]!       lea r1, [r1+4]

               mov r0, [r1]

ldr r0, [r1, r2, LRL #3]!   lea r1, [r1+r2*8]

               mov r0, [r1]

ldmfd sp!, {r0-r3}      pop r0

              pop r1  

              pop r2

              pop r3

stmfd sp!, {r0-r3}     push r0

              push r1

              push r2

              push r3

stmfd sp, {r0-r3}       mov [esp], r0

              mov [esp-4], r1

              mov [esp-8], r2

              mov [esp-12], r3

add r1, r1, r2, LRL #3   lea r1, [r1+r2*8]

add r0, r0, #4       add r0, 4

add r0, r0, r1        add r0, r1    

sub r0, r0, r1        sub r0, r1

sbc r0, r0, r1        sub r0, r1

rsb r0, r0, r1, #4      lea r2, [r1+4]

              sub r2, r0

              mov r0, r2

smull r0, r1, r2, r3     mov eax, r2

              mul r3

              mov r0, eax

              mov r1, edx

smlal r0, r1, r2, r3     mov eax, r2

              mul r3

              add r0, eax

              adc r1, edx

and r0, r0, r1        and r0, r1

orr  r0, r0, r1        or r0, r1

eor r0, r0, r1        xor r0, r1

bic r0, r0, r1        mov r2, r1

               not r2

               and r0, r2

mvn r0, r1         mov r2, r1

               not r2

               mov r0, r2

mvn r0, r1, #-1        mov r2, r1

              neg r2

              mov r0, r2

mvn r0, r0, #-1       neg r0

tst r0, r1          test r0, r1

teq r0, r1           mov r2, r1

              xor r2, r0

              test r2, r2

bl             call          ; 自动 mov lr, pc,保存返回地址

b              jmp

bx               jmp         ; 带模式切换,自动修改cpsr寄存器的控制域。

bgt             jg          ; 根据标志位N(SF),V(OF)

blo             jb           ; 根据标志位C(CF),Z(ZF)

beq             je

bne             jne

addeq r0, r0, r1       jne $+n

              add r0, r1

ldrb r0, [r1]       movzx eax, byte ptr[ebx]

ldrsb r0, [r1]       movsx eax, byte ptr[ebx]

ldrh   r0, [r1]       movzx eax, word ptr[ebx]

ldrsh  r0, [r1]       movsx eax, word ptr[ebx]

strb r0, [r1]       mov byte ptr[ebx], al

strh  r0, [r1]       mov word ptr[ebx], ax

ldr r0, [r1. #0x4]!      lead eax, [ebx+0x4]

               mov eax, dword ptr[ebx]

 

arm数据传送指令方向注意事项:

arm数据传送指令分为两类,分别是ld(load Ld <-- Rs)和st(store Ls --> Rd);其它为默认方向。不同于x86指令(intel风格:左目标右源,at&t风格左源右目标)统一固定操作方向。

 

修改日期:2016.8.7

1.str r0, [r1, r2, LSR #3],格式修正。

2.arm数据传送指令方向注意事项。

修改日期:2015.12.25

1. 31个通用寄存器和33个通用寄存器的区别在于,后者多了一个安全监视态。

2.bgt与blo,跟x86的jb与jl类比不适当。

3. 追加对内存进行字节,字传输指令类比。

修改日期: 2017.11.10

1. 添加感叹号语句

转载于:https://www.cnblogs.com/bbqzsl/p/5070035.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值