c - GCC编译的二进制文件中的冗余寄存器值?
问题描述
好的,所以我正在尝试学习逆向工程和 x64 汇编。例如,我用 C 编写了这个小测试程序:
#include <stdio.h>
int square(int num) {
return num * num;
}
int main() {
int ans = square(5);
printf("%d", ans);
}
这导致该square
函数的以下汇编代码:
push rbp
mov rbp,rsp
mov DWORD PTR [rbp-0x4],edi
mov eax,DWORD PTR [rbp-0x4]
imul eax,eax
pop rbp
ret
这对我来说似乎有点奇怪,就像edi
函数参数一样,我相信它会存储在堆栈中并加载回eax
,然后在其中相乘?为什么不跳过第 3 行和第 4 行imul edi, edi
呢?
所以我打开了radare2并做到了,但现在程序返回看似随机的数字,我猜是内存地址?
有人可以向我解释为什么 GCC 使用这个看似多余的寄存器,以及我在尝试修补二进制文件时做错了什么?
解决方案
推荐阅读
- woocommerce-theming - Woocommerce - 有人可以给我一个真实世界的例子,在像 WP_Query 这样的循环中使用“WC_Product_Query”
- latitude-longitude - 如何从 tmap 获取世界地图上每个 x,y 点的纬度经度?
- sql-server - 只返回一行值的存储过程
- javascript - 在 Axios 中禁用 SSL
- javascript - 如何启动大型nodejs项目虚拟教室?
- laravel - Laravel 雄辩的破坏重定向问题
- javascript - 如何从路径字符串更改 Redux 状态?
- arrays - 通过 BehaviorSubject Angular 将数组发送到不同的组件
- oracle - Oracle Apex 19.2:无法解决“模式被保留或受限”问题
- javascript - 尝试使用递归解决斐波那契 (javascript)