ARM Aarch64中的PUSH {lr}和POP {lr}

时间:2015-01-14 10:54:50

标签: assembly arm arm64

ARM Arch64指令集中PUSH{lr}POP{lr}的等效指令是什么。

STR X30, [SP, #8]是否正确?你能解释一下保持堆栈对齐的概念吗?我对ARMv8比较陌生,请原谅。

2 个答案:

答案 0 :(得分:7)

如果您要求C编译器从源代码生成汇编语言列表,您将看到它如何处理ARMv8堆栈上的数据推送。这可能不是唯一的方法,但GCC会这样做:

   sub  sp, sp, #32     \\ Open up some temp stack space
   stp  x19, x20, [sp]  \\ save 2 pairs of registers
   stp  x21, x30, [sp,#16]
 <your code>
   ldp  x19, x20, [sp]  \\ restore 2 pairs of registers
   ldp  x21, x30, [sp,#16]
   add  sp, sp, #32     \\ "free" the temp stack space

答案 1 :(得分:3)

STR X30, [SP, #8]完全错了。

  1. 关于Aarch64堆栈最重要的一点是SP 必须是16字节对齐

  2. 堆栈正在下降。所以SP应该向左移动。 sub sp, sp, #CONST。在你的例子中,你实际上搞乱了父函数的数据。


  3. 如果您需要在Aarch64中使用

    保留实际LR的{​​{1}}
    x30


    从技术上讲,只能通过

    保留寄存器
    str         x30,        [sp,#-16]!
    

    但假设您的函数不调用任何其他子函数。但在这种情况下,为什么在地球上保存str x30, [sp,#-8] // sp is not changed here! but data is written in permitted area

    Aarch64也可以使用任何其他寄存器来执行函数返回。例如:

    LR


    如果您需要保留2个以上的寄存器,请使用@BitBank提供的示例


    最后,您无法修改mov x7, x30 // preserve LR blr .L.my.bloody.subroutine // blr will mess up LR/x30 ... ret x7 // returning from function by using preserved req ,因此只有一种方法可以使用pc

    返回