【发布时间】:2017-04-29 15:14:22
【问题描述】:
为什么printf函数会导致prologue的变化?
C 代码_1:
#include <cstdio>
int main(){
int a = 11;
printf("%d", a);
}
GCC -m32 生成一个:
.LC0:
.string "%d"
main:
lea ecx, [esp+4] // What's purpose of this three
and esp, -16 // lines?
push DWORD PTR [ecx-4] //
push ebp
mov ebp, esp
push ecx
sub esp, 20 // why sub 20?
mov DWORD PTR [ebp-12], 11
sub esp, 8
push DWORD PTR [ebp-12]
push OFFSET FLAT:.LC0
call printf
add esp, 16
mov eax, 0
mov ecx, DWORD PTR [ebp-4]
leave
lea esp, [ecx-4]
ret
C 代码_2:
#include <cstdio>
int main(){
int a = 11;
}
GCC -m32:
main:
push ebp
mov ebp, esp
sub esp, 16
mov DWORD PTR [ebp-4], 11
mov eax, 0
leave
ret
在第一个代码中添加前三行的目的是什么? 请解释一下第一个汇编代码,如果可以的话。
编辑:
64 位模式:
.LC0:
.string "%d"
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov DWORD PTR [rbp-4], 11
mov eax, DWORD PTR [rbp-4]
mov esi, eax
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
mov eax, 0
leave
ret
【问题讨论】:
-
也许Godbolt-Tool 可以帮助您进行分析。
-
我正在使用 Godbolt。这个程序集是在 Godbolt 上生成的 :)
标签: c++ c gcc assembly reverse-engineering