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