【发布时间】: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, %raxwaste a byte -
@Dan 请阅读上面的链接,它确实清除了整个 64 位寄存器。 Almost all 32-bit instructions clear the top 32 bits in x86_64