gpt4 book ai didi

assembly - ARM:为什么我需要在函数调用时压入/弹出两个寄存器?

转载 作者:行者123 更新时间:2023-12-02 15:46:24 25 4
gpt4 key购买 nike

我知道我需要在函数调用开始时压入链接寄存器,并在返回之前将该值弹出到程序计数器,以便执行可以从函数调用之前的位置携带一个值。

我不明白的是为什么大多数人通过向推送/弹出添加额外的寄存器来做到这一点。例如:

push {ip, lr}
...
pop {ip, pc}

例如,这是 ARM 中的 Hello World,由 official ARM blog 提供。 :

.syntax unified

@ --------------------------------
.global main
main:
@ Stack the return address (lr) in addition to a dummy register (ip) to
@ keep the stack 8-byte aligned.
push {ip, lr}

@ Load the argument and perform the call. This is like 'printf("...")' in C.
ldr r0, =message
bl printf

@ Exit from 'main'. This is like 'return 0' in C.
mov r0, #0 @ Return 0.
@ Pop the dummy ip to reverse our alignment fix, and pop the original lr
@ value directly into pc — the Program Counter — to return.
pop {ip, pc}

@ --------------------------------
@ Data for the printf calls. The GNU assembler's ".asciz" directive
@ automatically adds a NULL character termination.
message:
.asciz "Hello, world.\n"

问题 1:他们所说的“虚拟寄存器”的原因是什么?为什么不简单地push{lr} 和pop{pc} 呢?他们说这是为了保持堆栈8字节对齐,但堆栈不是4字节对齐吗?

问题 2:“ip”是什么寄存器(即 r7 还是什么?)

最佳答案

8 字节对齐是符合 AAPCS 的对象之间的互操作性的要求。

ARM 有关于此主题的咨询说明:

ABI for the ARM® Architecture Advisory Note – SP must be 8-byte aligned on entry to AAPCS-conforming functions

文章提到了使用 8 字节对齐的两个原因

  • 对齐错误或不可预测的行为。 (硬件/架构相关原因 - LDRD/STRD 可能会导致对齐错误或在 ARMv7 以外的架构上显示不可预测的行为)

  • 应用程序失败。 (编译器-运行时假设差异,他们以va_startva_arg为例)

当然,这都是关于公共(public)接口(interface)的,如果您正在制作一个没有额外链接的静态可执行文件,您可以将堆栈对齐到 4 个字节。

关于assembly - ARM:为什么我需要在函数调用时压入/弹出两个寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16120123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com