Recently I was try to experiment with some calling conventions and I wanted to look at the assembly code,
to better understand the behavior.
There are couple of ways.
1. Look the dis-assembly while debugging.
2. use the very cool ollydbg!
3. Generate one for yourself while building the binary!!
That is where the magical compiler -FAs switch comes in the play.
Following was the code I test it with
***********************************************************************
my 'C' code
void foo()
{
printf("in foo");
}
// This code is compiled using compiler flag -FAs switch to generate and equivalent ASM code
int _tmain(int argc, _TCHAR* argv[])
{
foo();
return 0;
}
************************************************************************
************************************************************************
Generated Assembly code(I have only shown the main portion of the code)
PUBLIC _wmain
; Function compile flags: /Odtp /RTCsu /ZI
; COMDAT _wmain
_TEXT SEGMENT
_argc$ = 8 ; size = 4
_argv$ = 12 ; size = 4
_wmain PROC ; COMDAT
; 16 : {
push ebp
mov ebp, esp
sub esp, 192 ; 000000c0H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-192]
mov ecx, 48 ; 00000030H
mov eax, -858993460 ; ccccccccH
rep stosd
; 17 : foo();
call ?foo@@YAXXZ ; foo //call to foo
; 18 : return 0;
xor eax, eax
; 19 : }
pop edi
pop esi
pop ebx
add esp, 192 ; 000000c0H
cmp ebp, esp
call __RTC_CheckEsp
mov esp, ebp
pop ebp
ret 0
*******************************************************************************************
Nevertheless a nice way to look at the Assembly code!