Online Compiler Nasm

extern io_get_dec, io_print_dec, io_print_string, io_print_char section .bss n resd 1 a resd 1 b resd 1 section .data num dd 1 den dd 1 section .text global main main: call io_get_dec mov [n], eax mov ecx, dword[n] .beg: cmp ecx, 0 je .done call io_get_dec mov [a], eax call io_get_dec mov [b], eax mov eax, dword[a] mov edi, dword[den] mul edi; eax = a * den mov esi, eax; esi = a * den mov eax, [b] mov edi, dword[num] mul edi; eax = b * num add esi, edi; esi = a * den + b * num mov eax, dword[b] mov ebx, dword[den] mul ebx; eax = b * den mov ebx, eax; ebx = b * den push esi push ebx call gcd add esp, 8 mov edi, eax; edi = gcd mov eax, esi; eax = a * den + b * num xor edx, edx idiv edi; eax = (a * den + b * num) / gcd mov [num], eax; num = (a * den + b * num) / gcd mov eax, ebx; eax = b * den xor edx, edx idiv edi; eax = (b * den) / gcd mov [den], eax; den = (b * den) / gcd jmp .beg .done: mov eax, num call io_print_dec mov eax, ' ' call io_print_char mov eax, den call io_print_dec xor eax, eax ret gcd: push ebp mov ebp, esp mov eax, dword[ebp + 8] mov ebx, dword[ebp + 12] cmp eax, ebx cmovl eax, dword[ebp + 12] cmovl ebx, dword[ebp + 8] .beg: cmp ebx, 0 je .zero xor edx, edx idiv ebx; eax = a / b, edx = a % b cmp edx, 0 je .done mov eax, ebx mov ebx, edx jmp .beg .zero: mov ebx, eax .done: mov eax, ebx leave ret
1) Этот код последовательно считывает пары чисел (a, b) и вычисляет их сумму в виде дроби, используя общий знаменатель. В конце программа выводит числитель и знаменатель итоговой суммы.

2) Подсказки:
- Обрати внимание на инструкцию `add esi, edi`. В регистре `edi` после умножения находится значение `b * num`, но после операции `mul edi` регистр `edi` не изменяется. Проверь, действительно ли в `edi` лежит нужное значение для сложения.
- В функции `gcd` для обмена значений `eax` и `ebx` используется пара `cmovl`. Убедись, что эти инструкции корректно меняют местами аргументы, если `eax < ebx`.