c

您所在的位置:网站首页 双总是会变成RbP c

c

2024-07-10 14:27| 来源: 网络整理| 查看: 265

所以我正在尝试学习一点汇编,因为计算机体系结构类(class)需要它。我写了一些程序,比如打印斐波那契数列。

我认识到,每当我编写一个函数时,我都会使用这 3 行(正如我从 gcc 生成的汇编代码与其等效的 C 比较中了解到的):

pushq %rbp movq %rsp, %rbp subq $16, %rsp

我有两个问题:

首先,为什么我需要使用%rbp?使用 %rsp 不是更简单吗,因为它的内容被移动到第 2 行的 %rbp? 为什么我必须从 %rsp 中减去任何东西?我的意思是它并不总是 16,当我像 7 或 8 个变量一样 printf 时,我会减去 24 或 28。

我在虚拟机(4 GB 内存)、Intel 64 位处理器上使用 Manjaro 64 位

最佳答案

rbp 是 x86_64 上的帧指针。在您生成的代码中,它获取堆栈指针 (rsp) 的快照,以便在对 rsp 进行调整时(即为局部变量或 push 保留空间将值写入堆栈),局部变量和函数参数仍然可以从 rbp 的常量偏移量访问。

许多编译器提供省略帧指针作为优化选项;这将使生成的汇编代码访问相对于 rsp 的变量,并释放 rbp 作为另一个通用寄存器以供函数使用。

就 GCC 而言,我猜您使用的是 AT&T 汇编程序语法,该开关是 -fomit-frame-pointer。尝试用那个开关编译你的代码,看看你得到了什么汇编代码。您可能会注意到,当访问相对于 rsp 而不是 rbp 的值时,指针的偏移量在整个函数中变化。

关于c - x86_64 汇编程序中 RBP 寄存器的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41912684/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3