Online Compiler Nasm

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
1) Этот код вычисляет количество целочисленных точек внутри треугольника по формуле Пика. Программа считывает координаты трёх вершин, вычисляет удвоенную площадь, количество точек на границе, а затем находит количество внутренних точек.

2) Обрати внимание, что для работы с 64-битными числами (удвоенная площадь) используются пары регистров `edx:eax` и операции `adc/sbb`.  
   Убедись, что понимаешь, как функция `find_gcd` использует алгоритм Евклида через деление `div ecx` — результат НОД остаётся в `eax`.