; show_ESP.asm ; A program that displays how esp changes at run time. ; Program displays magnitude of esp changes when 16-bit and 32-bit values ; are pushed on the stack. .386 .MODEL FLAT ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD INCLUDE IO.H ; header file for input/output cr EQU 0dh ; carriage return character Lf EQU 0ah ; line feed .STACK 4096 ; reserve 4096-byte stack .DATA ; reserve storage for data orig_SP DWORD ? info16 BYTE "16-bit value diff: ", 0 info32 BYTE "32-bit value diff: ", 0 result BYTE 11 DUP (?), 0 endl BYTE cr, Lf, 0 .CODE ; start of main program code _main: ; First experiment with 16-bit value mov eax, esp ; get esp mov [orig_SP], eax ; remember esp value push ax ; esp decreases by 2 sub eax, esp ; calculate number of bytes on the stack add esp, 2 ; restore esp without pop dtoa result, eax ; convert to ASCII characters output info16 ; output info output result ; output result output endl ; output end of line ; Second experiment with 32-bit value push eax ; esp decreases by 4 mov eax, [orig_SP] ; get esp value sub eax, esp ; calculate number of bytes on the stack add esp, 4 ; restore esp without pop dtoa result, eax ; convert to ASCII characters output info32 ; output info output result ; output result output endl ; output end of line INVOKE ExitProcess, 0 ; exit with return code 0 END _main ; end of source code and public entry point ; The program generates output: ; 16-bit value diff: 2 ; 32-bit value diff: 4