extern io_get_dec, io_print_udec
section .bss
x1 resd 1
y1 resd 1
x2 resd 1
y2 resd 1
x3 resd 1
y3 resd 1
double_area_low resd 1
double_area_high resd 1
border_points_low resd 1
border_points_high resd 1
section .text
global main
find_gcd:
push ebp
mov ebp, esp
mov eax, [ebp + 8]
mov ecx, [ebp + 12]
find_gcd_loop:
test ecx, ecx
jz find_gcd_done
xor edx, edx
div ecx
mov eax, ecx
mov ecx, edx
jmp find_gcd_loop
find_gcd_done:
mov esp, ebp
pop ebp
ret
main:
call io_get_dec
mov [x1], eax
call io_get_dec
mov [y1], eax
call io_get_dec
mov [x2], eax
call io_get_dec
mov [y2], eax
call io_get_dec
mov [x3], eax
call io_get_dec
mov [y3], eax
mov dword [double_area_low], 0
mov dword [double_area_high], 0
mov eax, [x1]
mov ecx, [y2]
sub ecx, [y3]
imul ecx
add dword [double_area_low], eax
adc dword [double_area_high], edx
mov eax, [x2]
mov ecx, [y3]
sub ecx, [y1]
imul ecx
add dword [double_area_low], eax
adc dword [double_area_high], edx
mov eax, [x3]
mov ecx, [y1]
sub ecx, [y2]
imul ecx
add dword [double_area_low], eax
adc dword [double_area_high], edx
cmp dword [double_area_high], 0
jge double_area_ready
not dword [double_area_low]
not dword [double_area_high]
add dword [double_area_low], 1
adc dword [double_area_high], 0
double_area_ready:
mov dword [border_points_low], 0
mov dword [border_points_high], 0
mov eax, [x2]
sub eax, [x1]
jns edge12_dx_ready
neg eax
edge12_dx_ready:
push eax
mov eax, [y2]
sub eax, [y1]
jns edge12_dy_ready
neg eax
edge12_dy_ready:
push eax
call find_gcd
add esp, 8
add dword [border_points_low], eax
adc dword [border_points_high], 0
mov eax, [x3]
sub eax, [x2]
jns edge23_dx_ready
neg eax
edge23_dx_ready:
push eax
mov eax, [y3]
sub eax, [y2]
jns edge23_dy_ready
neg eax
edge23_dy_ready:
push eax
call find_gcd
add esp, 8
add dword [border_points_low], eax
adc dword [border_points_high], 0
mov eax, [x1]
sub eax, [x3]
jns edge31_dx_ready
neg eax
edge31_dx_ready:
push eax
mov eax, [y1]
sub eax, [y3]
jns edge31_dy_ready
neg eax
edge31_dy_ready:
push eax
call find_gcd
add esp, 8
add dword [border_points_low], eax
adc dword [border_points_high], 0
mov eax, [border_points_low]
mov edx, [border_points_high]
sub dword [double_area_low], eax
sbb dword [double_area_high], edx
add dword [double_area_low], 2
adc dword [double_area_high], 0
mov eax, [double_area_low]
mov edx, [double_area_high]
shrd eax, edx, 1
call io_print_udec
ret