我想知道如何在我的C源文件中使用GCC来转储机器代码的助记符版本,以便我可以看到我的代码被编译成什么.您可以使用Java执行此操作,但我无法找到GCC的方法.
我试图在汇编中重新编写一个C方法,看看GCC是如何做的,这将是一个很大的帮助.
Heyo,
我已经编写了这个非常基本的主要功能来试验反汇编,还可以看到并希望了解更低层次的情况:
int main() {
return 6;
}
Run Code Online (Sandbox Code Playgroud)
使用gdb来disas main产生这个:
0x08048374 <main+0>: lea 0x4(%esp),%ecx
0x08048378 <main+4>: and $0xfffffff0,%esp
0x0804837b <main+7>: pushl -0x4(%ecx)
0x0804837e <main+10>: push %ebp
0x0804837f <main+11>: mov %esp,%ebp
0x08048381 <main+13>: push %ecx
0x08048382 <main+14>: mov $0x6,%eax
0x08048387 <main+19>: pop %ecx
0x08048388 <main+20>: pop %ebp
0x08048389 <main+21>: lea -0x4(%ecx),%esp
0x0804838c <main+24>: ret
Run Code Online (Sandbox Code Playgroud)
这是我最好的猜测,我认为正在发生什么以及我需要逐行帮助:
lea 0x4(%esp),%ecx
将esp + 4的地址加载到ecx中.为什么我们为esp添加4?
我在某处读到这是命令行参数的地址.但是当我这样做时,x/d $ecx我得到了argc的值.存储的实际命令行参数值在哪里?
and $0xfffffff0,%esp
对齐堆栈
pushl -0x4(%ecx)
将esp最初的地址推入堆栈.这样做的目的是什么?
push %ebp
将基指针推入堆栈
mov %esp,%ebp
将当前堆栈指针移动到基指针中
push %ecx …