Online Compiler Nasm

extern scanf, printf section .data fin db "%d %d %d %d %d %d", 0 fout db "%d", 10, 0 section .bss x1 resd 1 y1 resd 1 x2 resd 1 y2 resd 1 x3 resd 1 y3 resd 1 granica resd 1 section .text global main main: push ebp mov ebp, esp push y3 push x3 push y2 push x2 push y1 push x1 push fin call scanf add esp, 28 mov dword [granica], 0 mov eax, [x2] sub eax, [x1] mov ebx, [y2] sub ebx, [y1] call nod add [granica], eax mov eax, [x3] sub eax, [x2] mov ebx, [y3] sub ebx, [y2] call nod add [granica], eax mov eax, [x1] sub eax, [x3] mov ebx, [y1] sub ebx, [y3] call nod add [granica], eax mov eax, [x2] sub eax, [x1] mov ebx, [y3] sub ebx, [y1] imul ebx mov ecx, eax mov edi, edx mov eax, [x3] sub eax, [x1] mov ebx, [y2] sub ebx, [y1] imul ebx sub ecx, eax sbb edi, edx cmp edi, 0 jge .ploshad not edi not ecx add ecx, 1 adc edi, 0 .ploshad: sub ecx, [granica] sbb edi, 0 add ecx, 2 adc edi, 0 shr edi, 1 rcr ecx, 1 push ecx push fout call printf add esp, 8 mov eax, 0 mov esp, ebp pop ebp ret nod: cmp eax, 0 jge .znak neg eax .znak: cmp ebx, 0 jge .cikl neg ebx .cikl: cmp ebx, 0 je .end mov edx, 0 div ebx mov eax, ebx mov ebx, edx jmp .cikl .end: ret
1) Этот код вычисляет количество целочисленных точек внутри треугольника по координатам трёх вершин, используя формулу Пика. Сначала он считывает координаты, затем вычисляет периметр (сумму НОД длин сторон), площадь через векторное произведение и применяет формулу.

2) Подсказки:
- Функция `nod` вычисляет наибольший общий делитель (НОД) чисел в `eax` и `ebx` с помощью алгоритма Евклида, но учти, что она ожидает неотрицательные входные данные.
- Для расчёта площади используется псевдоскалярное произведение векторов, результат получается в 64-битном числе (пара регистров `edi:ecx`), что важно для последующего деления на 2.