extern puts section .data arr: times 32 dd 0 buf times 37 db 0 nl db 0 section .text %macro read 1 %assign n (33 * %1) %assign f n >> 8 ; номер первого слова-хранителя %assign s f + 1 ; номер вторго слова-хранителя %assign shf n - ((n>>5)<<5) ; количество бит предыдущего 17-битного слова, которое нужно убрать в первом слове-хранителе %assign shs 32 - (shf+1) ; количество бит следующего 17-битного слова, которое нужно убрать во втором слове-хранителе push rbx xor rax,rax xor rbx,rbx mov eax, dword [arr+f*4] mov ebx, dword [arr+s*4] shl eax, shf shl rax, 1 shr ebx, shs or rax, rbx pop rbx %endmacro %macro rol33 2 push rax push rbx read %1 shl rax, %2 mov rbx, rax shr rbx, 33 or rax, rbx write %1 pop rbx pop rax %endmacro %macro write 1 push rcx push rdx push rbx push rax %assign n (33 * %1) %assign f n >> 5 ; номер первого слова-хранителя %assign s f + 1 ; номер вторго слова-хранителя %assign shf 32 - (n - ((n>>5)<<5)) ; количество бит текущего 17-битного слова в первом слове-хранителе %assign shs (32-shf+1) ; количество бит текущего 17-битного слова во втором слове-хранителе mov rbx, rax mov ecx, dword [arr+f*4] mov edx, dword [arr+s*4] shr ecx, shf shl ecx, shf shr rax, 33-shf or ecx, eax mov [arr+f*4], ecx shl edx, shs shr edx, shs shl ebx, 32-shs or edx, ebx mov [arr+s*4], edx 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 eax, dword [arr+rdi] mov rbx, buf mov rcx, 32 mov edx, 1 shl edx, 31 xor rsi, rsi l1: test edx, eax jz zero mov [rbx+rsi], byte '1' jmp lend zero: mov [rbx+rsi], byte '0' lend: inc rsi shr edx, 1 loop l1 push rdi mov rdi, buf mov rax, 0 call puts pop rdi pop rcx add rdi, 4 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, 111111111111111110001111000011110b write 0 mov rax, 111111111111111110111110111101111b write 1 mov rax, 111111111111111110110111110001101b write 2 mov rax, 111111111111111110101100110110110b write 3 mov rax, 111111111111111111101010110101011b write 4 mov rax, 111111111111111110101010111110111b write 5 mov rax, 111111111111111111011111000111111b write 6 mov rax, 111111111111111111111111111111111b write 7 mov rax, 111111111111111110000000000000001b write 8 mov rax, 111111111111111110111111111111011b write 9 mov rax, 111111111111111110111101110000001b write 10 mov rax, 111111111111111110111101111101110b write 11 mov rax, 111111111111111110100000000011100b write 12 mov rax, 111111111111111110010010001000000b write 13 mov rax, 111111111111111110001110101111110b write 14 mov rax, 111111111111111110111111111110000b write 15 mov rax, 111111111111111110000100000100001b call dump mov rdi, nl mov rax, 0 call puts rol33 0,5 rol33 1,17 rol33 2,4 rol33 3,5 rol33 4,16 rol33 5,1 rol33 6,14 rol33 7,7 rol33 8,5 rol33 9,2 rol33 10,1 rol33 11,7 rol33 12,9 rol33 13,2 rol33 14,12 rol33 15,3 call dump ret