Составить программу ввода символов с клавиатуры - Assembler
Формулировка задачи:
Составить программу ввода символов с клавиатуры. Вывести полученные символы на дисплей в режиме мигания с периодом 1 секунда в заданную позицию, вводимую с клавиатуры. Прерывание программы по нажатию клавиш Left –Shift.
Решение задачи: «Составить программу ввода символов с клавиатуры»
textual
Листинг программы
TITLE PROGNAME (EXE) ; вызов программы
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKSG ENDS
DATASG SEGMENT PARA 'Data'
BMAX DB 3
BSize DB ?
BContent: ;
MESPOS DB 'Введите номер строки:','$'
MESPOS2 DB 'Введите номер столбца:','$'
err_msg DB "Ошибка ввода"
POSX DB 0 ;Номер столбца ввода
POSY DB 0 ;Номер строки ввода
EN DB 'Введите строку*: ','$'
STROKA DB 20 DUP ('$') ;мигающая строка
Timer DW 1000
DATASG ENDS
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
ASSUME CS:CODESG, DS:DATASG, SS:STACKSG
PUSH DS
XOR AX,AX ; запись в стек
PUSH AX ; нулевого адреса
MOV AX,DATASG ; засылка адреса
MOV DS,AX ; DATASG в регистр DS
;Очистка экрана
MOV AX,0600H
MOV BH,07
MOV CX,0000
MOV DX,184FH
INT 10H
;Установка курсора в левый верхний угол
MOV AH,02
MOV BH,00
MOV DH,00
MOV DL,00
INT 10H
;Вывод приглашения номер строки
MOV AH,09
LEA DX,MESPOS
INT 21H
;Ввод позиции: номера строки
CALL VVODPOS
MOV POSY,AL
mov AX,0600H ;Очистка экрана
MOV BH,07
MOV CX,0000
MOV DX,184FH
INT 10H
; Вывод приглашения номер столбца
MOV AH,09
MOV AL,00
LEA DX,MESPOS2
INT 21H
;Ввод позиции: номера столбца
CALL VVODPOS
MOV POSX,AL
mov AX,0600H ;Очистка экрана
MOV BH,07
MOV CX,0000
MOV DX,184FH
INT 10H
; вывод "Введите строку: "
MOV AH,09
LEA DX,EN
INT 21H
;Ввод строки
MOV AH,3FH
MOV BX,00
MOV CX,20
LEA DX,STROKA
INT 21H
;Очистка экрана
mov AX,0600H
MOV BH,07
MOV CX,0000
MOV DX,184FH
INT 10H
;Установка позиции исходя из введенных данных
LoopVivod:
MOV AH,02
MOV BH,00
MOV DH,POSY
MOV DL,POSX
INT 10H
;Вывод мигающей строки
MOV AH,09
LEA DX,STROKA
MOV BL,0F0H
INT 21H
.386
xor al,al ; Аl - байт состояния клавиатуры 1
mov ah,02h ;Проверка состояния клавиатуры перед
int 16h ;Задержкой очистки
bt ax,3 ;проверка 1-го бита
JNZ ExitB ;Выход по нажатию клавиши Left Shift
.8086
mov CL,10 ; пауза на 1 секунду
mov DX,Timer
mov ah,86h
int 15h
mov AX,0600H ;Очистка экрана
MOV BH,07
MOV CX,0000
MOV DX,184FH
INT 10H
mov CL,10 ; пауза на 1 секунду
mov DX,Timer
mov ah,86h
int 15h ; задержка
xor al,al ; Аl = 0
mov ah,02h ;Проверка состояния клавиатуры перед
int 16h ;Выводом строки
cmp al,02h ;проверка 1-го бита
JZ ExitB ;Выход по нажатию клавиши Left Shift
;Зацикливание, если не нажата Left Shift
jmp LoopVivod
ExitB: RET ; завершение программы
BEGIN ENDP
VVODPOS PROC NEAR
;Процедура буферизированного ввода с переводам в десятичное число,
;которое будет храниться в регистре АХ
mov dx,offset BMAX
mov ah,0Ah
int 21h ; считать строку символов в буфер
; перевод числа в ASCII-формате из буфера в бинарное число в АХ
xor di,di ; DI = 0 - номер байта в буфере
XOR AX,AX ; АХ = 0 - текущее значение результата
mov cl,BSIZE
xor ch,ch
xor bx,bx
mov si,cx ; SI - длина буфера
mov cl,10 ; CL = 10, множитель для MUL
asc2hex:
mov bl,byte ptr BCONTENT[di]
sub bl,'0' ; цифра = код цифры - код символа "0",
jb asc_error ; если код символа был меньше, чем код "0",
cmp bl,9 ; или больше, чем "9",
ja asc_error ; значит неправильно ввели, обнуляем позицию
mul cx ; иначе: умножить текущий результат на 10,
add ax,bx ; добавить к нему новую цифру,
inc di ; увеличить счетчик
cmp di,si ; если счетчик+1 меньше числа символов -
jb asc2hex ; продолжить (счетчик считается от 0)
RET ; возврат из подпрограммы
asc_error:
xor ax,ax ; обнулить позицию
ret ; Возврат
VVODPOS ENDP
CODESG ENDS
END BEGIN
Объяснение кода листинга программы
- Программа начинается с вывода приглашения
Введите номер строки:$иВведите номер столбца:$. - Пользователю предлагается ввести номер строки и номер столбца.
- Если введенные данные некорректны (например, введено число больше 20), программа выведет сообщение об ошибке и запросит повторный ввод.
- После корректного ввода, программа выводит приглашение
Введите строку:$`. - Пользователю предлагается ввести строку.
- Введенная строка выводится на экран.
- Если введенная строка некорректна (например, содержит недопустимые символы), программа выведет сообщение об ошибке и запросит повторный ввод.
- После корректного ввода, программа выводит приглашение
Введите строку:$`. - Пользователю предлагается ввести строку.
- Программа завершается после ввода строки.