User:NorwegianBlue/Assembly example

C version

edit

   #include <stdio.h>
    
   #define LOLIM         10000
   #define HILIM         100000
   #define TWO_POW_31    2147483648
    
   int MyRandom()
   {
       static unsigned int prev = 0;
       prev = (1664525*prev + 1013904223)%TWO_POW_31;
       return ((prev/4) % (HILIM-LOLIM));
   }
    
   int main()
   {
       FILE* f;
       int i,t[HILIM];
       for (i = 0; i < HILIM; ++i)
       {
           t[i] = LOLIM+MyRandom();
       }
       f = fopen("c:\\silly_example.bin", "wb");
       if (f != 0)
       {
           fwrite(t, sizeof(int), HILIM, f);
           fclose(f);
       }
       return 0;
   }

Assembly version

edit

       TITLE   E:\src\masm_test\main.c
       .386P
   include listing.inc
   if @Version gt 510
   .model FLAT
   else
   _TEXT   SEGMENT PARA USE32 PUBLIC 'CODE'
   _TEXT   ENDS
   _DATA   SEGMENT DWORD USE32 PUBLIC 'DATA'
   _DATA   ENDS
   CONST   SEGMENT DWORD USE32 PUBLIC 'CONST'
   CONST   ENDS
   _BSS    SEGMENT DWORD USE32 PUBLIC 'BSS'
   _BSS    ENDS
   $$SYMBOLS   SEGMENT BYTE USE32 'DEBSYM'
   $$SYMBOLS   ENDS
   $$TYPES SEGMENT BYTE USE32 'DEBTYP'
   $$TYPES ENDS
   _TLS    SEGMENT DWORD USE32 PUBLIC 'TLS'
   _TLS    ENDS
   ;   COMDAT ??_C@_02NGAF@wb?$AA@
   CONST   SEGMENT DWORD USE32 PUBLIC 'CONST'
   CONST   ENDS
   ;   COMDAT ??_C@_0BF@CELN@c?3?2silly_example?4bin?$AA@
   CONST   SEGMENT DWORD USE32 PUBLIC 'CONST'
   CONST   ENDS
   ;   COMDAT _MyRandom
   _TEXT   SEGMENT PARA USE32 PUBLIC 'CODE'
   _TEXT   ENDS
   ;   COMDAT _main
   _TEXT   SEGMENT PARA USE32 PUBLIC 'CODE'
   _TEXT   ENDS
   FLAT    GROUP _DATA, CONST, _BSS
       ASSUME  CS: FLAT, DS: FLAT, SS: FLAT
   endif
   _BSS    SEGMENT
   _?prev@?1??MyRandom@@9@9 DD 01H DUP (?)
   _BSS    ENDS
   PUBLIC  _MyRandom
   ;   COMDAT _MyRandom
   _TEXT   SEGMENT
   _MyRandom PROC NEAR                 ; COMDAT
    
   ; 9    :     {
    
       push    ebp
       mov ebp, esp
       sub esp, 64                 ; 00000040H
       push    ebx
       push    esi
       push    edi
       lea edi, DWORD PTR [ebp-64]
       mov ecx, 16                 ; 00000010H
       mov eax, -858993460             ; ccccccccH
       rep stosd
    
   ; 10   :         static unsigned int prev = 0;
   ; 11   :         prev = (1664525*prev + 1013904223)%TWO_POW_31;
    
       mov eax, DWORD PTR _?prev@?1??MyRandom@@9@9
       imul    eax, 1664525                ; 0019660dH
       add eax, 1013904223             ; 3c6ef35fH
       xor edx, edx
       mov ecx, -2147483648            ; 80000000H
       div ecx
       mov DWORD PTR _?prev@?1??MyRandom@@9@9, edx
    
   ; 12   :         return ((prev/4) % (HILIM-LOLIM));
    
       mov eax, DWORD PTR _?prev@?1??MyRandom@@9@9
       shr eax, 2
       xor edx, edx
       mov ecx, 90000              ; 00015f90H
       div ecx
       mov eax, edx
    
   ; 13   :     }
    
       pop edi
       pop esi
       pop ebx
       mov esp, ebp
       pop ebp
       ret 0
   _MyRandom ENDP
   _TEXT   ENDS
   PUBLIC  _main
   PUBLIC  ??_C@_02NGAF@wb?$AA@                ; `string'
   PUBLIC  ??_C@_0BF@CELN@c?3?2silly_example?4bin?$AA@ ; `string'
   EXTRN   _fclose:NEAR
   EXTRN   _fopen:NEAR
   EXTRN   _fwrite:NEAR
   EXTRN   __chkstk:NEAR
   EXTRN   __chkesp:NEAR
   ;   COMDAT ??_C@_02NGAF@wb?$AA@
   ; File E:\src\masm_test\main.c
   CONST   SEGMENT
   ??_C@_02NGAF@wb?$AA@ DB 'wb', 00H           ; `string'
   CONST   ENDS
   ;   COMDAT ??_C@_0BF@CELN@c?3?2silly_example?4bin?$AA@
   CONST   SEGMENT
   ??_C@_0BF@CELN@c?3?2silly_example?4bin?$AA@ DB 'c:\silly_example.bin', 00H ; `string'
   CONST   ENDS
   ;   COMDAT _main
   _TEXT   SEGMENT
   _f$ = -4
   _i$ = -8
   _t$ = -400008
   _main   PROC NEAR                   ; COMDAT
    
   ; 17   :     {
    
       push    ebp
       mov ebp, esp
       mov eax, 400072             ; 00061ac8H
       call    __chkstk
       push    ebx
       push    esi
       push    edi
       lea edi, DWORD PTR [ebp-400072]
       mov ecx, 100018             ; 000186b2H
       mov eax, -858993460             ; ccccccccH
       rep stosd
    
   ; 18   :         FILE* f;
   ; 19   :         int i,t[HILIM];
   ; 20   :         for (i = 0; i < HILIM; ++i)
    
       mov DWORD PTR _i$[ebp], 0
       jmp SHORT $L795
   $L796:
       mov eax, DWORD PTR _i$[ebp]
       add eax, 1
       mov DWORD PTR _i$[ebp], eax
   $L795:
       cmp DWORD PTR _i$[ebp], 100000      ; 000186a0H
       jge SHORT $L797
    
   ; 22   :             t[i] = LOLIM+MyRandom();
    
       call    _MyRandom
       add eax, 10000              ; 00002710H
       mov ecx, DWORD PTR _i$[ebp]
       mov DWORD PTR _t$[ebp+ecx*4], eax
    
   ; 23   :         }
    
       jmp SHORT $L796
   $L797:
    
   ; 24   :         f = fopen("c:\\silly_example.bin", "wb");
    
       push    OFFSET FLAT:??_C@_02NGAF@wb?$AA@    ; `string'
       push    OFFSET FLAT:??_C@_0BF@CELN@c?3?2silly_example?4bin?$AA@ ; `string'
       call    _fopen
       add esp, 8
       mov DWORD PTR _f$[ebp], eax
    
   ; 25   :         if (f != 0)
    
       cmp DWORD PTR _f$[ebp], 0
       je  SHORT $L800
    
   ; 27   :             fwrite(t, sizeof(int), HILIM, f);
    
       mov edx, DWORD PTR _f$[ebp]
       push    edx
       push    100000                  ; 000186a0H
       push    4
       lea eax, DWORD PTR _t$[ebp]
       push    eax
       call    _fwrite
       add esp, 16                 ; 00000010H
    
   ; 28   :            fclose(f);
    
       mov ecx, DWORD PTR _f$[ebp]
       push    ecx
       call    _fclose
       add esp, 4
   $L800:
    
   ; 30   :         return 0;
    
       xor eax, eax
    
   ; 31   :     }
    
       pop edi
       pop esi
       pop ebx
       add esp, 400072             ; 00061ac8H
       cmp ebp, esp
       call    __chkesp
       mov esp, ebp
       pop ebp
       ret 0
   _main   ENDP
   _TEXT   ENDS
   END