ARM64常用汇编

参考:https://blog.csdn.net/chi_wy/article/details/86236735

ARM64取消32位的LDM, STM, PUSH, POP指令. 与之替代的是 ldr/ ldp, str/ stp
ARM64里面 对栈的操作都是16进制对齐

ARM64下, 参数都是保存在x0-x7 (w0-w7) 这8个寄存器中, 如果超过这8个参数就会入栈, 函数的返回值是放在 x0寄存器中.
对于ARM32架构,函数调用时前4个参数用通用寄存器(R0-R3),剩余的用栈。

函数的局部变量都是保存在栈里面.

栈就是指令执行时存放临时变量的内存空间,具有特殊的访问方式:后进先出, Last In Out Firt。

栈是从高地址到低地址存储数据的,栈底是高地址,栈顶是高地址。

FP指向栈底
SP指向栈顶

MOV

MOV X1,X0 ; 将寄存器X0的值传送到寄存器X1

STR

(store register)写入指令
将数据从寄存器中读出来, 写入到内存中

STR(条件) 源寄存器,<存储器地址>
STR R0, [R1] ,意思是R0-> [R1],源寄存器写在前面,跟MOV、LDR都相反。

ldr

(load register)读取指令
将数据从内存中读取出来, 存到寄存器中,LDR:通常都是作加载指令的,但是它也可以作伪指令

 LDR r0,[r1]        //将R1中的值存到r0中
 LDR r1,[r2,#16]     //将(r2+16)地址中的内容存到r1中
 LDR r1,[r2],#4      //将r2地址中的内容存到r1中,同时r2=r2+4

ldp/stp

ldr/str 的衍生, 可以同时读/写两个寄存器, ldr/str只能读写一个

sub sp, sp, #0x20 ; 拉伸栈空间32(20 = 2*16)个字节
stp x0 , x1, [sp, #0x10] ; sp往上加16(10 = 1 * 16)个字节,存放x0 和 x1
ldp x1 , x0, [sp, #0x10] ; 将sp偏移16个字节的值取出来,放入x1 和 x0

CMP

cmp是比较指令,cmp的功能相当于减法指令。它不保存结果,只是影响相应的标志位

cmp指令格式:   cmp   操作对象1, 操作对象2
     mov al, 05h
     mov bl, 08h
     cmp al, bl   (al - bl = -3h)

bl

跳转指令

ret

返回指令
ret {Xm}:跳转到由Xm目标寄存器指定的地址处。

其他

e : equal
ne : not equal
b: below
nb : not below
a : above
na : not above
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值