关于arm64汇编指令,如下图
汇编指令.png汇编指令可以汇总如下:(后续会更新)
汇编指令.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
寻找常量的地址经常会用到这个指令
haha.png
x30寄存器
x30寄存器存放的是函数的返回地址.当ret指令执行时刻,会寻找x30寄存器保存的地址值!
注意:在函数嵌套调用的时候.需要讲x30入栈!
网友评论