
- •Программирование эвм
- •Int 21h ;кодом возврата 0 прерывания 21h
- •Работа с битами
- •Порядок выполнения работы
- •Устройства ввода-вывода
- •Ввод исходных данных с клавиатуры и вывод результатов на дисплей
- •Inc di ;смещение в видеопамяти на следующий символ
- •Порядок выполнения работы
- •Контрольные задания
- •Система команд процессора
- •Способы адресации
- •Влияние команд на регистр флагов
- •Расширенные регистры и типы данных процессоров x86
- •Система команд процессоров ia-32 и Intel 64
- •Int 21h ;системного прерывания 21h
- •Использование дальней подпрограммы
- •X dw 0aabBh, 0abbAh, 0baaBh, 0bbaAh ;исходные данные
- •Использование подпрограмм для ввода-вывода
- •Порядок выполнения работы
- •Контрольные задания
- •Дескрипторы
- •Порядок работы процессора в защищенном режиме
- •Использование дальней подпрограммы в защищенном режиме
- •Использование idt. Ввод данных с клавиатуры в защищенном режиме
- •Порядок выполнения работы
Ввод исходных данных с клавиатуры и вывод результатов на дисплей
В следующем примере исходные данные вводятся с клавиатуры в двоичном формате. Программа реагирует только на ввод нулей и единичек, а также клавишу 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