开始逆向objc基础准备(一)简单认识一下arm32,以及与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 寄存器类比:

arm32 x86
r0-r7

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

r8-r12

 
r13 esp
r14  
r15 eip
CPSR flags

 

 

 

 

 

 

 

 

常用指令类比:

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. 添加感叹号语句

posted on 2015-12-23 15:55  bbqz007  阅读(1149)  评论(0编辑  收藏  举报