汇编指令
针对汇编来说,汇编指令是必须了解的,而且汇编中汇编指令比较多,但是每一个汇编指令对应的机器码是固定不变的,看下下面的汇编代码
_A:
sub sp,sp,#0x10
mov w8,#0x1e
str w8,[sp,#0xc]
mov w9,#0xa
str w9,[sp,#0x8]
sub w0,w8,w9
add sp,sp,#0x10
ret
之前介绍逆向的时候就说过,可以通过汇编代码反向推算高级语言,所以经过推算后,可以得到以下C代码:
int A(){
int a = 30;
int b = 10;
return a-b;
}
那么怎么推算的,汇编里面的指令是什么意思呢?今天我们一起去探索
sub指令
sub/subs汇编指令是进行减法运算指令。一般在函数内部第一句就是sub指令,是用来开辟内存空间。之前就说过栈空间是从高地址向低地址扩展的,而且是一块连续的空间,sp之前介绍寄存器的时候就说过是栈顶,所以第一条指令就是sp向低地址移动一段距离,也就是开辟一块栈空间。
mov指令
mov指令是数据传输指令,也是基本的编程指令,用于将一个数据从源地址传送到目标地址
str指令
str指令是写入操作,将制定数据写入到某个寄存器中
add指令
add指令是加法运算指令,经常出现在函数结束后返回前,因为栈空间是高地址向低地址扩展的,所以栈空间使用完毕后释放时就是将sp寄存器地址向高地址移动
b指令
b指令是跳转指令,在函数嵌套的时候经常能看见,而且大多数都是bl指令。
b与bl指令的相同点:都是跳转指令
b与bl指令的不同点:b指令只是单纯的跳转,跳进函数后,无法回到原来的位置,bl指令是带有lr寄存器地址的跳转,跳入其他函数后,可以根据lr寄存器的内存回到之前的位置进行下一步操作
ldr指令
ldr指令是读取指令,从寄存器读取内容的指令
cmp指令
cmp指令是比较指令,其内部就是进行减法运算,最后的结果收到cpsr寄存器中NZCV标志位的影响
b.le指令
b.le指令是判断是否大于
b.ne
b.ne指令是比较是否等于
b.ge
b.ge指令是判断是否小于
b.lt
b.lt指令是判断是否大于等于
b.gt
b.gt指令是判断是否小于等于
b.ls
b.ls指令是判断是否无符号大于
b.ne
b.ne指令是判断是否无符号等于
b.hs
b.hs指令是判断是否无符号小于
b.lo
b.lo指令是判断是否无符号大于等于
b.hi
b.hi指令是判断是否无符号小于等于
b.eq
b.gt指令是比较结果是等于,执行标号,否则不跳转
ubfx
ubfx指令是无符号位域提取指令,一般在一些复杂算法中容易出现
and
and指令是与运算指令
orr
orr指令是或运算指令
eor
eor指令是异或运算指令
stp
stp指令是入栈指令
ldp
ldp指令是出栈指令
cbz
cbz指令是运算结果如果为0进行转移指令
cbnz
cbnz指令是如果结果为非零就进行转移指令
ret
ret指令是返回指令
网友评论