Advertisement
MineOrpe

Untitled

Jan 9th, 2022
1,612
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. section .text
  2. global main
  3. extern printf
  4. extern putchar ; импорт C функций
  5. extern exit
  6. main:
  7.     rdseed eax
  8.     rdrand eax
  9.     mov [A], eax ; генерируем случайное число
  10.    
  11.     rdrand eax
  12.     mov ebx, 1
  13.     shl ebx, 31     ; на всякий случай сделаем случайное число положительным, обнулив первый бит
  14.     xor eax, ebx
  15.     mov ebx, 4       ; генерируем случайный сдвиг (случайный int по модулю 4)
  16.     mov edx, 0
  17.     div ebx
  18.     mov [n], edx
  19.    
  20.     mov eax, [A]
  21.     mov ebx, [n]
  22.     push ebx
  23.     push eax      ; выводим число в формате Hex и сдвиг
  24.     push str1
  25.     call printf
  26.    
  27.     mov eax, [A]
  28.     call print_binary_number       ; выводим число в двоичном виде
  29.    
  30.     mov ecx, 31
  31.     push ebx
  32.     push edx
  33.     xor ebx, ebx
  34.     xor edx, edx
  35.     lp1:
  36.         push ecx
  37.        
  38.         push ebx
  39.         mov edx, [A]
  40.         mov ebx, 1
  41.         shl ebx, cl
  42.         and edx, ebx
  43.         and ecx, 1
  44.         jnz oddl
  45.         mov ebx, [even]
  46.         or ebx, edx             ; в зависимости от честности счетчика меняем либо odd, либо even
  47.         mov [even], ebx
  48.         jmp next
  49.         oddl:
  50.             mov ebx, [odd]
  51.             or ebx, edx
  52.             mov [odd], ebx
  53.         next:
  54.         pop ebx
  55.         pop ecx
  56.         dec ecx
  57.         cmp ecx, 0
  58.         jge lp1
  59.        
  60.     pop edx
  61.     pop ebx
  62.    
  63.     mov eax, [even]
  64.     mov ecx, [n]
  65.     ror eax, cl
  66.     mov [even], eax            ; сдвигаем odd и even
  67.     mov eax, [odd]
  68.     rol eax, cl
  69.     mov [odd], eax
  70.    
  71.     mov eax, [even]
  72.     mov ebx, [odd]
  73.     or eax, ebx
  74.     mov [A], eax                   ; склеиваем финальное число и выводим в консоль
  75.     push eax
  76.     push str2
  77.     call printf
  78.    
  79.     mov eax, [A]
  80.     call print_binary_number          
  81.    
  82.     push 0
  83.     call exit
  84.    
  85.     ret
  86.    
  87. print_binary_number:            ; бинарный вывод числа
  88.     push ecx
  89.     push ebx
  90.     push edx
  91.     mov ecx, 0
  92.     print_loop:
  93.         mov ebx, 48
  94.         mov edx, eax
  95.         and edx, 0x80000000
  96.         jz print_char
  97.         inc ebx
  98.         print_char:
  99.             push ecx
  100.             push eax
  101.             push ebx
  102.             call putchar
  103.             add esp, 4
  104.             pop eax
  105.             shl eax, 1
  106.             pop ecx
  107.         inc ecx
  108.         cmp ecx, 31
  109.         jng print_loop
  110.    
  111.     push newline
  112.     call printf
  113.     add esp, 4
  114.    
  115.     pop edx
  116.     pop ebx
  117.     pop ecx
  118.    
  119.     ret
  120.    
  121.    
  122. section .data
  123. A dd 0xDEADBEEF
  124. str1 db '%X moved by %d', 10, 0
  125. str2 db '%X', 10, 0
  126. newline db 10,0
  127. even dd 0
  128. odd dd 0
  129. n dw 2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement