Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %include "io.inc"
- section .bss
- arr resd 1000000
- section .text
- global CMAIN
- CMAIN:
- mov ebp, esp; for correct debugging
- GET_UDEC 4, eax
- xor ecx, ecx
- .readarr:
- cmp ecx, eax
- jge .readarr_end
- GET_DEC 4, edx
- mov dword[arr + ecx * 4], edx
- inc ecx
- jmp .readarr
- .readarr_end:
- GET_DEC 1, cl
- cmp cl, 32
- jne .loop1_end; loop1 для случая когда cl = 32, тогда мы просто свапаем элементы массива попарно
- mov edx, eax
- dec edx
- mov esi, dword[arr + 4 * edx]
- xor edx, edx
- .loop1:
- cmp edx, eax
- jge .loop1_end
- xchg esi, dword[arr + 4 * edx]
- inc edx
- jmp .loop1
- .loop1_end:
- mov ebx, 1
- shl ebx, 31
- sar ebx, cl
- rol ebx, cl; в ebx маска
- mov edx, eax
- dec edx
- and ebx, dword[arr + 4 * edx]; сохраняем в ebx младшие cl бит последнего числа в массиве, так как они будут утеряны после исполнения цикла
- .loop2:
- cmp edx, 0; в цикле совершаем сдвиг для всех чисел в массиве кроме первого, чтобы избежать segfault
- jle .loop2_end
- mov esi, dword[arr + 4 * edx - 4]
- shrd dword[arr + 4 * edx], esi, cl
- dec edx
- jmp .loop2
- .loop2_end:
- shrd dword[arr], ebx, cl; первое число сдвигаем отдельно
- xor ecx, ecx
- .printarr:
- cmp ecx, eax
- jge .printarr_end
- PRINT_UDEC 4, [arr + ecx * 4]
- PRINT_CHAR 32
- inc ecx
- jmp .printarr
- .printarr_end:
- xor eax, eax
- ret
Add Comment
Please, Sign In to add comment