/* 
 * Макроопределение завершения работы.
 * Аргументы:
 * 	- код завершения программы
 *
 * После выполнения макровызова изменяются регистры: %eax, %ebx
 * См. также 'man 2 exit'
*/
.macro Exit ret_val
	movl $1, %eax 		# номер сист. вызова exit
	movl \ret_val, %ebx 	# код выхода
	int $0x80 		# выполнить системный вызов
.endm


/*
 * Мароопределение для процедуры считывания одного символа из стандартного ввода
 * Аргументы:
 * 	- адрес буффера для считывания символа
 * Результат:
 *	- в %eax количество считанных символов
 *	- по адресу buf_addr - считанный символ
 * 
 * После выполнения макровызова изменяются регистры: %eax, %ebx, %ecx, %edx
 * См. также 'man 2 read'
*/
.macro Getchar buf_addr
	movl $3, %eax		# номер сист. вызова read
	movl $0, %ebx		# параметр 1: дескриптор стандартного ввода
	movl \buf_addr, %ecx	# параметр 2: адрес буфера (он же - фактический 
	     			# параметр макровызова)
	movl $1, %edx		# параметр 3: количество байтов для чтения
	int $0x80		# выполнить системный вызов
.endm

/*
 * Мароопределение для процедуры вывода строки в стандартный вывод
 * Аргументы:
 * 	- Строка для вывода.
 *
 * Приметр макровызова:
 *	Puts "Текст выводимой строки" 
 *
 * Результат:
 *	- выводит в стандартный вывод символы заданной строки,
 *	  а также символ перевода строки
 *	
 * После выполнения макровызова изменяются регистры: %eax, %ebx, %ecx, %edx
 * См. также 'man puts', 'man 2 write'
*/
.macro Puts string
.data
    str\@: 	.ascii "\string\n"  # формирование фактической строки для вывода
	
    strlen\@ = 	. - str\@           # получение значения длины строки

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


.macro Finish
                movl $0, %ebx # first argument: exit code
                movl $1, %eax # sys_exit index
                int $0x80 # kernel interrupt
.endm

