Почему функция printf вызывает смену пролога?GCC сборка
С code_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 code_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] (https://godbolt.org/g/OyxeLq) -Tool может помочь вам в анализе. – Frodo
Я использую Godbolt. Эта сборка создается на Godbolt :) –