extern scanf, printf
section .data
fmt_in db "%u %u %u %u", 0 ; Формат ввода: четыре беззнаковых числа
fmt_out db "%u", 10, 0 ; Формат вывода: число и перенос строки
section .bss
nums resd 4 ; Выделяем память под 4 числа (по 4 байта)
section .text
global main ; Используем main для линковки с C-runtime
main:
; 1. Считываем 4 числа с помощью scanf
push nums+12
push nums+8
push nums+4
push nums
push fmt_in
call scanf
add esp, 20 ; Очищаем стек после вызова scanf (5 аргументов * 4 байта)
; 2. Считаем НОД первых двух чисел
mov eax, [nums]
mov ebx, [nums+4]
call gcd
; 3. Считаем НОД результата и третьего числа
mov ebx, [nums+8]
call gcd
; 4. Считаем НОД результата и четвертого числа
mov ebx, [nums+12]
call gcd
; 5. Выводим итоговый результат с помощью printf
push eax
push fmt_out
call printf
add esp, 8 ; Очищаем стек (2 аргумента * 4 байта)
; Корректное завершение программы
xor eax, eax ; return 0
ret
; ---------------------------------------------------------
; Функция вычисления НОД (Алгоритм Евклида)
; Вход: eax = a, ebx = b. Выход: eax = НОД
; ---------------------------------------------------------
gcd:
test ebx, ebx ; Проверяем, равно ли b нулю
jz .end
xor edx, edx ; Обнуляем edx перед делением
div ebx ; Делим edx:eax на ebx. Остаток будет в edx
mov eax, ebx ; a = b
mov ebx, edx ; b = остаток
jmp gcd ; Повторяем
.end:
ret