extern puts section .data arr: times 32 dw 0 buf times 37 db 0 nl db 0 section .text %macro read 1 %assign n (17 * %1) %assign f n >> 4 ; номер первого слова-хранителя %assign s f + 1 ; номер вторго слова-хранителя %assign shf n - ((n>>4)<<4) ; количество бит предыдущего 17-битного слова, которое нужно убрать в первом слове-хранителе %assign shs 16 - (shf+1) ; количество бит следующего 17-битного слова, которое нужно убрать во втором слове-хранителе push rbx xor rax,rax xor rbx,rbx mov ax, word [arr+f*2] mov bx, word [arr+s*2] shl ax, shf shl rax, 1 shr bx, shs or rax, rbx pop rbx %endmacro %macro rol17 2 push rax push rbx read %1 shl rax, %2 mov rbx, rax shr rbx, 17 or rax, rbx write %1 pop rbx pop rax %endmacro %macro write 1 push rcx push rdx push rbx push rax %assign n (17 * %1) %assign f n >> 4 ; номер первого слова-хранителя %assign s f + 1 ; номер вторго слова-хранителя %assign shf 16 - (n - ((n>>4)<<4)) ; количество бит текущего 17-битного слова в первом слове-хранителе %assign shs (16-shf+1) ; количество бит текущего 17-битного слова во втором слове-хранителе mov rbx, rax mov cx, word [arr+f*2] mov dx, word [arr+s*2] shr cx, shf shl cx, shf shr rax, 17-shf or cx, ax mov [arr+f*2], cx shl dx, shs shr dx, shs shl bx, 16-shs or dx, bx mov [arr+s*2], dx pop rax pop rbx pop rdx pop rcx %endmacro dump: push rax push rbx push rcx push rdx push rsi push rdi mov rcx, 32 xor rdi, rdi larr: push rcx xor rax, rax mov ax, word [arr+rdi] mov rbx, buf mov rcx, 16 mov dx, 1 shl dx, 15 xor rsi, rsi l1: test dx, ax jz zero mov [rbx+rsi], byte '1' jmp lend zero: mov [rbx+rsi], byte '0' lend: inc rsi shr dx, 1 loop l1 push rdi mov rdi, buf mov rax, 0 call puts pop rdi pop rcx add rdi, 2 loop larr pop rdi pop rsi pop rdx pop rcx pop rbx pop rax ret global main main: push rbp mov rbp, rsp mov rax, 10001111000011110b write 0 mov rax, 10111110111101111b write 1 mov rax, 10110111110001101b write 2 mov rax, 10101100110110110b write 3 mov rax, 11101010110101011b write 4 mov rax, 10101010111110111b write 5 mov rax, 11011111000111111b write 6 mov rax, 11111111111111111b write 7 mov rax, 10000000000000001b write 8 mov rax, 10111111111111011b write 9 mov rax, 10111101110000001b write 10 mov rax, 10111101111101110b write 11 mov rax, 10100000000011100b write 12 mov rax, 10010010001000000b write 13 mov rax, 10001110101111110b write 14 mov rax, 10111111111110000b write 15 mov rax, 10000100000100001b call dump mov rdi, nl mov rax, 0 call puts rol17 0,5 rol17 1,17 rol17 2,4 rol17 3,5 rol17 4,16 rol17 5,1 rol17 6,14 rol17 7,7 rol17 8,5 rol17 9,2 rol17 10,1 rol17 11,7 rol17 12,9 rol17 13,2 rol17 14,12 rol17 15,3 call dump ret