【问题标题】:x64 Assembly GNU syntax, how the loop returnsx64 汇编 GNU 语法,循环如何返回
【发布时间】:2017-11-20 13:57:53
【问题描述】:

这是一个使用 Assembler x64 GNU 语法的程序

    .global main
    .text
main: 
    xor  %rax, %rax
    mov  %rax, %rbx

.L1:
    add  $1, %rbx
    add  %rbx, %rax
    cmp  $10, %rbx
    jne  .L1
    ret

我手动执行了循环,我发现当循环终止时,返回函数 (ret)、rbx = 10 和 rax = 45,但我不明白它们是如何返回主函数的,以及会发生什么他们什么时候回去?

【问题讨论】:

  • x86 ISA 本身没有返回值的概念。返回值如何返回(如果有的话)只是一个约定,但通常,rax 中的任何内容都用作返回值。
  • 所以基本上最后 rax=45 和 rbx=10 就是这样,对吧?
  • 是的。另请注意,标准调用约定说rbx 是一个被调用者保存的寄存器,因此您应该真正保留它的值。
  • 清除 rax 使用 xor %eax, %eax。 xor %rax, %rax waste a byte
  • @Dan 请阅读上面的链接,它确实清除了整个 64 位寄存器。 Almost all 32-bit instructions clear the top 32 bits in x86_64

标签: assembly x86-64 att


【解决方案1】:

ret 指令不会返回到主程序,但它会返回从主程序 以开始终止您的程序。您编写的循环不是一个函数,您只是跳回到代码的前一行,您不需要使用 ret 指令终止它。虽然你需要那个 ret 来终止你的程序。

要回答有关您的价值观去向的问题,它们不会去任何地方。如果我们稍微简化一些事情并且不考虑上下文切换,那么您的值将物理存储在寄存器中,直到您或其他一些代码在函数调用的情况下重用它们。要了解在函数调用时如何处理寄存器以及如何将参数传递给函数,请查看调用约定。

【讨论】:

  • 谢谢!,我还有一个问题,64位CPU支持的常见寻址模式有哪些?
  • 不客气!关于寻址模式,有比我在评论中可能写的更好的文本来阅读,所以我会推荐我从中学到的文本。 Jonathan Bartlett 的 Programming from the Ground Up 是一本非常不错的入门书籍,它是免费的,它涵盖了 32 位 Linux 编程,但就寻址模式而言,它并不重要。阅读称为寻址模式的部分应该可以阐明这个概念。
  • @Dan:见stackoverflow.com/questions/34058101/…(答案使用NASM语法,但AT&T语法可以表达所有相同的寻址模式。)x86-64中的新寻址模式是RIP-relative,并且非常对于与位置无关的代码很有用。顺便说一句,有关指南/文档(包括 PGU 书籍)的更多链接,请参阅 stackoverflow.com/tags/x86/info。
猜你喜欢
  • 2011-12-28
  • 2014-06-19
  • 2012-01-08
  • 2015-02-13
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
相关资源
最近更新 更多