_takumi

hw3n13

Feb 27th, 2022 (edited)
1,200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. %include "io.inc"
  2.  
  3. section .bss
  4.     arr resd 1000000
  5.  
  6. section .text
  7. global CMAIN
  8. CMAIN:
  9.     mov ebp, esp; for correct debugging
  10.     GET_UDEC 4, eax
  11.     xor ecx, ecx
  12. .readarr:
  13.     cmp ecx, eax
  14.     jge .readarr_end
  15.     GET_DEC 4, edx
  16.     mov dword[arr + ecx * 4], edx
  17.     inc ecx
  18.     jmp .readarr
  19. .readarr_end:
  20.     GET_DEC 1, cl
  21.     cmp cl, 32
  22.     jne .loop1_end; loop1 для случая когда cl = 32, тогда мы просто свапаем элементы массива попарно
  23.     mov edx, eax
  24.     dec edx
  25.     mov esi, dword[arr + 4 * edx]
  26.     xor edx, edx
  27. .loop1:
  28.     cmp edx, eax
  29.     jge .loop1_end
  30.     xchg esi, dword[arr + 4 * edx]
  31.     inc edx
  32.     jmp .loop1
  33. .loop1_end:
  34.     mov ebx, 1
  35.     shl ebx, 31
  36.     sar ebx, cl
  37.     rol ebx, cl; в ebx маска
  38.     mov edx, eax
  39.     dec edx
  40.     and ebx, dword[arr + 4 * edx]; сохраняем в ebx младшие cl бит последнего числа в массиве, так как они будут утеряны после исполнения цикла
  41. .loop2:
  42.     cmp edx, 0; в цикле совершаем сдвиг для всех чисел в массиве кроме первого, чтобы избежать segfault
  43.     jle .loop2_end
  44.     mov esi, dword[arr + 4 * edx - 4]
  45.     shrd dword[arr + 4 * edx], esi, cl
  46.     dec edx
  47.     jmp .loop2
  48. .loop2_end:
  49.     shrd dword[arr], ebx, cl; первое число сдвигаем отдельно
  50.     xor ecx, ecx
  51. .printarr:
  52.     cmp ecx, eax
  53.     jge .printarr_end
  54.     PRINT_UDEC 4, [arr + ecx * 4]
  55.     PRINT_CHAR 32
  56.     inc ecx
  57.     jmp .printarr
  58. .printarr_end:
  59.     xor eax, eax
  60.     ret
Add Comment
Please, Sign In to add comment