c - 关于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) 分配了一个值,或者该寄存器是否在第一个代码片段期间被清空,并且在这种情况下只是被用作通用寄存器。
解决方案
不,它没有为c
.
参数的值被移动到堆栈中。具体来说, 中的值rdx
被复制到-48(%rbp)
。所以当编译器想要改变 的值时c
,它会写入-48(%rbp)
。
在后面的代码中,rdx
只是用作临时寄存器。
推荐阅读
- react-native - 如何在博览会中启用自动重新加载?
- python - 不了解 Django 表单并使用,有没有办法忽略它们并仍然保存表单中上传的文件?
- ios - 为什么物体检测会导致找到多个物体?
- api - 在 react-native 中集成 Easypaisa
- laravel - Laravel 5.8 通过控制器构造函数将数据添加到布局变量
- javascript - 如何在javascript中的exec中声明全局数组
- tsql - TSQL 窗口函数
- python - 连接字符串以获取变量名 Python
- javascript - Javascript:从数组中删除元素
- python - 如何使用列表理解正确提取图像数据