【问题标题】:x86-64 GNU Assemblyx86-64 GNU 程序集
【发布时间】:2012-03-11 20:29:22
【问题描述】:

在调查崩溃时,我遇到了以下代码 sn-p 并立即意识到 mov 指令实际上应该是 movq 以获得正确的 64 位寄存器操作。

#elif defined(__x86_64__)
    unsigned long rbp;
    __asm__ volatile ("mov %%rbp, %0" : "=r" (rbp));
    sp = (void **) rbp;
#else

除此之外,我还发现文档声称 x86-64 的 rbp 寄存器是通用的,不包含当前帧的地址。我还发现文档声称rbp 确实包含当前帧的地址。有人可以澄清一下吗?

【问题讨论】:

标签: gnu x86-64 assembly


【解决方案1】:

关于您问题的第一部分(movq 而不是mov),汇编器(在这种情况下)将识别出您的操作数是 64 位,并将正确使用 movqmov 不是有效指令,它是一种告诉汇编器“根据操作数使用正确的 mov 变体”的方法。

关于第二部分,它实际上是两者:它是一个通用寄存器,从某种意义上说它可以保存任何值。它也用作堆栈帧基指针。 AMD64 Application programming 手册的“2.4 堆栈操作”部分说:

堆栈是内存中堆栈段的一部分,用于链接 程序。软件约定通常使用 堆栈帧,由两个寄存器组成——一个堆栈帧基 指针(rBP)和堆栈指针(rSP)——

【讨论】:

猜你喜欢
  • 2014-08-07
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 2018-03-30
  • 1970-01-01
  • 2012-02-07
相关资源
最近更新 更多