汇编四、栈

2018-04-21  本文已影响0人  fanren

SP和FP寄存器

注意:ARM64开始,取消32位的 LDM,STM,PUSH,POP指令! 取而代之的是ldr\ldp str\stp,(通过sp减某个值来拉伸栈空间,通过sp加某个值来栈平衡);
ARM64里面 对栈的操作是16字节对齐的!!(通过sp拉伸栈空间时,拉伸栈控件的大小一定是16的倍数);

内存读写指令

注意:读/写数据都是往高地址读的;
例如:一个地址0xf4d0,从这个地址读取两个int值,那么应该读取0xf4d0到0xf4e0的数据;如果要向这个地址写入两个int值,应该向0xf4d0到0xf4e0中写入两个值;

str(store register) 指令

将数据从寄存器中取出,写入到内存中

ldr(load register)指令

将数据从内存中读出来,放到寄存器中
stp/ldp是str/ldr的变种,stp/ldp可以同时读写两个寄存器;

栈操作练习

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

bl和ret指令

CPU从何处执行指令是由pc寄存器决定的,我们可以通过修改pc寄存器的值来控制CPU执行目标指令;
pc指令不能通过mov指令来进行修改,ARM64提供了另外的指令用来修改pc的值,这些指令统称为转移指令,其中最简单的就是bl指令;

bl 标号

ret

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

x30寄存器

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

上一篇 下一篇

猜你喜欢

热点阅读