Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler (Уч_пос_Лаб_Ч1).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.43 Mб
Скачать

8.4. Контрольные вопросы

  1. Краткая характеристика возможностей, предоставляемых программисту базовой системой ввода-вывода BIOS, в сравнении с сервисными функциями DOS.

  2. Назовите объём видеопамяти для изображения одного символа и, соответственно, одной видеостраницы монитора в текстовом режиме.

  3. Дайте характеристику атрибута символа в видеобуфере.

  4. Разработайте макросы для:

  • очистки экрана с установкой курсора в левый верхний угол экрана;

  • позиционирования курсора в произвольную точку экрана с запоминанием его координат в памяти с помощью переменных row и clm;

  • вывода сообщения mes длиною leng и атрибутом цвета attrib с позиции, определяемой переменными row и clm.

  1. Какая функция BIOS предоставляет пользователю исчерпывающую информацию о нажатой клавише клавиатуры.

Приложения к работе № 3 Примеры реализаций типовых заданий п.3.1. Листинг 3.4. Программа получения скан-кодов клавиш клавиатуры

Программа выводит на экран в виде четырёх 16-теричных чисел скан-код и ASCII-кода произвольной клавиши клавиатуры на основе использования функции BIOS 10h, Int 16h (101/102-key).

Вызов: AH = 10h, Int 21h.

Возврат: AL = ASCII-код символа, изображённый на клавише/Код признака расширения (00h/0Ah/0Dh или E0h);

AH = скан-код/расширенный ASCII-код клавиши.

При выводе на экран старшая пара цифр отделяется от младшей пробелом и сопровождается сообщением "Скан-код (расширенный ASCII-код)/ASCII-код (00h/0Ah/0Dh или E0h)".

Ideal

Model small

Stack 256

macro out_str mes

mov ah,09h

lea dx,[mes]

int 21h

Endm out_str

Dataseg

table_hex db '0123456789ABCDEF'

buf_hex db 5 DUP(?)

mes1 db 10,13,'Скан-код (расш. ASCII-код)/ASCII-код (00h/0Ah/0Dh или E0h): $'

Codeseg

Start: mov ax,@data ;Установка в ds адреса

mov ds,ax ;сегмента данных

again: mov ah,10h

int 16h ;АХ<- информ-код клавиши после её нажатия

cmp al,1Bh ;Нажата клавиша <Exc>?

je Exit ;Да, выходим из программы

mov dx,ax ;Нет, продолжаем работу. Сохраним АХ

mov al,dh ;Возьмём старший байт информ-кода для преобразования.

call conv_hex ;Процедура преобразования двоичного кода из AL

;в пару 16-теричных ASCII- цифр в регистре АХ

mov [word buf_hex],ax ;Запомним старшую пару ASCII- чисел в младших

;байтах буфера. При этом в AH должна располагаться младшая цифра. Это связано с особен-

;ностью записи информации из регистра в буфер памяти – старшая часть регистра записыва-

;ется по старшему адресу.

mov [byte buf_hex+2],' ' ;Запись пробела

mov al,dl ;Возьмём младший байт информ-кода для преобразования.

call conv_hex

mov [word buf_hex+3],ax ;Запомним младшую пару ASCII- чисел в старших

;байтах буфера

out_str mes1 ;Вывод сообщения mes1

;Вывод информационного кода

mov ah,40h

mov bx,1

mov cx,5

lea dx,[buf_hex]

int 21h

jmp again ;Обработка следующей клавиши

Exit: mov ax,4C00h ;Функция DOS 4Сh: выход из программы

int 21h ;Вызов DOS. Останов

Proc conv_hex

;Процедура преобразования двоичного кода из регистра AL в пару 16-теричных ASCII-цифр

;в регистре АХ на основе использования команды XLAT

push dx ;Сохраним DX

mov bx,offset table_hex

mov ah,0

mov cl,4

shl ax,cl ;AH <- старшая двоичная тетрада

shr al,cl ;AL <- младшая двоичная тетрада

xlatb ;AL <- младшая 16-теричная ASCII- цифра

mov dh,al ;Сохраним в старшей части DX

mov al,ah

xlatb ;AL <- старшая 16-теричная ASCII- цифра

mov dl,al ;Сохраним

mov ax,dx

pop dx ;Восстановим DX

ret

Endp conv_hex

END Start ;Конец программы/точка входа

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]