; Program that demonstrates C-style procedure manipulating ; C-like LOCAL array 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 myproc ; push address of next instruction ; onto the stack, and pass control ; to the address of myproc 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 myproc PROC NEAR32 C USES edi, arg:DWORD ARRAY_SIZE EQU 20 LOCAL myarray[ ARRAY_SIZE ] : BYTE ; For 32-bit protected mode flat model, all segments are congruent ; and thus ES does not need to be specified explicitly, so the segment ; modification is done here only for the purpose of demonstration: push ss pop es ; Set ES=SS lea edi, myarray ; ES:EDI now points to beginning of myarray mov ecx, ARRAY_SIZE ; Load count sub al, al ; set AL equal to zero rep stosb ; Store zeros from AL in [ES:DI] mov eax, ARRAY_SIZE ; put size result in EAX ; use array: mov ebx, 9 mov myarray[ebx], 5 ; set 10th array element equal 5 ret ; Return result in EAX myproc ENDP END ; end of source code ; Compiled: ; ; 0040104C B8 0A000000 MOV EAX,0A ; 00401051 50 PUSH EAX ; 00401052 E8 0B000000 CALL main._myproc ; 00401057 66:83C4 04 ADD SP,4 ; 0040105B 6A 00 PUSH 0 ; ExitCode = 0 ; 0040105D E8 AC030000 CALL main._ExitProcess@4 ; ExitProcess ; 00401062 55 PUSH EBP ; 00401063 8BEC MOV EBP,ESP ; 00401065 83C4 EC ADD ESP,-14 ; 00401068 57 PUSH EDI ; 00401069 16 PUSH SS ; 0040106A 07 POP ES ; Modification of segment register ; 0040106B 8D7D EC LEA EDI,DWORD PTR SS:[EBP-14] ; 0040106E B9 14000000 MOV ECX,14 ; 00401073 2AC0 SUB AL,AL ; 00401075 F3:AA REP STOS BYTE PTR ES:[EDI] ; 00401077 B8 14000000 MOV EAX,14 ; 0040107C BB 09000000 MOV EBX,9 ; 00401081 36:C6442B EC 05 MOV BYTE PTR SS:[EBX+EBP-14],5 ; 00401087 5F POP EDI ; 00401088 C9 LEAVE ; 00401089 C3 RETN ;