Online Compiler Nasm

section .bss x resd 12 y resd 12 n resd 1 sum_temp resq 1 num_res resd 1 den_res resd 1 section .text global main extern io_get_dec, io_print_dec, io_print_char main: mov ebp, esp call io_get_dec mov [n], eax cmp eax, 1 jl finish cmp eax, 12 jg finish xor ecx, ecx input_loop: cmp ecx, [n] jge compute_lcm push ecx call io_get_dec pop ecx mov [x + ecx*4], eax push ecx call io_get_dec pop ecx cmp eax, 0 je finish mov [y + ecx*4], eax inc ecx jmp input_loop compute_lcm: mov esi, 1 xor ecx, ecx lcm_loop: cmp ecx, [n] jge sum_fraction mov eax, esi mov ebx, [y + ecx*4] push ecx call lcm_64bit pop ecx mov esi, eax inc ecx jmp lcm_loop sum_fraction: xor eax, eax mov [sum_temp], eax mov dword [sum_temp + 4], eax xor ecx, ecx sum_loop: cmp ecx, [n] jge simplify_fraction push ecx mov eax, esi mov ebx, [y + ecx*4] xor edx, edx div ebx mov ebx, eax mov eax, [x + ecx*4] imul eax, ebx cdq pop ecx add dword [sum_temp], eax adc dword [sum_temp + 4], edx inc ecx jmp sum_loop simplify_fraction: cmp dword [sum_temp + 4], 0 jne finish mov eax, dword [sum_temp] mov ebx, esi call gcd mov ecx, eax mov eax, dword [sum_temp] xor edx, edx div ecx mov [num_res], eax mov eax, esi xor edx, edx div ecx mov [den_res], eax mov eax, [num_res] call io_print_dec push dword [den_res] mov eax, ' ' call io_print_char pop eax call io_print_dec finish: ret gcd: cmp ebx, 0 je gcd_done gcd_loop: xor edx, edx div ebx mov eax, ebx mov ebx, edx cmp ebx, 0 jne gcd_loop gcd_done: ret lcm_64bit: push ebx push eax call gcd mov ecx, eax pop eax pop ebx xor edx, edx div ecx mul ebx ret
1) Этот код читает число `n` (от 1 до 12), затем для каждого из `n` элементов считывает пару чисел (числитель и знаменатель). Он вычисляет сумму этих дробей, приводит их к общему знаменателю (НОК всех знаменателей), суммирует числители, а затем упрощает полученную дробь, выводя числитель и знаменатель через пробел.

2) Подсказки:
- Обрати внимание, что при вычислении НОК в `lcm_64bit` используется 64-битное умножение, но результат возвращается в `eax` (32 бита). Убедись, что НОК не превышает 2^32, иначе будет переполнение.
- В процедуре `gcd` предполагается, что в `eax` уже загружено делимое перед вызовом. Проверь, что `eax` и `ebx` корректно подготовлены перед каждым вызовом `gcd`.