section .bss
px resd 3
py resd 3
section .text
extern io_get_dec, io_print_dec, io_newline
global main
main:
mov ebp, esp
push ebx
push esi
push edi
xor esi, esi
.read:
call io_get_dec
mov [px + esi*4], eax
call io_get_dec
mov [py + esi*4], eax
inc esi
cmp esi, 3
jl .read
mov eax, [py + 1*4]
sub eax, [py + 2*4]
imul eax, [px + 0*4]
mov edi, eax
mov eax, [py + 2*4]
sub eax, [py + 0*4]
imul eax, [px + 1*4]
add edi, eax
mov eax, [py + 0*4]
sub eax, [py + 1*4]
imul eax, [px + 2*4]
add edi, eax
mov eax, edi
cdq
xor eax, edx
sub eax, edx
mov edi, eax
xor esi, esi
mov eax, [px + 0*4]
sub eax, [px + 1*4]
cdq
xor eax, edx
sub eax, edx
mov ebx, eax
mov eax, [py + 0*4]
sub eax, [py + 1*4]
cdq
xor eax, edx
sub eax, edx
call euclid
add esi, eax
mov eax, [px + 1*4]
sub eax, [px + 2*4]
cdq
xor eax, edx
sub eax, edx
mov ebx, eax
mov eax, [py + 1*4]
sub eax, [py + 2*4]
cdq
xor eax, edx
sub eax, edx
call euclid
add esi, eax
mov eax, [px + 2*4]
sub eax, [px + 0*4]
cdq
xor eax, edx
sub eax, edx
mov ebx, eax
mov eax, [py + 2*4]
sub eax, [py + 0*4]
cdq
xor eax, edx
sub eax, edx
call euclid
add esi, eax
mov eax, edi
sub eax, esi
add eax, 2
sar eax, 1
call io_print_dec
call io_newline
pop edi
pop esi
pop ebx
xor eax, eax
ret
euclid:
push ebx
push edx
.step:
test ebx, ebx
jz .finish
xor edx, edx
div ebx
mov eax, ebx
mov ebx, edx
jmp .step
.finish:
pop edx
pop ebx
ret