反汇编简单二进制文件时这些额外的指令是什么?
What are these extra instructions when disassembling simple binary?
这是一个有点菜鸟的问题...这里有一些背景知识。
我正在学习汇编,所以我写了一个非常简单的 C 程序,用 gcc -m32 -O0 -o prog.elf
编译它,然后用 运行 objdump 反对它 objdump -M intel -d prog.elf
.
C代码为:
#include <stdio.h>
int main() {
int a = 1;
int b = 2;
a = a + b;
return (0);
}
这看起来很简单。生成的英特尔程序集(带有我的评论)是:
push ebp ; Push previous stack frame.
mov ebp, esp ; Move SP to EBP to set new stack frame.
sub esp, 0xc ; Reserve 0xc bytes for local variables.
xor eax, eax ; Clear eax.
mov DWORD PTR [ebp-0x4], 0x0 ; Move 0x0 into local variable ebp-0x4.
mov DWORD PTR [ebp-0x8], 0x1 ; Move 0x1 into local variable ebp-0x8.
mov DWORD PTR [ebp-0xc], 0x2 ; Move 0x2 into local variable ebp-0xc.
mov ecx, DWORD PTR [ebp-0x8] ; Move local variable ebp-0x8 into ecx.
add ecx, DWORD PTR [ebp-0xc] ; Add local variable ebp-0xc to ecx.
mov DWORD PTR [ebp-0x8], ecx ; Move value of ecx into local variable ebp-0x8.
add esp, 0xc ; Set SP back to location before.
pop ebp ; Restore base pointer.
ret ; Return
我的问题是,ebp-0x4在那里做什么?它似乎没有做任何事情。
我会猜测并说它来自 main() 的参数,它没有,但出于某种原因,如果提供 none,它仍然将 0x0 作为参数推送?
还有,为什么xor eax,eax好像没有用...
我只是对他们为什么在那里感到有点困惑。
如果有人能帮助我理解为什么那会很棒。提前致谢!
我不确定您认为 xor eax, eax
未被使用的原因,这是将 eax
设置为零的简单方法。由于它通常是函数中的 return 代码,因此它等同于您的 return 0;
(顺便说一下不需要括号)。
至于为什么 ebp-0x4
在那里,我不能说。我 会 说其余的代码很好而且确实没有优化,所以它可能只是编译过程的产物。它可能会在更高的优化级别消失,特别是因为整个功能基本上可以用您认为多余的一行替换:-)
这是一个有点菜鸟的问题...这里有一些背景知识。
我正在学习汇编,所以我写了一个非常简单的 C 程序,用 gcc -m32 -O0 -o prog.elf
编译它,然后用 运行 objdump 反对它 objdump -M intel -d prog.elf
.
C代码为:
#include <stdio.h>
int main() {
int a = 1;
int b = 2;
a = a + b;
return (0);
}
这看起来很简单。生成的英特尔程序集(带有我的评论)是:
push ebp ; Push previous stack frame.
mov ebp, esp ; Move SP to EBP to set new stack frame.
sub esp, 0xc ; Reserve 0xc bytes for local variables.
xor eax, eax ; Clear eax.
mov DWORD PTR [ebp-0x4], 0x0 ; Move 0x0 into local variable ebp-0x4.
mov DWORD PTR [ebp-0x8], 0x1 ; Move 0x1 into local variable ebp-0x8.
mov DWORD PTR [ebp-0xc], 0x2 ; Move 0x2 into local variable ebp-0xc.
mov ecx, DWORD PTR [ebp-0x8] ; Move local variable ebp-0x8 into ecx.
add ecx, DWORD PTR [ebp-0xc] ; Add local variable ebp-0xc to ecx.
mov DWORD PTR [ebp-0x8], ecx ; Move value of ecx into local variable ebp-0x8.
add esp, 0xc ; Set SP back to location before.
pop ebp ; Restore base pointer.
ret ; Return
我的问题是,ebp-0x4在那里做什么?它似乎没有做任何事情。 我会猜测并说它来自 main() 的参数,它没有,但出于某种原因,如果提供 none,它仍然将 0x0 作为参数推送? 还有,为什么xor eax,eax好像没有用...
我只是对他们为什么在那里感到有点困惑。 如果有人能帮助我理解为什么那会很棒。提前致谢!
我不确定您认为 xor eax, eax
未被使用的原因,这是将 eax
设置为零的简单方法。由于它通常是函数中的 return 代码,因此它等同于您的 return 0;
(顺便说一下不需要括号)。
至于为什么 ebp-0x4
在那里,我不能说。我 会 说其余的代码很好而且确实没有优化,所以它可能只是编译过程的产物。它可能会在更高的优化级别消失,特别是因为整个功能基本上可以用您认为多余的一行替换:-)