Online Compiler Nasm

global _start section .text _start: ; Загружаем входные данные (в реальности чтение из stdin) mov r8d, 1 ; a11 mov r9d, 1 ; a12 mov r10d, 0 ; a21 mov r11d, 1 ; a22 mov r12d, 0 ; b1 mov r13d, 1 ; b2 xor eax, eax ; x = 0 xor ebx, ebx ; y = 0 mov ecx, 32 ; счетчик битов next_bit: dec ecx ; Сохраняем текущие x, y push rax push rbx ; Пробуем установить бит в x mov edx, 1 shl edx, cl ; маска бита or eax, edx ; x с установленным битом ; Проверяем оба уравнения для пробного x ; Уравнение 1 mov edi, r8d ; a11 push rax mul edi mov esi, eax ; p1 = a11 * x mov edi, r9d ; a12 mov eax, ebx ; y mul edi mov edi, eax ; q1 = a12 * y and edi, esi ; p1 & q1 xor edi, r12d ; сравнение с b1 neg edi sbb edi, edi not edi ; edi = маска битов, где условие выполняется ; Уравнение 2 mov esi, r10d ; a21 pop rax push rax mul esi mov esi, eax ; p2 = a21 * x mov edi, r11d ; a22 mov eax, ebx ; y mul edi mov edi, eax ; q2 = a22 * y and edi, esi ; p2 & q2 xor edi, r13d ; сравнение с b2 neg edi sbb edi, edi not edi ; edi = маска битов, где условие выполняется pop rax and edi, edx ; применяем к текущему биту xor eax, edi ; если edi=0 (не подходит), оставляем бит=0 mov [rsp+8], eax ; обновляем x в стеке ; Теперь пробуем установить бит в y pop rbx pop rax push rax push rbx mov edx, 1 shl edx, cl or ebx, edx ; y с установленным битом ; Уравнение 1 с пробным y mov edi, r8d ; a11 mul edi mov esi, eax ; p1 mov edi, r9d ; a12 mov eax, ebx ; y пробный mul edi mov edi, eax ; q1 and edi, esi xor edi, r12d neg edi sbb edi, edi not edi ; Уравнение 2 с пробным y mov esi, r10d ; a21 pop rax push rax mul esi mov esi, eax ; p2 mov edi, r11d ; a22 mov eax, ebx ; y пробный mul edi mov edi, eax ; q2 and edi, esi xor edi, r13d neg edi sbb edi, edi not edi pop rax and edi, edx xor ebx, edi ; обновляем y mov [rsp], ebx pop rbx pop rax cmp ecx, 0 jne next_bit ; только этот переход - для цикла ; Результат в eax (x) и ebx (y) ; Вывод результатов (здесь заглушка) ; Завершение программы mov eax, 60 ; syscall exit xor edi, edi syscall
1) Этот код на NASM64 (не NASM32) решает систему битовых уравнений вида (a11*x & a12*y) = b1 и (a21*x & a22*y) = b2 для 32-битных переменных x и y, используя перебор по битам от старших к младшим.

2) Подсказки:
- Обрати внимание, что код использует 64-битные регистры (rax, r8-r13), но работает с 32-битными данными (использует младшие части регистров). Это может привести к ошибкам при операциях mul, так как они затрагивают старшие биты rax/rdx.
- Алгоритм сохраняет промежуточные значения x и y в стеке, но управление стеком (push/pop) сложное и легко может привести к разбалансировке стека или неправильному доступу к данным.