![]()
|
||||||||||||||||||||||
Ввод строки с клавиатуры (ф-я 0Ah)Ввод строки с клавиатуры (ф-я 0Ah)
На входе
AH <- 0Ah DS:DX <- адрес входного буфера
Буфер оформляется следующим образом:
На выходе получаем:
Вводимые с клавиатуры (со стандартного ввода) символы помещаются в буфер. Признаком конца ввода является либо возврат каретки (CR код ASCII 0Dh) или до достижения max-1. Если количество вводимых символов достигает до max-1, то символы перестают вводиться и должен включаться консольный звонок при каждом нажатии (в DOSBox нет звонка). Таким образом функция оставляет место в буфере как минимум для символа CR. Если мы обращаемся к функции с буфером, Где max =0, ввода символов не происходит, ф-я не выполняется, т.е. мы сразу выходим из функции.
;+-------------------------------------------------------------------------- code_seg segment ASSUME CS:CODE_SEG,DS:code_seg,ES:code_seg org 100h ; CR EQU 13 LF EQU 10 Space EQU 20h ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ print_letter macro letter push AX push DX mov DL, letter mov AH, 02 int 21h pop DX pop AX endm ;===================================================== start: mov SI, offset _str mov AH, 02 mov CX,16 _cycle1: ; Вывод содержимого буфера до выполнения ф-ии 0Ah mov BL, byte ptr [SI] mov DL, BL rcr DL, 4 call print_hex mov DL, BL call print_hex print_letter Space inc SI loop _cycle1 print_letter CR print_letter LF ;===================================================== mov AH, 0Ah mov DX, offset _str int 21h ; print_letter CR print_letter LF ;===================================================== mov SI, offset _str mov AH, 02 mov CX,16 _cycle: mov BL, byte ptr [SI] mov DL, BL rcr DL, 4 call print_hex mov DL, BL call print_hex print_letter Space inc SI loop _cycle ;===================================================== int 20h ; print_hex proc near and DL,0Fh add DL,30h cmp DL,3Ah jl $print add DL,07h $print: int 21H ret print_hex endp ; _str DB 14,0,14 dup (Space) code_seg ends end start
|
||||||||||||||||||||||
|