美文网首页
ARM汇编指令

ARM汇编指令

作者: NextStepPeng | 来源:发表于2018-04-22 21:52 被阅读0次

    关于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入栈!

    相关文章

      网友评论

          本文标题:ARM汇编指令

          本文链接:https://www.haomeiwen.com/subject/ylrhlftx.html