我对汇编语言很陌生,正在努力学习。我正在上一门课程来学习它,他们提到了一个非常补救的Hello World示例,我对其进行了分解。
原始c文件:
#include <stdio.h>
int main()
{
printf("Hello Students!");
return 0;
}
这是使用以下命令反编译的:
C:> objdump -d -Mintel HelloStudents.exe > disasm.txt
拆卸(组装):
push ebp
mov ebp, esp
and esp, 0xfffffff0
sub esp, 0x10
call 401e80 <__main>
mov DWORD PTR [esp], 0x404000
call 4025f8 <_puts>
mov eax, 0x0
leave
ret
将分解后的输出映射到原始C文件时遇到问题,有人可以提供帮助吗?
非常感谢!
将汇编反编译为C的技术术语是“将汉堡包转换为母牛”。生成的程序集将是源代码的一对一转换,并且根据优化级别的不同可能会有所不同。您将获得功能上与原始来源相同的内容,但是在结构上与原始来源的相似程度差异很大。 请不要发布objdump
输出的图像-将文本复制并粘贴到您的问题正文中,因为现在我必须手动输入所有内容。任何错别字都是我的错:
push ebp
mov ebp, esp
and esp, 0xfffffff0
sub esp, 0x10
call 401e80, <___main>
全部为前言,为main
功能设置堆栈帧。
mov DWORD PTR [esp], 0x404000
这会推送字符串字面量“ Hello Students!”的地址。进入堆栈。
call 4025f8 <_puts>
这将调用puts
功能。编译器意识到在printf
调用中没有进行任何格式处理,因此将其替换为更简单的puts
调用。
mov eax, 0x0
main
的返回值被加载到eax
寄存器中
leave
ret
退出功能并恢复之前的堆栈帧。