/*
 * Программа ввода кодов цифровых символов в буфер и вывода сообщений в стандартный вывод.
 */

.include "my-macro"

.bss
    .lcomm buf, 100 # буфер для хранения прочитанных символов. Размер - 100 байт
    .lcomm c, 1	# буфер для чтения текущего символа. Размер - 1 байт
	
.text
.global _start

_start:
    sub	%esi, %esi     # указатель адреса байта в буфере символов (индексный регистр)  
    
show_prompt:
    Puts "Вводите цифру, друг мой!" 	# макровызов вывода строки на стандартный
					# вывод (подсказка ввода)

kbd_input:
    Getchar $c          # макровызов ввода символа со стандартного ввода
    
    cmpl $0, %eax 	# Конец файл - EOF (введено 0 символов) ? 
    je stop		# Да - на завершение программы
    
    cmpb $'\n', c 	# это символ перевода строки ?
    je kbd_input 	# НЕТ - на ввод следующего символа
    cmpb $'9', c  	# код больше кода символа '9' ?
    ja print_err_msg	# ДА - на вывод сообщения об ошибке
    cmpb $'0', c	# код меньше кода символа '0' ?
    jb print_err_msg	# ДА - на вывод сообщения об ошибке

    movb c, %al         # код из с пишем в al
    movb %al, buf(%esi) # Загрузить содержимое al (введенный символ) в байт по
			# адресу buf + esi (буфер для вводимых символов)
    incl %esi		# указать на следующий адрес буфера для следующего символа

    Puts "Цифра! Хорошо." # вывод сообщения об успешном вводе
    
    jmp show_prompt	# на ввод следующего символа

print_err_msg:
    Puts "Не цифровая клавиша. Повторите ввод"	# вывод сообщения об ошибке
    jmp show_prompt 	# на ввод следующего символа

stop:
    Exit $0
    
.end
