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 mov eax, ' ' call io_print_char mov eax, [den_res] 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`, затем для каждой дроби считывает числитель и знаменатель. Находит общий знаменатель (НОК всех знаменателей), суммирует дроби, приводит сумму к несократимому виду и выводит числитель и знаменатель результата.

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