10 Feb 2020

arm64

arm64

函数调用

第1-4个参数分别保存在x0-x7,剩下的从右向左依次入栈,被调用者实现栈平衡,返回值在x0

寄存器

x0-x30寄存器

通用寄存器,64位,也可以当作32位(w0-w30)使用

sp和fp寄存器

  • sp栈顶指针
  • fp(x29),栈底指针

lr寄存器

x30,储存返回地址

pc寄存器

指向即将执行的下一条指令,arm64中不能直接改写pc寄存器

SPSR寄存器

状态寄存器

指令

arm64中取消32位的ldm,sdm,push,pop

arm64对栈的操作16字节对齐

运算

add    x0,x1,x2      ;x1和x2的值相加后赋给x0
sub    x0,x1,x2      ;x1和x2的值相减后赋给x0
and    x0,x0,#0xF    ;x0的值与0xF相位与后的值赋给x0
orr    x0,x0,#0xF    ;x0的值与0xF相位或后的值赋给x0
eor    x0,x0,#0xF    ;x0的值与0xF相异或后的值赋给x0

mov

和x86的mov差不多一个意思

mov x0,#0x0    ;x0=0

str和ldr

  • str(store register)

    把寄存器的数据写到某个地址

    stp同时操作两个寄存器

    stp x0,x1,[sp,#0x10]	;将x0,x1写入sp+0x10
    
  • ldr(load register)

    把某个地址的数据写到寄存器

    ldp同时操作两个寄存器

    ldp x1,x0,[sp,#0x10]	;从sp+0x10指向的数据写入寄存器x1,x0
    ldr  x0,[x1]             ;将x1指向的数据写入寄存器x0
    ldr  x0,[x1,x2]        ;将x1+x2指向的数据写入寄存器x0
    ldr  x0,[x1,#8]        ;将x1+8指向的数据写入寄存器x0
    ldr  x0,[x1,x2] !       ;将x1+x2指向的数据写入寄存器x0,并将新地址x1+x2写入x1
    ldr  x0,[x1,#8] !       ;将x1+8指向的数据写入寄存器x0,并将新地址x1+8写入x1
    ldr  x0,[x1],x2        ;将x1指向的数据写入寄存器x0,并将新地址x1+x2写入x1
    ldr  x0,[x1,x2,LSL#2] ! ;将x1+x2×4指向的数据写入寄存器x0,并将新地址x1+x2×4写入x1
    ldr  x0,[x1],x2,LSL#2  ;将x1指向的数据写入寄存器x0,并将新地址x1+x2×4写入x1
    

bl和ret

  • bl

    l:将下一条指令的地址放入lr寄存器

    b:跳转

  • blr

    lr:从寄存器中取得地址放入lr寄存器

    b:跳转

    blr x0
    
  • ret

    lr的值赋给pc


Tags:
0 comments



本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议CC BY-NC-ND 4.0)进行许可。

This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License (CC BY-NC-ND 4.0).