Я рекомендую обязательно смотреть документацию, чтобы четко понимать какие регистры используют входные данные, и куда помещается результат.
push и pop в данном случае используются чтобы сохранить значения регистров, а затем восстановить их. Однако вызываемые функции НЕ ИСПОЛЬЗУЮТ эти регистры. И сохранение/восстановление не имеет никакого смысла.
int 10
0eH писать символ на активную видео страницу (эмуляция телетайпа)
вход: AL = записываемый символ (использует существующий атрибут)
BL = цвет переднего плана (для графических режимов)
display_letter:
mov ah, 0x0E ; код функции которая выводит букву на экран
mov bx, 0x000F ; 00 - нулевая страница; BL - цвет буквы
int 0x10 ; обращаемся к BIOS, чтобы она нарисовала букву
int 16
00H читать (ожидать) следующую нажатую клавишу
выход: AL = ASCII символ (если AL=0, AH содержит расширенный код ASCII )
AH = сканкод или расширенный код ASCII
read_keyboard:
mov ah, 0x00 ; код функции считывающей символ с клавиатуры
int 0x16 ; обращаемся к BIOS чтобы выполнить ее