format PE console
include 'win32a.inc'

MAX_RAND=1024

section '.text' code readable executable

entry $

    invoke  CryptAcquireContext,_context,0,0,1,0xF0000000
    test    eax,eax
    jz      .done
    invoke  CryptGenRandom,[_context],MAX_RAND,_rand
    invoke  CryptReleaseContext,[_context],0

    invoke  GetStdHandle, STD_OUTPUT_HANDLE
    mov     [_stdout], eax
.done:
    mov     ecx, [_index]
    mov     dl, byte [_rand + ecx]
    bt      edx, 01000_0000b
    jc      .LEFT
    bt      edx, 0000_0001b
    jc      .NOMOVE
    inc     [_right]
    jmp     .again
.LEFT:
    inc     [_left]
    jmp     .again
.NOMOVE:
    inc     [_nomove]
.again:
    inc     [_index]
    cmp     [_index], MAX_RAND
    jb      .done

    mov     eax, [_left]
    call    itoa
    mov     [_numlen], ebx
    invoke  WriteFile, [_stdout], _msgleft, _len, _dummy, 0
    invoke  WriteFile, [_stdout], _number, [_numlen], _dummy, 0
    mov     eax, [_right]
    call    itoa
    mov     [_numlen], ebx
    invoke  WriteFile, [_stdout], _msgright, _len, _dummy, 0
    invoke  WriteFile, [_stdout], _number, [_numlen], _dummy, 0
    mov     eax, [_nomove]
    call    itoa
    mov     [_numlen], ebx
    invoke  WriteFile, [_stdout], _msgnomove, _len, _dummy, 0
    invoke  WriteFile, [_stdout], _number, [_numlen], _dummy, 0
    invoke  WriteFile, [_stdout], _msgcrlf, 2, _dummy, 0



    invoke  ExitProcess, 0

itoa:                      ;-) Nice code snippet by Pauli Lindgren  (https://pkl.paldex.fi/)
; INPUT:  EAX
; OUTPUT: _number
; LEN OF OUTPUT: EBX
         mov     ecx, 10
         xor     ebx, ebx

.divide:
         xor     edx, edx
         div     ecx
         push    edx
         inc     ebx
         test    eax, eax
         jnz     .divide

         mov     ecx, ebx
         lea     esi, [_number]
.next:
         pop     eax
         add     al, '0'
         mov     [esi], al
         inc     esi
         loop    .next
         ret

section '.data' data readable writeable

    _msgleft     db    13,10,'LEFT =     '
    _msgright    db    13,10,'RIGHT =    '
    _msgnomove   db    13,10,'NOMOVE =   '
    _len         =     $ - _msgnomove
    _msgcrlf     db    13,10
    _numlen      dd    0
    _dummy       dd    0
    _left        dd    0
    _right       dd    0
    _nomove      dd    0
    _index       dd    0
    _context     dd    0
    _stdout      dd    0
    _number      rb    10
    _rand        rb    MAX_RAND

section '.idata' import readable

    library kernel, 'KERNEL32.DLL',\
            advapi, 'ADVAPI32.DLL'

    import kernel,\
           WriteFile, 'WriteFile',\
           GetStdHandle, 'GetStdHandle',\
           ExitProcess, 'ExitProcess'

    import advapi,\
           CryptAcquireContext, 'CryptAcquireContextA',\
           CryptGenRandom, 'CryptGenRandom',\
           CryptReleaseContext, 'CryptReleaseContext'
