
/*
 
Макроопределение завершения работы.
  Аргументы:
  	- код завершения программы
 
  После выполнения макровызова изменяются
  регистры: %eax, %ebx
  См. также 'man 2 exit'

*/

.macro Exit ret_val
	
	movl $1, %eax 	# номер сист. вызова exit
	movl \ret_val, %ebx # код выхода
	int $0x80 		# вызов обработчика программных
                    # прерываний по системным вызовам
.endm

/*
 Макроопределение для считывания одного 
  байта кода символа из файла стандартного
  ввода stdin
  
  Аргументы:
  	- адрес буфера для считывания байта

  Результат:

  Во время вссемблирования:
    
    - формирует код сисвызова read для
      чтения в буфер ОП по адресу
      фрактического аргумента одного байта
      
  Во время выполнения:

    - выполняет код сисвызова read, который:
      если в stdin нет байтов - ожидает
      если есть - читает 1 байт и пишет
      его по адресу фактического аргумента
  
  После выполнения макровызова изменяются 
  регистры: %eax, %ebx, %ecx, %edx
 
  См. также 'man 2 read'
*/

.macro Getchar buf_addr

	movl $3, %eax	      # номер сист. вызова read

	movl $0, %ebx		  # 1-й параметр: дескриптор stdin
	movl \buf_addr, %ecx  # 2-й параметр: адрес буфера, задается
                          # фактичесим аргументом макро
	movl $1, %edx		  # 3-й параметр: количество байтов
	                      # для чтения в буфер
	                      
	int $0x80		      # вызов обработчика программных
                          # прерываний по системным вызовам
                          
.endm

/*
Макроопределение для  вывода строки
  в файл стандартного вывода stdout
 
  Аргументы:
  	- Строковый литерал для вывода.
 
  Пример макровызова:
 	
 	Puts "Текст выводимой строки" 
 
  Результат:

  Во время вссемблирования:
   
   - Задает в секции данных строку аргумента
     с меткой str\@: завершая ее escape
      последовательностью перевода строки \n

   - вычисляет и присваивает символьному имени
     str\@ значение длины строки

   - формирует код сис вызова write
     для вывода строки в файл stdout     

   где::

     \@ - псевдопеременная - счетчик количеcтва
  выполненных макровызовов, после выполнения
  любого макровызова увеличисается на 1.
  Это обеспечивает уникальность имен строк
  при многократных макровызовах.

  Во время выполнения:

   - выполняет код сисвызова write для
     вывода строки аргумента в файл stdout     

  После выполнения макровызова изменяются
  регистры: %eax, %ebx, %ecx, %edx
 
  См. также 'man puts', 'man 2 write'

*/

.macro Puts string

.data
  str\@: .ascii "\string\n"  # определение строки для вывода
	
  strlen\@ = . - str\@       # выражение времени ассемблтрования
                             # вычисляющее значение длины строки

/*

  Специальное символьное имя "." имеет значение 
  текущего адреса в секции куда размещнются при
  ассемблировании коды данных и команд. 
  В каждой секции свой независимый от
  других текущий адрес.

  Здесь "." иеет значение адреса байта,
  следующего за последним байтом строки,
  размещенным директивой str\@:  .ascii "\string\n",
  а метка str\@: - значение адреса первого байта
  этой строки.
  Т.е. выражение strlen\@ = . - str\@ дает искомую длину

*/

.text
	
	movl $4, %eax		# номер сист. вызова write
	movl $1, %ebx		# 1-й параметр: дескриптор stdout	
	movl $str\@, %ecx	# 2-й параметр: адрес строки для вывода
	movl $strlen\@, %edx # 3-й параметр: кол-во байтов для вывода
	
	int $0x80		# вызов обработчика программных
                    # прерываний по системным вызовам#
.endm
