x86 assembly dump sample

on a 32 bit x86 (i386) assembly code sample
little endian data model, cisc instruction set, code/data not necessarily aligned

information and source on this sqfigb.exe dump sample can be found at sqfig.html


general notes

most source code related information (source code file names, number of source code files, etc) and symbol information (global and local function names, etc) has been stripped on this sample [that information is not so much of interest for our current considerations; sources with that information can however be found here]

as output from an optimizing c compiler, stack frames (pointed to by register ebp) are mostly omitted and stack accesses are somewhat minimized in favor of register accesses

standard [c] library is linked dynamically, i.e. this dump does not contain such code [however a little startup code is part of this sample]

optimizations observed

shorter bytecodes are often used to use the code cache more efficiently (and save space in the executable images); samples are xor eax,eax [clear register] instead of e.g. mov eax,0 and or eax,0FFh instead of mov eax,-1

pseudo three operands opcodes like lea ecx,dword ptr [esi+1] [short for add ecx,esi,1] are e.g. used to reduce the number of opcodes; an even a bit more complex statement is lea ecx,dword ptr [esp+edx*4+18h]

more compact stack adjust like push ecx as a substitute for sub esp,4 is sometimes used to adjust the stack for a local variable

function realignment [to 16 bytes boundaries] is often used to allow more efficient use of cache and paging

delayed opcodes [opcode reordering] is sometimes seen and might improve parallel pipelines behavior [opcode pairing]

code repetition is used to have less jumps, for speed


section #1 .text
code execute read [60000020]
401000: 6A 20 push 20h // function argument
 E8 09 00 00 00 call 401010
 83 C4 04 add esp,4 // stack restore after c-style call
 33 C0 xor eax,eax // clear register
 C3 ret // c-style return from procedure
401010: 51 push ecx // adjust stack for local variables
 53 push ebx // | [shorter version than sub esp,...]
 8B 5C 24 0C mov ebx,dword ptr [esp+0Ch] // function argument
 56 push esi // save non-volatile registers
 33 F6 xor esi,esi
 85 DB test ebx,ebx // compare to zero [instead cmp ebx,0]
 7E 3F jle 40105C // | [zero looping special case]
 57 push edi // save some more non-volatile registers
 8B 3D 84 40 40 00 mov edi,dword ptr ds:[404084h] // printf
401024: 56 push esi
 68 1C 20 40 00 push 40201Ch // c string literal
 FF D7 call edi // indirect call
 83 C4 08 add esp,8
 8D 44 24 14 lea eax,dword ptr [esp+14h] // stack variable address
 8D 4C 24 0C lea ecx,dword ptr [esp+0Ch]
 50 push eax // [parameter reused as variable]
 51 push ecx
 56 push esi
 E8 F1 04 00 00 call 401530
 8B 54 24 20 mov edx,dword ptr [esp+20h]
 8B 44 24 18 mov eax,dword ptr [esp+18h]
 83 C4 0C add esp,0Ch // [delayed stack cleanup]
 52 push edx
 50 push eax
 68 00 20 40 00 push 402000h
 FF D7 call edi
 83 C4 0C add esp,0Ch
 46 inc esi // [for-]loop increment
 3B F3 cmp esi,ebx
 7C C9 jl 401024 // loop jump
 5F pop edi // restore non-volatile registers
40105C: 5E pop esi // |
 5B pop ebx
 59 pop ecx
 C3 ret
401060: 81 EC 88 00 00 00 sub esp,88h // get stack area for local data
 56 push esi
 8B B4 24 90 00 00 00 mov esi,dword ptr [esp+90h]
 8D 44 24 0C lea eax,dword ptr [esp+0Ch]
 56 push esi
 50 push eax
 E8 77 08 00 00 call 4018F0
 83 C4 08 add esp,8
 8D 44 24 04 lea eax,dword ptr [esp+4]
 8D 8C 24 94 00 00 00 lea ecx,dword ptr [esp+94h]
 8D 94 24 98 00 00 00 lea edx,dword ptr [esp+98h]
 50 push eax
 68 D0 14 40 00 push 4014D0h // function pointer
 89 4C 24 0C mov dword ptr [esp+0Ch],ecx
 56 push esi
 56 push esi
 8D 4C 24 1C lea ecx,dword ptr [esp+1Ch]
 56 push esi
 51 push ecx
 89 54 24 20 mov dword ptr [esp+20h],edx
 E8 17 00 00 00 call 4010C0
 83 C4 18 add esp,18h
 5E pop esi
 81 C4 88 00 00 00 add esp,88h // stack cleanup
 C3 ret
4010C0: 53 push ebx // [realigned to 16 byte boundaries]
 8B 5C 24 08 mov ebx,dword ptr [esp+8]
 56 push esi
 8B 74 24 14 mov esi,dword ptr [esp+14h]
 57 push edi
 8B 7C 24 14 mov edi,dword ptr [esp+14h]
 85 F6 test esi,esi
 7E 0A jle 4010DD
 57 push edi
 53 push ebx
 E8 16 08 00 00 call 4018F0
 83 C4 08 add esp,8
4010DD: 8B 44 24 24 mov eax,dword ptr [esp+24h]
 8B 4C 24 20 mov ecx,dword ptr [esp+20h]
 8B 54 24 1C mov edx,dword ptr [esp+1Ch]
 50 push eax // [lots of function arguments]
 51 push ecx // |
 52 push edx // |
 6A 00 push 0 // |
 6A 00 push 0 // |
 56 push esi // |
 57 push edi // |
 53 push ebx // |
 E8 08 00 00 00 call 401100
 83 C4 20 add esp,20h
 5F pop edi
 5E pop esi
 5B pop ebx
 C3 ret
401100: 8B 44 24 18 mov eax,dword ptr [esp+18h]
 53 push ebx // save non-volatile registers
 55 push ebp // |
 56 push esi // |
 85 C0 test eax,eax
 57 push edi // save more non-volatile registers
 75 2A jne 401136 // delayed jump [to have uniform stack]
 8B 44 24 2C mov eax,dword ptr [esp+2Ch]
 85 C0 test eax,eax
 0F 84 CB 00 00 00 je 4011E3 // longer conditional jump
 8B 4C 24 30 mov ecx,dword ptr [esp+30h]
 8B 54 24 1C mov edx,dword ptr [esp+1Ch]
 51 push ecx
 8B 4C 24 1C mov ecx,dword ptr [esp+1Ch]
 52 push edx
 8B 54 24 1C mov edx,dword ptr [esp+1Ch]
 51 push ecx
 52 push edx
 FF D0 call eax // indirect [function pointer] call
 83 C4 10 add esp,10h
 5F pop edi // restore non-volatile registers
 5E pop esi // |
 5D pop ebp // |
 5B pop ebx // |
 C3 ret
401136: 8B 6C 24 20 mov ebp,dword ptr [esp+20h]
 8B 44 24 18 mov eax,dword ptr [esp+18h]
 8B 74 24 24 mov esi,dword ptr [esp+24h]
 3B E8 cmp ebp,eax // zero looping test [special case]
 0F 8D 99 00 00 00 jge 4011E3
 8B 44 24 14 mov eax,dword ptr [esp+14h]
 8D 3C A8 lea edi,dword ptr [eax+ebp*4] // array addressing
401151: 3B 74 24 1C cmp esi,dword ptr [esp+1Ch]
 7D 6E jge 4011C5
401157: 8B 1F mov ebx,dword ptr [edi]
 8B 44 24 28 mov eax,dword ptr [esp+28h]
 BA 01 00 00 00 mov edx,1 // nth bit
 8B CE mov ecx,esi // |
 D3 E2 shl edx,cl // |
 8B 4C 24 1C mov ecx,dword ptr [esp+1Ch]
 50 push eax
 8B 44 24 18 mov eax,dword ptr [esp+18h]
 56 push esi
 55 push ebp
 51 push ecx
 0B D3 or edx,ebx // set the bit
 89 17 mov dword ptr [edi],edx
 8B 54 24 28 mov edx,dword ptr [esp+28h]
 52 push edx
 50 push eax
 E8 6F 00 00 00 call 4011F0
 83 C4 18 add esp,18h
 83 F8 01 cmp eax,1
 74 31 je 4011BA // [c continue]
 83 F8 02 cmp eax,2
 74 4E je 4011DC
 8B 4C 24 30 mov ecx,dword ptr [esp+30h]
 8B 44 24 28 mov eax,dword ptr [esp+28h]
 8B 54 24 2C mov edx,dword ptr [esp+2Ch]
 51 push ecx
 48 dec eax
 52 push edx
 8B 54 24 24 mov edx,dword ptr [esp+24h]
 8D 4E 01 lea ecx,dword ptr [esi+1] // esi+1
 50 push eax
 8B 44 24 24 mov eax,dword ptr [esp+24h]
 51 push ecx
 8B 4C 24 24 mov ecx,dword ptr [esp+24h]
 55 push ebp
 52 push edx
 50 push eax
 51 push ecx
 E8 49 FF FF FF call 401100
 83 C4 20 add esp,20h
4011BA: 8B 44 24 1C mov eax,dword ptr [esp+1Ch] // loop increment
 46 inc esi
 3B F0 cmp esi,eax
 89 1F mov dword ptr [edi],ebx
 7C 92 jl 401157
4011C5: 8B 44 24 18 mov eax,dword ptr [esp+18h] // outer loop increment
 33 F6 xor esi,esi
 45 inc ebp
 83 C7 04 add edi,4
 3B E8 cmp ebp,eax
 0F 8C 7A FF FF FF jl 401151
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 C3 ret
4011DC: 8B 54 24 14 mov edx,dword ptr [esp+14h]
 89 1C AA mov dword ptr [edx+ebp*4],ebx
4011E3: 5F pop edi // [code repetition]
 5E pop esi // |
 5D pop ebp // |
 5B pop ebx // |
 C3 ret // |
4011F0: 8B 44 24 0C mov eax,dword ptr [esp+0Ch]
 8B 54 24 14 mov edx,dword ptr [esp+14h]
 53 push ebx
 55 push ebp
 8D 48 FF lea ecx,dword ptr [eax-1]
 56 push esi
 8B 74 24 1C mov esi,dword ptr [esp+1Ch]
 57 push edi
 8B 7C 24 14 mov edi,dword ptr [esp+14h]
 3B D1 cmp edx,ecx
 75 25 jne 401230
 8B 04 B7 mov eax,dword ptr [edi+esi*4] // array access
 85 C0 test eax,eax
 75 0A jne 40121C
 B8 01 00 00 00 mov eax,1
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 C3 ret
40121C: 85 F6 test esi,esi
 7E 10 jle 401230
 85 44 B7 FC test dword ptr [edi+esi*4-4],eax
 75 0A jne 401230
 B8 01 00 00 00 mov eax,1
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 C3 ret
401230: 85 D2 test edx,edx
 75 2B jne 40125F
 85 F6 test esi,esi
 7E 27 jle 40125F
 8B 44 B7 FC mov eax,dword ptr [edi+esi*4-4]
 85 C0 test eax,eax
 75 0A jne 40124A
 B8 02 00 00 00 mov eax,2
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 C3 ret
40124A: 83 FE 01 cmp esi,1
 7E 10 jle 40125F
 85 44 B7 F8 test dword ptr [edi+esi*4-8],eax
 75 0A jne 40125F
 B8 02 00 00 00 mov eax,2
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 C3 ret
40125F: 83 7C 24 28 01 cmp dword ptr [esp+28h],1
 75 29 jne 40128F
 3B D1 cmp edx,ecx
 74 25 je 40128F
 8B 04 B7 mov eax,dword ptr [edi+esi*4]
 85 C0 test eax,eax
 75 0A jne 40127B
 B8 01 00 00 00 mov eax,1
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 C3 ret
40127B: 85 F6 test esi,esi
 7E 10 jle 40128F
 85 44 B7 FC test dword ptr [edi+esi*4-4],eax
 75 0A jne 40128F
 B8 01 00 00 00 mov eax,1
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 C3 ret
40128F: 8B 5C 24 18 mov ebx,dword ptr [esp+18h]
 8D 6B FF lea ebp,dword ptr [ebx-1]
 3B F5 cmp esi,ebp
 75 1E jne 4012B8
 6A 00 push 0
 53 push ebx
 57 push edi
 E8 0D 06 00 00 call 4018B0
 83 C4 0C add esp,0Ch
 85 C0 test eax,eax
 75 0A jne 4012B4
 B8 01 00 00 00 mov eax,1
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 C3 ret
4012B4: 8B 54 24 24 mov edx,dword ptr [esp+24h]
4012B8: 83 7C 24 28 01 cmp dword ptr [esp+28h],1
 75 25 jne 4012E4
 3B F5 cmp esi,ebp
 74 21 je 4012E4
 8D 4E 01 lea ecx,dword ptr [esi+1]
 6A 00 push 0
 51 push ecx
 57 push edi
 E8 E1 05 00 00 call 4018B0
 83 C4 0C add esp,0Ch
 85 C0 test eax,eax
 75 0A jne 4012E0
 B8 02 00 00 00 mov eax,2
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 C3 ret
4012E0: 8B 54 24 24 mov edx,dword ptr [esp+24h]
4012E4: 83 C3 FE add ebx,0FEh
 3B F3 cmp esi,ebx
 0F 8D 83 00 00 00 jge 401372
 8B 2C B7 mov ebp,dword ptr [edi+esi*4]
 8D 5A 01 lea ebx,dword ptr [edx+1]
 83 FB 20 cmp ebx,20h
 73 2C jae 401326
 8B 44 24 1C mov eax,dword ptr [esp+1Ch]
 85 C0 test eax,eax
 7E 17 jle 401319
 B9 20 00 00 00 mov ecx,20h
 83 CA FF or edx,0FFh // -1
 2B C8 sub ecx,eax // [massive instruction reordering]
 83 C8 FF or eax,0FFh
 D3 EA shr edx,cl // bits up to
 8B CB mov ecx,ebx
 D3 E0 shl eax,cl // bits up from
 23 C2 and eax,edx // bits from to [bit range]
 EB 0F jmp 401328
401319: 83 C8 FF or eax,0FFh
 8B CB mov ecx,ebx
 D3 E0 shl eax,cl
 33 D2 xor edx,edx // 0
 23 C2 and eax,edx // 0 too
 EB 02 jmp 401328 // [questionable jump]
401326: 33 C0 xor eax,eax
401328: 8B D5 mov edx,ebp
 0B D0 or edx,eax
 89 14 B7 mov dword ptr [edi+esi*4],edx
 8B 54 24 1C mov edx,dword ptr [esp+1Ch]
 85 D2 test edx,edx
 7E 0E jle 401345
 B9 20 00 00 00 mov ecx,20h
 83 C8 FF or eax,0FFh
 2B CA sub ecx,edx
 D3 E8 shr eax,cl
 EB 02 jmp 401347
401345: 33 C0 xor eax,eax
401347: 89 44 B7 04 mov dword ptr [edi+esi*4+4],eax
 8D 46 02 lea eax,dword ptr [esi+2]
 52 push edx
 50 push eax
 57 push edi
 E8 2A 00 00 00 call 401380
 83 C4 0C add esp,0Ch
 89 2C B7 mov dword ptr [edi+esi*4],ebp
 85 C0 test eax,eax
 C7 44 B7 04 00 00 00 00 mov dword ptr [edi+esi*4+4],0
 75 0A jne 401372
 B8 01 00 00 00 mov eax,1
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 C3 ret
401372: 5F pop edi
 5E pop esi
 5D pop ebp
 33 C0 xor eax,eax
 5B pop ebx
 C3 ret
401380: 81 EC 08 01 00 00 sub esp,108h
 8D 44 24 04 lea eax,dword ptr [esp+4]
 8D 4C 24 00 lea ecx,dword ptr [esp]
 53 push ebx
 55 push ebp
 8B AC 24 14 01 00 00 mov ebp,dword ptr [esp+114h]
 56 push esi
 57 push edi
 8B BC 24 20 01 00 00 mov edi,dword ptr [esp+120h]
 50 push eax
 51 push ecx
 57 push edi
 55 push ebp
 E8 E7 05 00 00 call 401990
 8B 44 24 20 mov eax,dword ptr [esp+20h]
 83 C4 10 add esp,10h
 83 F8 FF cmp eax,0FFh // compare to -1
 0F 84 01 01 00 00 je 4014BA // c return
 8D 54 24 18 lea edx,dword ptr [esp+18h]
 57 push edi
 52 push edx
 E8 2C 05 00 00 call 4018F0
 83 C4 08 add esp,8
 8D 84 24 98 00 00 00 lea eax,dword ptr [esp+98h]
 57 push edi
 50 push eax
 E8 1B 05 00 00 call 4018F0
 8B 4C 24 18 mov ecx,dword ptr [esp+18h]
 BA 01 00 00 00 mov edx,1
 83 C4 08 add esp,8
 8D 04 8D 00 00 00 00 lea eax,dword ptr [ecx*4+0h]
 8B 4C 24 14 mov ecx,dword ptr [esp+14h]
 D3 E2 shl edx,cl
 8B 4C 04 18 mov ecx,dword ptr [esp+eax+18h]
 0B CA or ecx,edx
 89 4C 04 18 mov dword ptr [esp+eax+18h],ecx
 89 8C 04 98 00 00 00 mov dword ptr [esp+eax+98h],ecx
4013FF: 33 C9 xor ecx,ecx
 85 FF test edi,edi
 89 4C 24 10 mov dword ptr [esp+10h],ecx
 7E 47 jle 401450
 8D 5F FF lea ebx,dword ptr [edi-1]
40140C: 8B 84 8C 98 00 00 00 mov eax,dword ptr [esp+ecx*4+98h]
 8D B4 8C 98 00 00 00 lea esi,dword ptr [esp+ecx*4+98h]
 3B CB cmp ecx,ebx
 7D 04 jge 401422
 0B 44 8C 1C or eax,dword ptr [esp+ecx*4+1Ch]
401422: 85 C9 test ecx,ecx
 7E 04 jle 40142A
 0B 44 8C 14 or eax,dword ptr [esp+ecx*4+14h]
40142A: 8B 54 8C 18 mov edx,dword ptr [esp+ecx*4+18h]
 8B EA mov ebp,edx
 03 D2 add edx,edx // *=2
 D1 FD sar ebp,1 // /=2
 0B C5 or eax,ebp
 8B AC 24 1C 01 00 00 mov ebp,dword ptr [esp+11Ch]
 0B C2 or eax,edx
 8B 54 8D 00 mov edx,dword ptr [ebp+ecx*4]
 23 D0 and edx,eax
 41 inc ecx
 3B CF cmp ecx,edi
 89 16 mov dword ptr [esi],edx
 89 4C 24 10 mov dword ptr [esp+10h],ecx
 7C BC jl 40140C
401450: 33 F6 xor esi,esi
 33 D2 xor edx,edx
 85 FF test edi,edi
 7E 1F jle 401477
401458: 8B 84 94 98 00 00 00 mov eax,dword ptr [esp+edx*4+98h]
 8B 5C 94 18 mov ebx,dword ptr [esp+edx*4+18h]
 8D 4C 94 18 lea ecx,dword ptr [esp+edx*4+18h]
 3B C3 cmp eax,ebx
 74 07 je 401472
 BE 01 00 00 00 mov esi,1
 89 01 mov dword ptr [ecx],eax
401472: 42 inc edx
 3B D7 cmp edx,edi
 7C E1 jl 401458
401477: 85 F6 test esi,esi
 75 84 jne 4013FF
 33 C0 xor eax,eax
 85 FF test edi,edi
 89 44 24 10 mov dword ptr [esp+10h],eax
 7E 35 jle 4014BA
401485: 8B 8C 84 98 00 00 00 mov ecx,dword ptr [esp+eax*4+98h]
 8B 54 85 00 mov edx,dword ptr [ebp+eax*4]
 3B CA cmp ecx,edx
 75 19 jne 4014AD
 40 inc eax
 3B C7 cmp eax,edi
 89 44 24 10 mov dword ptr [esp+10h],eax
 7C E8 jl 401485
 B8 01 00 00 00 mov eax,1
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 81 C4 08 01 00 00 add esp,108h
 C3 ret
4014AD: 33 C0 xor eax,eax // 0
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 81 C4 08 01 00 00 add esp,108h
 C3 ret
4014BA: 5F pop edi // code duplication
 5E pop esi
 5D pop ebp
 B8 01 00 00 00 mov eax,1 // 1
 5B pop ebx
 81 C4 08 01 00 00 add esp,108h
 C3 ret
4014D0: 53 push ebx
 56 push esi
 57 push edi
 8B 7C 24 14 mov edi,dword ptr [esp+14h]
 85 FF test edi,edi
 74 44 je 40151F
 8B 5C 24 18 mov ebx,dword ptr [esp+18h]
 85 DB test ebx,ebx
 74 3C je 40151F
 8B 74 24 10 mov esi,dword ptr [esp+10h]
 83 3E 00 cmp dword ptr [esi],0
 74 33 je 40151F
 6A 00 push 0
 57 push edi
 56 push esi
 E8 BB 03 00 00 call 4018B0
 83 C4 0C add esp,0Ch
 85 C0 test eax,eax
 74 23 je 40151F
 53 push ebx
 57 push edi
 56 push esi
 E8 7C FE FF FF call 401380
 83 C4 0C add esp,0Ch
 85 C0 test eax,eax
 74 14 je 40151F
 8B 44 24 1C mov eax,dword ptr [esp+1Ch] // reference 1st order
 8B 50 04 mov edx,dword ptr [eax+4] // reference 2nd order
 8B 08 mov ecx,dword ptr [eax]
 8B 02 mov eax,dword ptr [edx] // reference 3rd order
 50 push eax
 53 push ebx
 57 push edi
 56 push esi
 FF 11 call dword ptr [ecx]
 83 C4 10 add esp,10h
40151F: 5F pop edi // multiple used return label
 5E pop esi
 5B pop ebx
 C3 ret
401530: 8B 4C 24 08 mov ecx,dword ptr [esp+8]
 83 EC 08 sub esp,8
 85 C9 test ecx,ecx
 74 06 je 401541
 C7 01 00 00 00 00 mov dword ptr [ecx],0
401541: 8B 44 24 14 mov eax,dword ptr [esp+14h]
 85 C0 test eax,eax
 74 06 je 40154F
 C7 00 00 00 00 00 mov dword ptr [eax],0
40154F: 85 C9 test ecx,ecx // logical [boolean] or test
 75 04 jne 401557 // | with [c] sequence point
 85 C0 test eax,eax // |
 74 1F je 401576 // |
401557: 89 44 24 04 mov dword ptr [esp+4],eax
 8D 44 24 00 lea eax,dword ptr [esp]
 89 4C 24 00 mov dword ptr [esp],ecx
 8B 4C 24 0C mov ecx,dword ptr [esp+0Ch]
 50 push eax
 68 80 15 40 00 push 401580h // function pointer
 51 push ecx
 E8 ED FA FF FF call 401060
 83 C4 0C add esp,0Ch
401576: 83 C4 08 add esp,8
 C3 ret
401580: 8B 4C 24 10 mov ecx,dword ptr [esp+10h]
 56 push esi
 8B 01 mov eax,dword ptr [ecx]
 8B 71 04 mov esi,dword ptr [ecx+4]
 85 C0 test eax,eax
 74 02 je 401590
 FF 00 inc dword ptr [eax]
401590: 85 F6 test esi,esi
 74 1D je 4015B1
 8B 44 24 10 mov eax,dword ptr [esp+10h]
 8B 4C 24 0C mov ecx,dword ptr [esp+0Ch]
 8B 54 24 08 mov edx,dword ptr [esp+8]
 50 push eax
 51 push ecx
 52 push edx
 E8 18 00 00 00 call 4015C0 // predicate call, with conditional block
 83 C4 0C add esp,0Ch // |
 85 C0 test eax,eax // |
 74 02 je 4015B1 // |
 FF 06 inc dword ptr [esi]
4015B1: 5E pop esi
 C3 ret
4015C0: 83 EC 0C sub esp,0Ch // [16 bytes aligned]
 8D 44 24 18 lea eax,dword ptr [esp+18h]
 8D 4C 24 14 lea ecx,dword ptr [esp+14h]
 53 push ebx // save non-volatile registers
 55 push ebp // |
 56 push esi // |
 57 push edi // |
 8B 7C 24 20 mov edi,dword ptr [esp+20h]
 50 push eax
 51 push ecx
 57 push edi
 E8 25 04 00 00 call 401A00
 8B 6C 24 34 mov ebp,dword ptr [esp+34h]
 8B 44 24 30 mov eax,dword ptr [esp+30h]
 83 C4 0C add esp,0Ch
 3B C5 cmp eax,ebp
 7E 0A jle 4015F4
 33 C0 xor eax,eax
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 83 C4 0C add esp,0Ch
 C3 ret
4015F4: 33 DB xor ebx,ebx
 C7 44 24 10 FF FF FF FF mov dword ptr [esp+10h],0FFFFFFFFh
 85 C0 test eax,eax
 0F 8E 8E 02 00 00 jle 401894
401606: 33 F6 xor esi,esi
 85 ED test ebp,ebp
 0F 8E 61 02 00 00 jle 401871
 8B 54 24 20 mov edx,dword ptr [esp+20h]
 89 54 24 14 mov dword ptr [esp+14h],edx
401618: F6 44 24 10 01 test byte ptr [esp+10h],1
 74 3F je 40165E
 BA 01 00 00 00 mov edx,1
 8B CE mov ecx,esi
 D3 E2 shl edx,cl // nth bit
 8B 4C 24 20 mov ecx,dword ptr [esp+20h]
 2B C3 sub eax,ebx
 8B 4C 81 FC mov ecx,dword ptr [ecx+eax*4-4]
 8B 07 mov eax,dword ptr [edi]
 23 CA and ecx,edx // nth bit
 F7 D9 neg ecx // carryflag = !zeroflag
 1B C9 sbb ecx,ecx // 0 or -1
 23 C2 and eax,edx
 F7 D9 neg ecx // 1 or 2
 F7 D8 neg eax
 1B C0 sbb eax,eax
 F7 D8 neg eax
 2B C1 sub eax,ecx // -1 or 0 or 1 [sign(diff)]
 83 F8 FF cmp eax,0FFh
 0F 84 3B 02 00 00 je 40188A // [quite long jump]
 83 F8 01 cmp eax,1
 75 0A jne 40165E
 8B 44 24 10 mov eax,dword ptr [esp+10h]
 24 FE and al,0FEh
 89 44 24 10 mov dword ptr [esp+10h],eax
40165E: F6 44 24 10 02 test byte ptr [esp+10h],2
 74 43 je 4016A8
 8B CD mov ecx,ebp
 8B 07 mov eax,dword ptr [edi]
 2B CE sub ecx,esi
 BA 01 00 00 00 mov edx,1 // some code repetitions ...
 49 dec ecx
 D3 E2 shl edx,cl
 8B CE mov ecx,esi
 23 D0 and edx,eax
 B8 01 00 00 00 mov eax,1
 F7 DA neg edx
 1B D2 sbb edx,edx
 D3 E0 shl eax,cl
 8B 0F mov ecx,dword ptr [edi]
 F7 DA neg edx
 23 C1 and eax,ecx
 F7 D8 neg eax
 1B C0 sbb eax,eax
 F7 D8 neg eax
 2B C2 sub eax,edx
 83 F8 FF cmp eax,0FFh
 0F 84 F1 01 00 00 je 40188A
 83 F8 01 cmp eax,1
 75 0A jne 4016A8
 8B 44 24 10 mov eax,dword ptr [esp+10h]
 24 FD and al,0FDh
 89 44 24 10 mov dword ptr [esp+10h],eax
4016A8: F6 44 24 10 04 test byte ptr [esp+10h],4
 74 4D je 4016FC
 8B 44 24 24 mov eax,dword ptr [esp+24h]
 8B CD mov ecx,ebp
 2B CE sub ecx,esi
 BA 01 00 00 00 mov edx,1
 49 dec ecx
 2B C3 sub eax,ebx
 D3 E2 shl edx,cl
 8B 4C 24 20 mov ecx,dword ptr [esp+20h]
 23 54 81 FC and edx,dword ptr [ecx+eax*4-4]
 B8 01 00 00 00 mov eax,1
 8B CE mov ecx,esi
 F7 DA neg edx
 1B D2 sbb edx,edx
 D3 E0 shl eax,cl
 8B 0F mov ecx,dword ptr [edi]
 F7 DA neg edx
 23 C1 and eax,ecx
 F7 D8 neg eax
 1B C0 sbb eax,eax
 F7 D8 neg eax
 2B C2 sub eax,edx
 83 F8 FF cmp eax,0FFh
 0F 84 9D 01 00 00 je 40188A
 83 F8 01 cmp eax,1
 75 0A jne 4016FC
 8B 44 24 10 mov eax,dword ptr [esp+10h]
 24 FB and al,0FBh
 89 44 24 10 mov dword ptr [esp+10h],eax
4016FC: 39 6C 24 24 cmp dword ptr [esp+24h],ebp
 0F 85 53 01 00 00 jne 401859
 F6 44 24 10 08 test byte ptr [esp+10h],8
 74 44 je 401751
 8B 44 24 14 mov eax,dword ptr [esp+14h]
 BA 01 00 00 00 mov edx,1
 8B CB mov ecx,ebx
 D3 E2 shl edx,cl
 8B 08 mov ecx,dword ptr [eax]
 B8 01 00 00 00 mov eax,1
 23 D1 and edx,ecx
 8B CE mov ecx,esi
 F7 DA neg edx
 1B D2 sbb edx,edx
 D3 E0 shl eax,cl
 8B 0F mov ecx,dword ptr [edi]
 F7 DA neg edx
 23 C1 and eax,ecx
 F7 D8 neg eax
 1B C0 sbb eax,eax
 F7 D8 neg eax
 2B C2 sub eax,edx
 83 F8 FF cmp eax,0FFh
 0F 84 48 01 00 00 je 40188A
 83 F8 01 cmp eax,1
 75 0A jne 401751
 8B 44 24 10 mov eax,dword ptr [esp+10h]
 24 F7 and al,0F7h
 89 44 24 10 mov dword ptr [esp+10h],eax
401751: F6 44 24 10 10 test byte ptr [esp+10h],10h
 74 49 je 4017A1
 8B 4C 24 24 mov ecx,dword ptr [esp+24h]
 8B 44 24 14 mov eax,dword ptr [esp+14h]
 2B CB sub ecx,ebx
 BA 01 00 00 00 mov edx,1
 49 dec ecx
 D3 E2 shl edx,cl
 8B 08 mov ecx,dword ptr [eax]
 B8 01 00 00 00 mov eax,1
 23 D1 and edx,ecx
 8B CE mov ecx,esi
 F7 DA neg edx
 1B D2 sbb edx,edx
 D3 E0 shl eax,cl
 8B 0F mov ecx,dword ptr [edi]
 F7 DA neg edx
 23 C1 and eax,ecx
 F7 D8 neg eax
 1B C0 sbb eax,eax
 F7 D8 neg eax
 2B C2 sub eax,edx
 83 F8 FF cmp eax,0FFh
 0F 84 F8 00 00 00 je 40188A
 83 F8 01 cmp eax,1
 75 0A jne 4017A1
 8B 44 24 10 mov eax,dword ptr [esp+10h]
 24 EF and al,0EFh
 89 44 24 10 mov dword ptr [esp+10h],eax
4017A1: F6 44 24 10 20 test byte ptr [esp+10h],20h
 74 4A je 4017F2
 B8 01 00 00 00 mov eax,1
 8B CB mov ecx,ebx
 8B D5 mov edx,ebp
 D3 E0 shl eax,cl
 8B 4C 24 20 mov ecx,dword ptr [esp+20h]
 2B D6 sub edx,esi
 8B 54 91 FC mov edx,dword ptr [ecx+edx*4-4]
 8B CE mov ecx,esi
 23 D0 and edx,eax
 B8 01 00 00 00 mov eax,1
 F7 DA neg edx
 1B D2 sbb edx,edx
 D3 E0 shl eax,cl
 8B 0F mov ecx,dword ptr [edi]
 F7 DA neg edx
 23 C1 and eax,ecx
 F7 D8 neg eax
 1B C0 sbb eax,eax
 F7 D8 neg eax
 2B C2 sub eax,edx
 83 F8 FF cmp eax,0FFh
 0F 84 A7 00 00 00 je 40188A
 83 F8 01 cmp eax,1
 75 0A jne 4017F2
 8B 44 24 10 mov eax,dword ptr [esp+10h]
 24 DF and al,0DFh
 89 44 24 10 mov dword ptr [esp+10h],eax
4017F2: 8B 54 24 10 mov edx,dword ptr [esp+10h]
 F6 C2 40 test dl,40h
 74 4C je 401847
 8B 4C 24 24 mov ecx,dword ptr [esp+24h]
 B8 01 00 00 00 mov eax,1
 2B CB sub ecx,ebx
 2B EE sub ebp,esi
 49 dec ecx
 D3 E0 shl eax,cl
 8B 4C 24 20 mov ecx,dword ptr [esp+20h]
 23 44 A9 FC and eax,dword ptr [ecx+ebp*4-4]
 8B CE mov ecx,esi
 F7 D8 neg eax
 1B C0 sbb eax,eax
 F7 D8 neg eax
 89 44 24 18 mov dword ptr [esp+18h],eax
 B8 01 00 00 00 mov eax,1
 D3 E0 shl eax,cl
 8B 0F mov ecx,dword ptr [edi]
 23 C1 and eax,ecx
 8B 4C 24 18 mov ecx,dword ptr [esp+18h]
 F7 D8 neg eax
 1B C0 sbb eax,eax
 F7 D8 neg eax
 2B C1 sub eax,ecx
 83 F8 FF cmp eax,0FFh
 74 4F je 40188A
 83 F8 01 cmp eax,1
 75 07 jne 401847
 83 E2 BF and edx,0BFh
 89 54 24 10 mov dword ptr [esp+10h],edx
401847: 52 push edx
 E8 C3 00 00 00 call 401910
 83 C4 04 add esp,4
 83 F8 07 cmp eax,7
 74 3F je 401894
 8B 6C 24 28 mov ebp,dword ptr [esp+28h]
401859: 8B 4C 24 14 mov ecx,dword ptr [esp+14h]
 8B 44 24 24 mov eax,dword ptr [esp+24h]
 46 inc esi
 83 C1 04 add ecx,4
 3B F5 cmp esi,ebp
 89 4C 24 14 mov dword ptr [esp+14h],ecx
 0F 8C A7 FD FF FF jl 401618
401871: 43 inc ebx
 83 C7 04 add edi,4
 3B D8 cmp ebx,eax
 0F 8C 89 FD FF FF jl 401606
 B8 01 00 00 00 mov eax,1
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 83 C4 0C add esp,0Ch
 C3 ret
40188A: 33 C0 xor eax,eax
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 83 C4 0C add esp,0Ch
 C3 ret
401894: 5F pop edi
 5E pop esi
 5D pop ebp
 B8 01 00 00 00 mov eax,1
 5B pop ebx
 83 C4 0C add esp,0Ch
 C3 ret
4018B0: 8B 54 24 08 mov edx,dword ptr [esp+8]
 33 C0 xor eax,eax
 56 push esi
 85 D2 test edx,edx
 7E 26 jle 4018E1
 8B 4C 24 10 mov ecx,dword ptr [esp+10h]
 BE 01 00 00 00 mov esi,1
 D3 E6 shl esi,cl
 8B 4C 24 08 mov ecx,dword ptr [esp+8]
4018CA: 85 31 test dword ptr [ecx],esi
 75 0C jne 4018DA
 40 inc eax
 83 C1 04 add ecx,4
 3B C2 cmp eax,edx
 7C F4 jl 4018CA
 33 C0 xor eax,eax
 5E pop esi
 C3 ret
4018DA: B8 01 00 00 00 mov eax,1
 5E pop esi
 C3 ret
4018E1: 33 C0 xor eax,eax // [questionable code duplication]
 5E pop esi
 C3 ret
4018F0: 8B 4C 24 08 mov ecx,dword ptr [esp+8]
 85 C9 test ecx,ecx // check for zero count [special case]
 7E 0A jle 401902
 57 push edi
 8B 7C 24 08 mov edi,dword ptr [esp+8]
 33 C0 xor eax,eax // zero-out memory
 F3 AB rep stos dword ptr es:[edi] // |
 5F pop edi
401902: C3 ret
401910: 8B 44 24 04 mov eax,dword ptr [esp+4]
 50 push eax
 E8 06 00 00 00 call 401920
 83 C4 04 add esp,4
 C3 ret
401920: 8B 44 24 04 mov eax,dword ptr [esp+4] // first argument
 85 C0 test eax,eax // [special case]
 75 04 jne 40192C
 83 C8 FF or eax,0FFh // shorter bytecode for mov eax,-1
 C3 ret
40192C: 8B D0 mov edx,eax
 33 C9 xor ecx,ecx
 81 E2 FF FF 00 00 and edx,0FFFFh // check bit mask
 74 07 je 40193F // |
 B9 01 00 00 00 mov ecx,1
 8B C2 mov eax,edx
40193F: 8B D0 mov edx,eax
 D1 E1 shl ecx,1 // propagate bit
 81 E2 FF 00 FF 00 and edx,0FF00FFh
 74 05 je 401950
 83 C9 01 or ecx,1 // set next bit
 8B C2 mov eax,edx
401950: 8B D0 mov edx,eax
 D1 E1 shl ecx,1 // propagate bit
 81 E2 0F 0F 0F 0F and edx,0F0F0F0Fh
 74 05 je 401961
 83 C9 01 or ecx,1
 8B C2 mov eax,edx
401961: 8B D0 mov edx,eax
 D1 E1 shl ecx,1
 81 E2 33 33 33 33 and edx,33333333h
 74 05 je 401972
 83 C9 01 or ecx,1
 8B C2 mov eax,edx
401972: D1 E1 shl ecx,1
 A9 55 55 55 55 test eax,55555555h
 74 03 je 40197E
 83 C9 01 or ecx,1
40197E: B8 1F 00 00 00 mov eax,1Fh
 2B C1 sub eax,ecx
 C3 ret
401990: 53 push ebx
 55 push ebp
 8B 6C 24 14 mov ebp,dword ptr [esp+14h]
 56 push esi
 85 ED test ebp,ebp // check for null pointer
 57 push edi
 74 07 je 4019A3
 C7 45 00 FF FF FF FF mov dword ptr [ebp],0FFFFFFFFh // -1
4019A3: 8B 44 24 20 mov eax,dword ptr [esp+20h]
 85 C0 test eax,eax
 74 06 je 4019B1
 C7 00 FF FF FF FF mov dword ptr [eax],0FFFFFFFFh
4019B1: 8B 5C 24 18 mov ebx,dword ptr [esp+18h]
 33 F6 xor esi,esi
 85 DB test ebx,ebx
 7E 32 jle 4019ED
 8B 7C 24 14 mov edi,dword ptr [esp+14h]
4019BF: 8B 07 mov eax,dword ptr [edi]
 50 push eax
 E8 49 FF FF FF call 401910
 83 C4 04 add esp,4
 83 F8 FF cmp eax,0FFh
 75 0D jne 4019DC
 46 inc esi
 83 C7 04 add edi,4
 3B F3 cmp esi,ebx
 7C E8 jl 4019BF
 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 C3 ret
4019DC: 85 ED test ebp,ebp
 74 03 je 4019E3
 89 75 00 mov dword ptr [ebp],esi
4019E3: 8B 4C 24 20 mov ecx,dword ptr [esp+20h]
 85 C9 test ecx,ecx
 74 02 je 4019ED
 89 01 mov dword ptr [ecx],eax
4019ED: 5F pop edi
 5E pop esi
 5D pop ebp
 5B pop ebx
 C3 ret
401A00: 56 push esi
 8B 74 24 0C mov esi,dword ptr [esp+0Ch]
 57 push edi
 8B 7C 24 14 mov edi,dword ptr [esp+14h]
 83 3E 00 cmp dword ptr [esi],0
 7E 44 jle 401A53
 83 3F 00 cmp dword ptr [edi],0
 7E 3F jle 401A53
 8B 4C 24 0C mov ecx,dword ptr [esp+0Ch]
401A18: 8B 06 mov eax,dword ptr [esi]
 8B 54 81 FC mov edx,dword ptr [ecx+eax*4-4]
 85 D2 test edx,edx
 75 07 jne 401A29
 48 dec eax
 85 C0 test eax,eax
 89 06 mov dword ptr [esi],eax
 7F EF jg 401A18
401A29: 8B 06 mov eax,dword ptr [esi]
 85 C0 test eax,eax
 75 05 jne 401A34
 89 07 mov dword ptr [edi],eax
 5F pop edi
 5E pop esi
 C3 ret
401A34: 50 push eax
 51 push ecx
 E8 A5 00 00 00 call 401AE0
 83 C4 08 add esp,8
 50 push eax
 E8 2C 00 00 00 call 401A70
 83 C4 04 add esp,4
 40 inc eax
 85 C0 test eax,eax
 89 07 mov dword ptr [edi],eax
 75 11 jne 401A5F
 89 06 mov dword ptr [esi],eax
 5F pop edi
 5E pop esi
 C3 ret
401A53: C7 07 00 00 00 00 mov dword ptr [edi],0
 C7 06 00 00 00 00 mov dword ptr [esi],0
401A5F: 5F pop edi
 5E pop esi
 C3 ret
401A70: 8B 44 24 04 mov eax,dword ptr [esp+4]
 50 push eax
 E8 06 00 00 00 call 401A80
 83 C4 04 add esp,4
 C3 ret
401A80: 8B 4C 24 04 mov ecx,dword ptr [esp+4]
 85 C9 test ecx,ecx
 75 04 jne 401A8C
 83 C8 FF or eax,0FFh
 C3 ret
401A8C: 8B D1 mov edx,ecx
 33 C0 xor eax,eax
 81 E2 00 00 FF FF and edx,0FFFF0000h // bit mask
 74 07 je 401A9F
 B8 01 00 00 00 mov eax,1
 8B CA mov ecx,edx
401A9F: 8B D1 mov edx,ecx
 D1 E0 shl eax,1
 81 E2 00 FF 00 FF and edx,0FF00FF00h
 74 04 je 401AAF
 0C 01 or al,1 // bit set
 8B CA mov ecx,edx
401AAF: 8B D1 mov edx,ecx
 D1 E0 shl eax,1 // bit propagation
 81 E2 F0 F0 F0 F0 and edx,0F0F0F0F0h
 74 04 je 401ABF
 0C 01 or al,1
 8B CA mov ecx,edx
401ABF: 8B D1 mov edx,ecx
 D1 E0 shl eax,1
 81 E2 CC CC CC CC and edx,0CCCCCCCCh
 74 04 je 401ACF
 0C 01 or al,1
 8B CA mov ecx,edx
401ACF: D1 E0 shl eax,1
 F7 C1 AA AA AA AA test ecx,0AAAAAAAAh
 74 02 je 401ADB
 0C 01 or al,1
401ADB: C3 ret
401AE0: 8B 54 24 08 mov edx,dword ptr [esp+8]
 33 C0 xor eax,eax
 85 D2 test edx,edx // zero loop check
 7E 10 jle 401AFA // |
 8B 4C 24 04 mov ecx,dword ptr [esp+4]
 56 push esi // [delayed register save]
401AEF: 8B 31 mov esi,dword ptr [ecx]
 83 C1 04 add ecx,4
 0B C6 or eax,esi // arithmetic-or on vector
 4A dec edx
 75 F6 jne 401AEF
 5E pop esi
401AFA: C3 ret
entry_point: // [as found in program executable header]
401B00: 55 push ebp // establish a new stack frame
 8B EC mov ebp,esp // | [startup code compiled differently]
 6A FF push 0FFh
 68 30 20 40 00 push 402030h
 68 A0 1C 40 00 push 401CA0h // _except_handler3
 64 A1 00 00 00 00 mov eax,fs:[0]
 50 push eax
 64 89 25 00 00 00 00 mov dword ptr fs:[0h],esp
 83 C4 E0 add esp,0E0h // sub esp,32
 53 push ebx // [non-volatiles]
 56 push esi // |
 57 push edi // |
 89 65 E8 mov dword ptr [ebp-18h],esp // ebp-relative reference
 C7 45 FC 00 00 00 00 mov dword ptr [ebp-4],0 // esp+38h
 6A 01 push 1
 FF 15 90 40 40 00 call dword ptr ds:[404090h] // __set_app_type
 83 C4 04 add esp,4
 C7 05 30 30 40 00 FF FF FF FF mov dword ptr ds:[403030h],0FFFFFFFFh
 C7 05 34 30 40 00 FF FF FF FF mov dword ptr ds:[403034h],0FFFFFFFFh
 FF 15 8C 40 40 00 call dword ptr ds:[40408Ch] // __p__fmode
 8B 0D 2C 30 40 00 mov ecx,dword ptr ds:[40302Ch]
 89 08 mov dword ptr [eax],ecx
 FF 15 88 40 40 00 call dword ptr ds:[404088h] // __p__commode
 8B 15 28 30 40 00 mov edx,dword ptr ds:[403028h]
 89 10 mov dword ptr [eax],edx
 A1 64 40 40 00 mov eax,[404064] // _adjust_fdiv
 8B 08 mov ecx,dword ptr [eax]
 89 0D 38 30 40 00 mov dword ptr ds:[403038h],ecx
 E8 16 01 00 00 call 401C90
 A1 10 30 40 00 mov eax,[403010]
 85 C0 test eax,eax
 75 0E jne 401B91
 68 80 1C 40 00 push 401C80h
 FF 15 80 40 40 00 call dword ptr ds:[404080h] // __setusermatherr
 83 C4 04 add esp,4
401B91: E8 CA 00 00 00 call 401C60
 68 0C 30 40 00 push 40300Ch
 68 08 30 40 00 push 403008h
 E8 B1 00 00 00 call 401C56 // _initterm
 83 C4 08 add esp,8
 8B 15 24 30 40 00 mov edx,dword ptr ds:[403024h]
 89 55 D8 mov dword ptr [ebp-28h],edx
 8D 45 D8 lea eax,dword ptr [ebp-28h]
 50 push eax
 8B 0D 20 30 40 00 mov ecx,dword ptr ds:[403020h]
 51 push ecx
 8D 55 E0 lea edx,dword ptr [ebp-20h] // &envp
 52 push edx
 8D 45 D4 lea eax,dword ptr [ebp-2Ch] // &argv
 50 push eax
 8D 4D E4 lea ecx,dword ptr [ebp-1Ch] // &argc
 51 push ecx
 FF 15 78 40 40 00 call dword ptr ds:[404078h] // __getmainargs
 83 C4 14 add esp,14h
 68 04 30 40 00 push 403004h
 68 00 30 40 00 push 403000h
 E8 76 00 00 00 call 401C56 // _initterm
 83 C4 08 add esp,8
 FF 15 74 40 40 00 call dword ptr ds:[404074h] // __p___initenv
 8B 55 E0 mov edx,dword ptr [ebp-20h]
 89 10 mov dword ptr [eax],edx
 8B 45 E0 mov eax,dword ptr [ebp-20h] // envp
 50 push eax
 8B 4D D4 mov ecx,dword ptr [ebp-2Ch] // argv
 51 push ecx
 8B 55 E4 mov edx,dword ptr [ebp-1Ch] // argc
 52 push edx
 E8 01 F4 FF FF call 401000 // main
 83 C4 0C add esp,0Ch
 89 45 DC mov dword ptr [ebp-24h],eax
 50 push eax
 FF 15 70 40 40 00 call dword ptr ds:[404070h] // exit
 EB 22 jmp 401C30
401C0E: 8B 45 EC mov eax,dword ptr [ebp-14h]
 8B 08 mov ecx,dword ptr [eax]
 8B 09 mov ecx,dword ptr [ecx]
 89 4D D0 mov dword ptr [ebp-30h],ecx
 50 push eax
 51 push ecx
 E8 31 00 00 00 call 401C50 // _XcptFilter
 83 C4 08 add esp,8
 C3 ret
401C23: 8B 65 E8 mov esp,dword ptr [ebp-18h]
 8B 55 D0 mov edx,dword ptr [ebp-30h]
 52 push edx
 FF 15 68 40 40 00 call dword ptr ds:[404068h] // _exit
401C30: 83 C4 04 add esp,4
 C7 45 FC FF FF FF FF mov dword ptr [ebp-4],0FFFFFFFFh
 8B 4D F0 mov ecx,dword ptr [ebp-10h]
 64 89 0D 00 00 00 00 mov dword ptr fs:[0h],ecx
 5F pop edi
 5E pop esi
 5B pop ebx
 8B E5 mov esp,ebp // pop stack frame
 5D pop ebp // |
 C3 ret
401C50: FF 25 6C 40 40 00 jmp dword ptr ds:[40406Ch] // _XcptFilter ; forwarder
401C56: FF 25 7C 40 40 00 jmp dword ptr ds:[40407Ch] // _initterm
 CC int 3 // debugger trap [unreferenced]
 CC int 3 // [unreferenced]
 CC int 3 // [unreferenced]
 CC int 3 // [unreferenced]
401C60: 68 00 00 03 00 push 30000h
 68 00 00 01 00 push 10000h
 E8 37 00 00 00 call 401CA6 // _controlfp
 83 C4 08 add esp,8
 C3 ret
401C80: 33 C0 xor eax,eax // return zero
 C3 ret
401C90: C3 ret // empty procedure
401CA0: FF 25 94 40 40 00 jmp dword ptr ds:[404094h] // _except_handler3
401CA6: FF 25 98 40 40 00 jmp dword ptr ds:[404098h] // _controlfp
section #2 .rdata
initialized data read only [40000040]
402000: 25 64 20 66 69 67 75 72 65 73 20 28 25 64 20 64 %d figures (%d d
 69 73 74 69 6E 63 74 73 29 0A 00 00 istincts)...
40201C: 66 69 67 75 72 65 20 73 69 7A 65 20 25 64 3A 20 figure size %d: 
 00 00 00 00 ....
402030: FF FF FF FF 0E 1C 40 00 23 1C 40 00 ......@.#.@.
section #3 .data
initialized data read write [C0000040]
403000: 00 00 00 00 ....
403004: 00 00 00 00 ....
403008: 00 00 00 00 ....
40300C: 00 00 00 00 ....
403010: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
403020: 00 00 00 00 ....
403024: 00 00 00 00 ....
403028: 00 00 00 00 ....
40302C: 00 00 00 00 ....
403030: 00 00 00 00 ....
403034: 00 00 00 00 ....
403038: 00 00 00 00 ....
section #4 .idata
initialized data read write [C0000040]
import_directory: // [as found in program executable header]
404000: 28 40 00 00 00 00 00 00 00 00 00 00 AA 40 00 00 (@...........@..
 64 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d@..............
 00 00 00 00 00 00 00 00 ........
404028: 14 41 00 00 B6 40 00 00 BE 40 00 00 CC 40 00 00 .A...@...@...@..
 D4 40 00 00 E4 40 00 00 F4 40 00 00 00 41 00 00 .@...@...@...A..
 A0 40 00 00 24 41 00 00 34 41 00 00 42 41 00 00 .@..$A..4A..BA..
 54 41 00 00 68 41 00 00 00 00 00 00 TA..hA......
import_address_table_directory: // [as found in program executable header]
404064: 14 41 00 00 .A.. // _adjust_fdiv
404068: B6 40 00 00 .@.. // _exit
40406C: BE 40 00 00 .@.. // _XcptFilter
404070: CC 40 00 00 .@.. // exit
404074: D4 40 00 00 .@.. // __p___initenv
404078: E4 40 00 00 .@.. // __getmainargs
40407C: F4 40 00 00 .@.. // _initterm
404080: 00 41 00 00 .A.. // __setusermatherr
404084: A0 40 00 00 .@.. // printf
404088: 24 41 00 00 $A.. // __p__commode
40408C: 34 41 00 00 4A.. // __p__fmode
404090: 42 41 00 00 BA.. // __set_app_type
404094: 54 41 00 00 TA.. // _except_handler3
404098: 68 41 00 00 00 00 00 00 hA...... // _controlfp
4040A0: 99 02 70 72 69 6E 74 66 00 00 ..printf..
4040AA: 4D 53 56 43 52 54 2E 64 6C 6C 00 00 MSVCRT.dll..
4040B6: CF 00 5F 65 78 69 74 00 .._exit.
4040BE: 48 00 5F 58 63 70 74 46 69 6C 74 65 72 00 H._XcptFilter.
4040CC: 44 02 65 78 69 74 00 00 D.exit..
4040D4: 63 00 5F 5F 70 5F 5F 5F 69 6E 69 74 65 6E 76 00 c.__p___initenv.
4040E4: 58 00 5F 5F 67 65 74 6D 61 69 6E 61 72 67 73 00 X.__getmainargs.
4040F4: 0B 01 5F 69 6E 69 74 74 65 72 6D 00 .._initterm.
404100: 81 00 5F 5F 73 65 74 75 73 65 72 6D 61 74 68 65 ..__setusermathe
 72 72 00 00 rr..
404114: 9A 00 5F 61 64 6A 75 73 74 5F 66 64 69 76 00 00 .._adjust_fdiv..
404124: 69 00 5F 5F 70 5F 5F 63 6F 6D 6D 6F 64 65 00 00 i.__p__commode..
404134: 6E 00 5F 5F 70 5F 5F 66 6D 6F 64 65 00 00 n.__p__fmode..
404142: 7F 00 5F 5F 73 65 74 5F 61 70 70 5F 74 79 70 65 ..__set_app_type
 00 00 ..
404154: C6 00 5F 65 78 63 65 70 74 5F 68 61 6E 64 6C 65 .._except_handle
 72 33 00 00 r3..
404168: B3 00 5F 63 6F 6E 74 72 6F 6C 66 70 00 00 .._controlfp..

http://www.lrdev.com/lr/x86/samp1.html
Eric Laroche, laroche@lrdev.com, Fri Dec 12 2003

Copyright © 2003 Eric Laroche. All rights reserved.
This data is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

AltStyle によって変換されたページ (->オリジナル) /