shlu's note

简介

ARM相关,以下所有汇编皆基于armv7

寄存器

栈平衡

参数只能存放于r0-r3寄存器里,其余的从右往左依次压入栈上,并且由被调用者执行出栈操作,实现栈平衡,参数存放顺序如下:

[r0:arg0][r1:arg1][r2:arg2][r3:arg3][sp:arg4][sp+4:arg5][sp+8:arg6]

当然这只是一种约定,并不一定非得这样

PUSH与POP

push {r4,r5,r6,lr}

其实相当于

sub sp,sp,#16   ;16=4*4
str lr,[sp, #12]
str r6,[sp, #8]
str r5,[sp, #4]
str r4,[sp, #0]

POP就是与PUSH相反操作即可

指令解析

EOR.W           R3, R3, R3,LSR#6 

对应c伪代码

r3=r3^(r3>>6)
str     r3, [r2, r1, lsl #2] 
ldr     r3, [r2, r1, lsl #2] 

对应c伪代码

r2[r1]=r3;//r2为32位整型数组
r3=r2[r1];

这里的汇编会有<<2操作,是因为整形占4字节,<<2也就是*4,c里面的索引是按整形来数的,而汇编里是按字节来数的,所以需要*4

指令分段

c里面各种语句可以分为几大类:变量定义,赋值,函数调用,所以可以在汇编找ldr,str,b等指令,根据这些指令进行分段,每段相当于c里一条语句

求余运算

汇编里的求余运算根据数值不同,五花八门,比如下面这个例子:

7811696bf0de4acafdf978731712af6

指令优化

gcc在进行编译时,会进行各种复杂的优化,以提升执行效率,具体各种优化请参考:Here

image

最后一步str赋值会穿插到下一段指令中

image

STR与LDR

image

LDM与STM

详细参考:Here

其他指令

辅助工具

image

image

参考

声明:转载请注明出处,原文地址:shlu's note