Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
27
Добавлен:
20.06.2014
Размер:
1.08 Mб
Скачать

Ввод исходных данных с клавиатуры и вывод результатов на дисплей

В следующем примере исходные данные вводятся с клавиатуры в двоичном формате. Программа реагирует только на ввод нулей и единичек, а также клавишу Esc для выхода из программы. Ввод заканчивается, когда вводится последний шестнадцатый бит числа. Переопределение обработчика прерывания клавиатуры не требуется. Программа сама читает и проверяет скан-код. Для определения факта отжатия клавиши используется сравнение с предыдущим скан-кодом. Стандартный обработчик работает параллельно с программой и ей не мешает.

Для вывода данных на дисплей используются свойства режима 3 работы видеоадаптера, который устанавливается BIOS. Это стандартный текстовый режим 80*25 символов, 16 цветов. Символу, выводящемуся в левом верхнем углу экрана соответствует слово в видеопамяти с физическим адресом 0B8000h.

Физический адрес в реальном режиме является 20-разрядным. Он получается из логического очень простым способом — первая часть адреса, значение сегментного регистра, сдвигается влево на одну 16-ричную цифру с заполнением младшего разряда нулем, что соответствует умножению на шестнадцать, и к получившемуся числу прибавляется смещение. Видно, что один физический адрес могут давать разные логические адреса. Например, физический адрес 0B8000h соответствует следующим логическим адресам:

  • B800:0000;

  • B000:8000 и др.

Формат слова в видеопамяти в режиме 3 таков: старший байт — байт атрибутов, младший байт — ASCII-код символа, который будет выведен на экране.

Формат байта атрибутов:

Бит 7

Бит 6

Бит 5

Бит 4

Бит 3

Бит 2

Бит 1

Бит 0

Цвет фона

Цвет символа

Мерцание

R

G

B

Яркость

R

G

B

;InKoutD.asm

;ввод исходного числа с клавиатуры и вывод результата на дисплей

;сегмент данных

data segment

m dw 0F0Fh ;маска

x dw (?) ;место размещения введенного числа

y dw (?) ;результат: y = x and m

data ends

;сегмент команд

code segment

assume cs:code, ds:data

main: mov dx, data ;в DX база сегмента данных

mov ds, dx ;инициализация регистра сегмента данных

;инициализация указателей видеопамяти и приемника вводимого числа

mov dx, 0B800h ;база видеопамяти

mov es, dx ;дополнительный сегмент - видеопамять

xor di, di ;смещение в видеопамяти - левая верхняя позиция

xor dx, dx ;в DX будет формироваться вводимое число

;очистка экрана

;07 - серый символ на черном фоне, 20 - ASCII-код пробела

mov ax, 0720h

mov cx, 80*25 ;размер видеопамяти текстового экрана в словах

rep stosw ;цикл заполнения пробелом одного экрана

;инициализация регистров для ввода числа

xor di, di ;снова на начало видеопамяти

mov cx, 10h ;счетчик битов вводимого числа

;цикл ввода

inloop: in al, 60h ;ввод скан-кода клавиши

cmp al, bl ;сравнение с предыдущим скан-кодом,

;если не равно, то клавиша отжата

je inloop ;цикл повторяется, пока клавиша не будет отжата

mov bl, al ;скан-код в BL для последующего сравнения

cmp al, 01h ;скан-код клавиши Esc

jne NotEsc

jmp quit

NotEsc: cmp al, 02h ;скан-код клавиши 1

je num1

cmp al, 0Bh ;скан-код клавиши 0

jne inloop

shl dx, 1 ;в очередной разряд числа записан введенный 0

mov es:[di], 0730h ;и выведен на экран в качестве эха

jmp NxtNum ;переход к вводу следующей цифры

num1: shl dx, 1 ;если введена 1

or dx, 1 ;то она записана в очередной разряд

mov es:[di], 0731h ;и выведена на экран в качестве эха

NxtNum: inc di

Соседние файлы в папке Задания к лабораторным