assembly Ubuntu上的System V ABI将返回地址放在调用方函数的框架内还是被调用方函数的框架内?

s4n0splo  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(132)

我的系统:Ubuntu 22.04.3运行在x86_64上。GCC版本11.4.0
我问这个问题是因为就返回地址所在的框架(调用者或被调用者)而言,似乎有两种不同的返回地址表示。
这就是“计算机系统,程序员的视角”所展示的:

这就是“System V应用二进制接口AMD 64架构处理器补充”所显示的内容:

正如您在System V ABI文档表示中所看到的,我们在当前框架(被调用者/被调用者函数)中有返回地址,但在图书表示中,它在调用者框架(调用者函数)中。
以下是我的问题:
1.什么样的陈述是正确的?
1.返回地址在特定框架(调用者或被调用者)中的搭配是否只是一个任意的愚蠢问题,而不是由任何ABI指定的?

cfh9epnr

cfh9epnr1#

返回地址由调用方推送,但在函数完成并返回给调用方时由被调用方弹出,因此堆栈上的返回地址仅在被调用方激活期间存在。
因为当被调用方返回时,返回地址被删除了,调用方看不到或使用它,我认为它不是调用方堆栈帧的一部分。因此,我不得不将其视为被调用方框架的一部分
正如其他人所说,这只是语义学。重要的是操作(例如,谁弹出)和值(地址指向哪里)。
然而,一般来说,要回答某个东西属于哪个框架的问题,我会问:该存储持续多长时间以及谁将其从堆栈弹出(即,谁真正负责这个存储)。
当被调用方返回时,堆栈上剩余的内容属于调用方。

相关问题