.include "my-macro"  # подключение файла с макроопределениями

/*
Получение 10-х цифр двоичного числа и вывод их на терминал
 */

.data                   # секция данных, распределение памяти

n:     .short 2345      # число для перевода 2->10

digits_of_n:    .ascii "     " # коды символов 10-х цифр - 5 пробелов

    .align 16           # выравниваем на 16 битовую границу

length: .long 0         # количество 10 цифр в числе

ten:     .short 10      # делитель


.text                   # секция команд процесора

.global _start          # точка входа - глобальная метка

_start:
    movl $0, %ebx       # счетчик делений
    movw n, %ax         # готовим деление
    movl $4,%esi        # начальное значение индекса - на старший
                        # байт строки digits_of_n

nextdigit:

#   Т.к. переводим 16 битовое слово, то работаем с 16 бит рег

    movw  $0, %dx       # готовим деление в цикле
    idivw ten           # делим объединенные регистры dx:ax на 10
                        # частное в  ax, остаток в dx

#   Превращаем значение остатка в код цифры

    addw $48,%dx

#   !!! пишем код цифры остатка в байт строки 10digits-of-n
#   на который указывает  %esi

    leal digits_of_n(%esi), %ecx # демонстрация исполнительного адреса

#   команда leal вычисляет ИА и посылает его в регистр 2 операнда
#   теперь в %ecx - адрес байта куда запишется код цифры
#   команда пристутствует только для учебных целей


    movb %dl,digits_of_n(%esi)

#   готовим обработку след. цифры

    incl %ebx           # счетчик делений + 1
    decl %esi           # устанавливаем индекс на байт для 
                        # след. кода цифры
    cmpl $0, %eax       # частное = 0 ?
    jg   nextdigit      # НЕТ, продолжаем
    movl %ebx, length   # ДА, сохраняем результат

#   Вывод десятичного представления, сис. вызов write

    movl $4, %eax           # номер сист. вызова write
    movl $1, %ebx           # 1 дескриптор стандартного вывода
    movl $digits_of_n, %ecx # адрес памяти с выводимыми символами
    movl $5, %edx           # количество байтов для вывода
    int $0x80               # выполнить системный вызов

    Finish                  # конец работы, возврат в ОС
                            # (макро из файла my-macro)

.end   # последняя строка исходного текста
