拆卸简单二进制文件时这些额外的指令是什么?

时间:2017-03-31 09:15:56

标签: gcc assembly reverse-engineering disassembly objdump

这是一个小小的问题...这里有一点背景知识。 我正在学习汇编,所以我编写了一个非常简单的C程序,用gcc -m32 -O0 -o prog.elf编译它,然后使用objdump -M intel -d prog.elf对它进行objdump。

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()的参数,它没有,但由于某种原因,如果没有提供它仍会推动0x0作为参数? 另外,为什么 xor eax,eax 似乎没有被使用......

我对他们为什么会在那里感到有些困惑。 如果有人能帮助我理解为什么那会很棒。提前谢谢!

1 个答案:

答案 0 :(得分:3)

我不确定您认为xor eax, eax未被使用的原因,这是将eax设置为零的简单方法。由于它通常是函数的返回代码,因此它将等同于return 0;(顺便说一下,它不需要括号)。

至于为什么ebp-0x4存在,我无法说出来。我说其余的代码完好无误,因此它可能只是编译过程中的一个人工制品。它可能会在更高的优化级别上消失,特别是因为整个函数基本上可以替换为您认为多余的一行: - )