.global gcd // аргументы: r25:r24 - 1 число, r23:r22 - 2 число // изменяемые регистры: r27:r26 - буфер для обмена чисел gcd: // сравнение 2-байтовых чисел cp r25, r23 brne .cpend1 cp r24, r22 .cpend1: brsh .cp1_ge .cp1_lo: // ч2 - большее, меняем местами с ч1 movw r26, r22 // буфер <-- ч2 movw r22, r24 // ч2 <-- ч1 movw r24, r26 // ч1 <-- буфер jmp .cp1_ge .cp1_ge: // ч1 - большее, оставляем всё как есть // отнимаем от большего меньшее (ч1 - ч2) sub r24, r22 sbc r25, r23 // сравниваем большее число (ч1) с нулём cpi r25, lo8(0) brne .cpend2 cpi r24, lo8(0) .cpend2: breq .ret // не равно 0: вызываем функцию рекурсивно call gcd // теперь ч1 содержит НОД двух чисел, посчитанных рекурсивно ret // равно 0: возвращаем ч2 .ret: movw r24, r22 // ч1 (возвращаемое значение) <-- ч2 ret