首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ARM Arch64中推送{lr}和弹出{lr

在ARM Arch64中推送{lr}和弹出{lr
EN

Stack Overflow用户
提问于 2015-01-14 18:54:50
回答 2查看 5.7K关注 0票数 3

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

STR X30, [SP, #8]是正确的吗?您能解释一下维护堆栈对齐的概念吗?我是ARMv8的新手,所以请原谅。

EN

回答 2

Stack Overflow用户

发布于 2015-01-14 21:53:07

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

代码语言:javascript
复制
   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
票数 8
EN

Stack Overflow用户

发布于 2015-12-29 13:07:17

STR X30, [SP, #8]是完全错误的。

  1. 关于Aarch64栈最重要的一点是SP 必须是16字节的aligned.
  2. Stack是递减的。所以SP应该向左移动。sub sp, sp, #CONST。在您的示例中,您实际上弄乱了父函数的数据。

如果需要保留Aarch64中实际为x30 LR,请使用

代码语言:javascript
复制
str         x30,        [sp,#-16]!

从技术上讲,只有通过以下方式才能在寄存器上保留

代码语言:javascript
复制
str         x30,        [sp,#-8]  // sp is not changed here! but data is written in permitted area

但假设您的函数不调用任何其他子函数。但在这种情况下,为什么要拯救LR呢?

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

代码语言:javascript
复制
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

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

最后,您不能修改pc,因此只有一种方法可以使用ret返回

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27941220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档