; Program that demonstrates C-style procedure manipulating
; C-like LOCAL variables on the stack.

.386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD

.CODE                           ; start of main program code
_start:
        mov     eax, 10         ; Load data into EAX
        push    eax             ; Push first argument
        call    subtract6       ; push address of next instruction
                                ; onto the stack, and pass control
                                ; to the address of subtract6
        add     sp, 4           ; Destroy the pushed arguments
                                ; (equivalent to one pop)
        INVOKE  ExitProcess, 0  ; exit with return code 0

PUBLIC _start                   ; make entry point public

subtract6 PROC NEAR32 C arg:DWORD
        LOCAL   counter:DWORD
        mov     counter, 6      ; Initialize local variable with 6
        mov     eax, counter    ; put value in EAX
        sub     arg, eax        ; Subtract value from the 1st argument
        mov     eax, arg        ; put result in EAX
        ret                     ; Return result in EAX
subtract6 ENDP

END                             ; end of source code

; Compiled as:
;
; 0040104C B8 0A000000    MOV EAX,0A
; 00401051 50             PUSH EAX
; 00401052 E8 0B000000    CALL main._subtract6
; 00401057 66:83C4 04     ADD SP,4
; 0040105B 6A 00          PUSH 0
; 0040105D E8 98030000    CALL main._ExitProcess@4
; 00401062 55             PUSH EBP
; 00401063 8BEC           MOV EBP,ESP
; 00401065 83C4 FC        ADD ESP,-4
; 00401068 C745 FC 06000000   MOV DWORD PTR SS:[EBP-4],6
; 0040106F 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
; 00401072 2945 08        SUB DWORD PTR SS:[EBP+8],EAX
; 00401075 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]
; 00401078 C9             LEAVE
; 00401079 C3             RETN
;