MSVC와 GCC의 인자 스택 저장 방식 차이점
source code
#include <stdio.h>
int main()
{
printf("a=%d; b=%d; c=%d", 1, 2, 3);
return 0;
}
MSVC와 GCC가 생성한 코드에서 인자를 스택에 저장하는 방식에 차이점을 보이는 데, GCC는 PUSH/POP을 사용하지 않고 직접 스택에 접근하여 처리하는 것을 볼 수 있다.
MSVC
push ebp
mov ebp, esp
push 3
push 2
push 1
push OFFSET $SG5328
call _printf
add esp, 16 ; 00000010H
xor eax, eax
pop ebp
ret 0
GCC
push ebp
mov ebp, esp
and esp, -16
sub esp, 16
call ___main
mov DWORD PTR [esp+12], 3
mov DWORD PTR [esp+8], 2
mov DWORD PTR [esp+4], 1
mov DWORD PTR [esp], OFFSET FLAT:LC0
call _printf
mov eax, 0
leave
ret