首页 > 解决方案 > 关于x86-64汇编语言中局部变量寄存器的问题

问题描述

我的任务是将 x86-64 汇编代码转换回简单的 C 函数。我正在使用的 C 函数有 4 个参数(long a、long b、long c、long d)。正如所料,汇编代码的开头是

movq   %rdi, -32(%rbp)
movq   %rsi, -40(%rbp)
movq   %rdx, -48(%rbp)
movq   %rcx, -56(%rbp)

稍后在代码中再次使用这些寄存器,例如

movq   -40(%rbp), %rax
imulq  -48(%rbp), %rax
movq   %rax, %rdx
movq   -32(%rbp), %rax
addq   %rdx, %rax
movq   %rax, -24(%rbp)

我的问题是,上面的代码是否在第三行为 (long c) 分配了一个值,或者该寄存器是否在第一个代码片段期间被清空,并且在这种情况下只是被用作通用寄存器。

标签: cassemblyx86-64

解决方案


不,它没有为c.

参数的值被移动到堆栈中。具体来说, 中的值rdx被复制到-48(%rbp)。所以当编译器想要改变 的值时c,它会写入-48(%rbp)

在后面的代码中,rdx只是用作临时寄存器。


推荐阅读