Advertisement
Guest User

Untitled

a guest
Oct 13th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. section .data
  2.  
  3.     R       EQU 32
  4.     M1      EQU 3
  5.     M2      EQU 24
  6.     M3      EQU 10
  7.  
  8.     %macro  mat3pos 0
  9.  
  10.         push    eax
  11.         shr     eax, cl
  12.         pop     ecx
  13.         xor     eax, ecx
  14.  
  15.     %endmacro
  16.  
  17.     %macro  mat3neg 0
  18.  
  19.         push    eax
  20.         shl     eax, cl
  21.         pop     ecx
  22.         xor     eax, ecx
  23.  
  24.     %endmacro
  25.  
  26. section .bss
  27.  
  28.     z0      resd 1
  29.     z1      resd 1
  30.     z2      resd 1
  31.     state_n resd 1
  32.  
  33.     STATE   resd R
  34.  
  35.     seed    resd R
  36.  
  37. section .text
  38.  
  39.     global _start
  40.    
  41.     init_WELL:
  42.  
  43.         push    ebp
  44.         mov     ebp, esp
  45.         push    ebx
  46.        
  47.         lea     esi, [ebp + 8]
  48.         mov     edi, STATE
  49.  
  50.         xor ebx, ebx
  51.  
  52.     init_WELL_loop:
  53.        
  54.         mov     eax, [esi + ebx * 4]
  55.         mov     [edi + ebx * 4], eax
  56.         inc     ebx
  57.  
  58.         cmp     ebx, R
  59.         jb      init_WELL_loop
  60.  
  61.         pop     ebx
  62.         mov     esp, ebp
  63.         pop     ebp
  64.         ret
  65.  
  66.     well1024a:
  67.  
  68.         mov     esi, STATE              ; Storing STATE for easy access.
  69.  
  70.         mov     ebx, [state_n]          ; Computing z0
  71.         add     ebx, 31
  72.         and     ebx, 0000001fh
  73.         mov     eax, [esi + ebx * 4]
  74.         mov     [z0], eax
  75.  
  76.         mov     ebx, [state_n]          ; Computing I(V0) ^ MAT3POS(8, VM1).
  77.         mov     eax, [esi + ebx * 4]
  78.         push    eax
  79.  
  80.         add     ebx, M1                 ; EBX is already state_n, adding M1.    
  81.         and     ebx, 0000001fh
  82.         mov     eax, [esi + ebx * 4]
  83.         mov     cl, 8
  84.         mat3pos
  85.  
  86.         pop     ebx
  87.         xor     eax, ebx
  88.         mov     [z1], eax
  89.  
  90.         mov     ebx, [state_n]          ; Computing MAT3NEG(-19,VM2) ^ MAT3NEG(-14,VM3)
  91.         add     ebx, M2
  92.         and     ebx, 0000001fh
  93.         mov     eax, [esi + ebx * 4]
  94.         mov     cl, 19
  95.         mat3neg
  96.         push    eax
  97.  
  98.         mov     ebx, [state_n]
  99.         add     ebx, M3
  100.         and     ebx, 0000001fh
  101.         mov     eax, [esi + ebx * 4]
  102.         mov     cl, 14
  103.         mat3neg
  104.        
  105.         pop     ebx
  106.         xor     eax, ebx
  107.         mov     [z2], eax
  108.  
  109.         mov     ebx, [state_n]          ; Computing z1 ^ z2
  110.         lea     edi, [esi + ebx * 4]
  111.  
  112.         mov     eax, [z1]
  113.         xor     eax, [z2]
  114.  
  115.         mov     [edi], eax
  116.  
  117.         mov     ebx, [state_n]          ; Computing M3N(-11,z0)^M3N(-1,z1)^M3N(-13,z2)
  118.         add     ebx, 31
  119.         and     ebx, 0000001fh
  120.         lea     edi, [esi + ebx * 4]
  121.  
  122.         mov     eax, [z0]
  123.         mov     cl, 11
  124.         mat3neg
  125.         push    eax
  126.  
  127.         mov     eax, [z1]
  128.         mov     cl, 7
  129.         mat3neg
  130.         push    eax
  131.  
  132.         mov     eax, [z2]
  133.         mov     cl, 13
  134.         mat3neg
  135.  
  136.         pop     ebx
  137.         pop     ecx
  138.         xor     ebx, ecx
  139.         xor     eax, ebx
  140.         mov     [edi], eax
  141.  
  142.         mov     eax, [state_n]          ; Shifting state_n
  143.         add     eax, 31
  144.         and     eax, 0000001fh
  145.         mov     [state_n], eax
  146.  
  147.         lea     ecx, [esi + eax * 4]    ; Return.
  148.         mov     eax, 4                  ; sys_write
  149.         mov     ebx, 1                  ; stdout
  150.         mov     edx, 4                  ; 4 bytes
  151.         int     80h
  152.  
  153.         jmp     well1024a
  154.  
  155.  
  156.     _start:
  157.        
  158.         xor     edi, edi
  159.  
  160.     read_loop:
  161.  
  162.         mov     eax, 3                  ; sys_read
  163.         mov     ebx, 0                  ; stdin
  164.         lea     ecx, [seed + edi]       ; Store input to seed
  165.         mov     edx, R * 4              ; Read at most R*4 bytes.
  166.         sub     edx, edi
  167.         int     80h
  168.  
  169.         add     edi, eax
  170.         cmp     edi, R * 4
  171.         jb      read_loop
  172.  
  173.         push    seed
  174.         call    init_WELL
  175.         add     esp, 4
  176.  
  177.         jmp     well1024a
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement