ARM汇编指令

关于arm64汇编指令,如下图

ARM汇编指令_第1张图片
汇编指令.png

汇编指令可以汇总如下:(后续会更新)

ARM汇编指令_第2张图片
汇编指令.png

关于内存读写指令

注意:读/写 数据是都是往高地址读/写

str(store register)指令

将数据从寄存器( Stack Register)中读出来,存到内存中.

ldr(load register)指令

将数据从内存中读出来,存到寄存器( Stack Register)中

此ldr 和 str 的变种ldp 和 stp 还可以操作2个寄存器.

bl指令
跳转

bl指令

  • CPU从何处执行指令是由pc中的内容决定的,我们可以通过改变pc的内容来控制CPU执行目标指令

  • ARM64提供了一个mov指令(传送指令),可以用来修改大部分寄存器的值,比如

    • mov x0,#10、mov x1,#20
  • 但是,mov指令不能用于设置pc的值,ARM64没有提供这样的功能

  • ARM64提供了另外的指令来修改PC的值,这些指令统称为转移指令,最简单的是bl指令

bl指令 -- 练习

现在有两段代码!假设程序先执行A,请写出指令执行顺序.最终寄存器x0的值是多少?

_A:
    mov x0,#0xa0
    mov x1,#0x00
    add x1, x0, #0x14
    mov x0,x1
    bl _B
    mov x0,#0x0
    ret

_B:
    add x0, x0, #0x10
    ret

bl和ret指令

bl标号

  • 将下一条指令的地址放入lr(x30)寄存器
  • 转到标号处执行指令

ret

  • 默认使用lr(x30)寄存器的值,通过底层指令提示CPU此处作为下条指令地址!

ARM64平台的特色指令,它面向硬件做了优化处理的

adrp指令

是计算指定的数据地址 到当前PC值的相对偏移
由于得到的结果是低12bit为0
举例:adrp x0,1
1、将1的值左移12位 1,0000,0000,0000 == 0x1000
2、将PC寄存器的低12位清零 比如: 0x1002e6123 ==> 0x1002e6000
3、将步骤1和2的值相加的结果 给 X0寄存器!!0x1002e7000
寻找常量的地址经常会用到这个指令


ARM汇编指令_第3张图片
haha.png

x30寄存器

x30寄存器存放的是函数的返回地址.当ret指令执行时刻,会寻找x30寄存器保存的地址值!

注意:在函数嵌套调用的时候.需要讲x30入栈!

你可能感兴趣的:(ARM汇编指令)