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