gpt4 book ai didi

c - x86_64 汇编程序中 RBP 寄存器的用途是什么?

转载 作者:太空狗 更新时间:2023-10-29 16:19:45 24 4
gpt4 key购买 nike

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

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

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

我有两个问题:

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

我在虚拟机(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/

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