2. Въвеждане от клавиатурата. Извеждане на екрана. Прекъсвания




Име2. Въвеждане от клавиатурата. Извеждане на екрана. Прекъсвания
Дата на преобразуване16.12.2012
Размер126.01 Kb.
ТипДокументация
източникhttp://kn5.eu/2/karh/praktikum/TasmNew/karh/Th2.doc

Тема 2. Въвеждане от клавиатурата. Извеждане на екрана. Прекъсвания.


При натискане на клавиш процесорът на клавиатурата (Intel 8042) изпраща 2 байта код в порт A (адрес 60h) на контролера на програмируемия интерфейс (PPI, Intel 8255).

Контролерът PPI изпраща на централния процесор (CPU) сигнал 9-то прекъсване (INT 09). По този сигнал в CS:IP се записва деветия вектор от Таблицата с вектори – 4 байта с адрес на процедурата, обработваща това прекъсване. Тя може да бъде адрес на стандартна процедура на BIOS-а, записана в ROM или адрес на резидентна програма – драйвер на клавиатурата, зареден в RAM.

R A M

CS


IP


…….


AX


Таблица с векторите на Прекъсвания

Байт статус

0:0417


Буфер на

клавиатурата
0:0000

адрес





P P I
Int 09

адрес 0:0400





0:041A

Скан-код


ББ Б У

разширен

код (2 байта)


Буфер на клавиатурата 0:041A - 0:043D

Въвеждането на цифри и малки (долен регистър) латински букви поражда скан-код, съвпадащ с поредния НОМЕР на клавиша. Клавишите се номерират подред, започвайки от цифровите.

Нека въведем от клавиатурата думата "BUFFER" с главни букви (заедно с клавиша Shift), a после отново командата –D:

-BUFFER

^ Error

-d 0:41a

410 34 00 34 00 45 12 4.4.E.

420 52 13 0D 1C 64 20 20 39 30 0B 3A 27 34 05 31 02 R...d 90.:'4.1.

430 61 1E 0D 1C 0D 1C 42 30 55 16 46 21 46 21 00 00 a.....B0U.F!F!..


Разширените кодове при въвеждането на "BUFFER", започвайки от 0:0434


Адрес

Байтове

ASCII код

Символ

Скан-код

0:0434

0D 1C

0Dh=13

Enter

1Ch=28

0:0436

42 30

42h=66

‘B’

30h=48

0:0438

55 16

55h=85

‘U’

16h=22

0:043A

46 21

46h=70

‘F’

21h=33

0:043C

46 21

46h=70

‘F’

21h=33

0:041E

45 12

45h=69

‘E’

12h=18

0:0420

53 13

53h=83

‘R’

13h=10

0:0422

0D 1C

0Dh=13

Enter

1Ch=28



Продължението при въвеждане след клетките 0:043C - 0:043D се записва в клетките 0:041E - 0:041F и по-нататък (в кръг).


Прекъсване 16h

Съществува още един начин за изследване на разширените кодове- това е прекъсването 16h. Когато програмата очаква въвеждане от клавиатурата, тя изпраща това прекъсване, записвайки 00 в регистър AH (номера на функцията на това прекъсване). След въвеждането на един символ (без натискане на Enter) неговият разширен код се записва в регистър AX (AH - скан-кода, AL - ASCII кода) и може да бъде прочетено директно от там.


Нека стартираме DEBUG и да въведем следната програма:

-a

0DA0:0100 MOV AH,00

0DA0:0102 INT 16

0DA0:0104 JMP100

0DA0:0109 NOP

0DA0:010A


-u 100,109

0DA0:0100 B400 MOV AH,00

0DA0:0102 CD16 INT 16

0DA0:0104 EBFA JMP 0100

0DA0:0106 90 NOP

Тази процедура реализира посимволно въвеждане от клавиатурата без натискане на клавиша и без изобразяване на въвеждания символ на екрана (режим No Echo).

Нека да я изпълнем до командата JMP. Ще въведем командата "G 104" и натиснем . В началото на следващият ред промптът НЯМА ДА СЕ ПОЯВИ. Програмата чака въвеждането на един символ. Нека натиснем клавиша < a > (Без Enter).

-g 104

след което на екрана се извежда съдържимото на регистрите: AX=1Е61


Извеждане на екрана

Микросхемата Motorola 6845 (контролерът на електронно-лъчевата тръба, Cathod Ray Tube Controller, CRTC) постоянно СКАНИРА участък от RAM върху платката на видеоадаптера (ВИДЕОПАМЕТТА) и изобразява информацията на ЕКРАНА. Информацията във видеопаметта се записва от MS-DOS или от потребителска програма.

R A M

MS-DOS


Потреби-телска програма


Видео RAM

A000:0000





CRTC 6845
B000:0000

B000:8000






Е К Р А Н










Например, прочитайки разширения код на символите от буфера на клавиатурата, програмата отхвърля старшия байт на скан-кода, формира нов двубайтов код (ASCII код + атрибут) и го изпраща във видеопаметта. По такъв начин, въвеждайки символи от клавиатурата, ние ги виждаме на едно или друго място на екрана в съответен цвят (режим Echo).

В ТЕКСТОВ режим във видеопаметта с два байта се кодира всяко ЗНАКОМЯСТО на екрана. В различните режими броят на редовете на екрана и броят на знакоместата в реда е различен.

Режим 0 40 х 25 знакоместа Монохромно изображение B&W

1 40 х 25 16 цвята

2 80 х 25 B&W

3 80 х 25 16 цвята

Стандартният текстов режим за адаптерите EGA/VGA е третия.

Двата байта на кода във видеопаметта представляват байт с ASCII кода на изобразявания символ (младшия байт) и БАЙТ НА АТРИБУТА. Байтът на атрибута със свой бит кодира яркостта (I) и цвета на символа и фон на основните тонове:


I - Intensity - яркост G - Green - зелен

B - Blue - син R - Red - червен





Фон

Символ

*

r

g

b

I

R

G

B


Старшият (седмия) бит на атрибута означава ТРЕПКАНЕ НА СИМВОЛА. Обаче, чрез директно обръщение към портовете на микросхемата CRTC, може да се установи режим, при който този бит ще означава яркост на фона (16 цвята за символи + 16 цвята за фон).

По този начин, старшата 16-чна цифра на байта на атрибута означава ЦВЯТ НА ФОНА (+ трепкане), младшата цифра – ЦВЯТ НА СИМВОЛИТЕ.


RGB



Color

Цвят

RGB



Color

Цвят

0000

0

Black

Черен

1000

8

Dark gray

Тъмно сив

0001

1

Blue

Син

1001

9

Light blue

Св.св.син

0010

2

Green

Зелен

1010

A

Light green

Св.зелен

0011

3

Cyan

Тъмно син

1011

B

Light cyan

Св.син

0100

4

Red

Червен

1100

C

Light red

Св.червен

0101

5

Magenta

Лилав

1101

D

Light magenta

Розов

0110

6

Brown

Кафяв

1110

E

Yellow

Жълт

0111

7

Gray

Сив

1111

F

White

Бял

Атрибутът 74h означава - червено (4) на сив фон (7)

74h + 80h = F4h - трепкане на червен символ на сив фон.

Положението на символа на екрана се определя с отместването на съответстващите два байта на кода относно началото на видеопаметта.

В текстов режим видеопаметта започва от адрес B800:0000 (или B000:8000) 80 знакоместа за всеки ред се кодират с по 160 байта, затова за символ в ред R и стълб C отместването от началото на видеопаметта може да се изчисли по формулата:

Offset = (R - 1)*160 + (C-1)*2

Така за 5-ти ред и 10-ти стълб получаваме отместване 292h.

Offset = (5-1)*160+(10-1)*2 = 658 = 292h.

На адрес B800:Offset първо следва да се запише байта на ASCII-кода (младшия байт), а после в следващата клетка байта на атрибута.

Пример: Стартирайте DEBUG и въведете командите:

-E B800:0292 41 1E 42 87

-E B800:0 20 71 'D' 74 'e' 71 'b' 71 'u' 71 'g' 71 20 71

Видео-сървис Int 10h

Извеждането на символи на екрана в програмата може да се реализира по различен начин:

- с директно обръщение към видеопаметта (както беше описано по-горе);

- използвайки системата на ПРЕКЪСВАНИЯТА;

- с помощта на функциите и операторите на езика за програмиране от високо ниво.

Обаче в машинните кодове на същите тези функции и оператори се съдържат обръщения към прекъсванията на MS-DOS и BIOS. Основно прекъсване, осигуряващо широк видео-сървис, представлява прекъсването на BIOS int 10h. Това прекъсване изпълнява множество ФУНКЦИИ – установяване на режима на екрана, установяване на курсора и номера на видимата страница, извеждане на символи с различни цветове и много друго. Преди извикване на int 10h от програмата НОМЕРЪТ НА ФУНКЦИЯТА е необходимо да се зареди в регистър AH, а в останалите регистри - данни за извеждане (в строго определен ред).

Ще разгледаме някои функции.

УСТАНОВЯВАНЕ НА РЕЖИМА. Функция 0.

Номерът на функцията 0 е необходимо да се зададе в AH.

Стартираме дебъгера и въвеждаме програма, установяваща режим 1 (40 х 25 знакоместа):

-A

xxxx:0100 MOV AH,0

xxxx:0102 MOV AL,1

xxxx:0104 INT 10

xxxx:0106 NOP

Изпълняваме програмата, въвеждайки командата: -G 106


УСТАНОВЯВАНЕ НА КУРСОРА (позициониране) Функция 02

ИЗВЕЖДАНЕ НА СИМВОЛ С ПОВТОРЕНИЕ Функция 09




За установяване на курсора

задаваме в регистрите:


AH - Номер на функцията (02)

BH - Номер на страницата

(не е задължително)

DH - Номер на реда на екрана

DL - Номер на стълба


За извеждане на символ с атрибут


AH - Номер на функцията (09)

AL – ASCII код

BL - Атрибут

CX – Брой на повторенията

(1 за един символ)



ИЗВЕЖДАНЕ НА РЕД ОТ СИМВОЛИ С АТРИБУТИ. Функция 13h.

Тази функция предава 2-байтови кодове от областта с данни на програмата във видеопаметта. Тя има 4 подфункции (режима), които е необходимо да се зададат в AL. Ще използваме режим 3 (извеждане в цвят).

Зареждане на регистрите преди извикване на прекъсването:

AH - номер на функцията (13h или в AX 1303h)

AL - номер на подфункцията (3)

BH - номер на видеостраницата (0)

BP – отместване за данните (Данните се четат от адрес ES:BP)

CX – броя на извежданите символи (2-байтови кодове)

DH - номер на реда на екрана

DL - номер на стълба на екрана (Или в DX 2 байта)


Ще напишем програмата. Данните ще разположим в началото на програмата.

-A

xx:100 JMP 115

xx:102 NOP

xx:103 DB 20, 71, 'E', F4, 's', 71, 'c', 71, 'a', 71

xx:10D DB 'p', 71, 'e', 71, '!', 74, 20, 71



xx:0115 MOV AX,0003 Първо очистваме екрана с преустановяване на

xx:0118 INT 10 режима 3 (функция 0)

xx:011A NOP


xx:011B MOV AX,1303 Изпълняваме прекъсването, което чете от

xx:011E LEA BP,[103] областта с данни 9 думи (18 байта) и

xx:0122 MOV CX,9 извежда 9 символа на екрана от 10-ия

xx:0125 MOV DX,0A23 (0Ah) ред и 35-ия (23h) стълб

xx:0128 INT 10

xx:012A NOP




xx:012B MOV AH,0

xx:012D INT 16 Извикваме int 16h, очакващо въвеждане от

xx:012F CMP AL,1B клавиатурата. Програмата приключва изпълнението си,

xx:0131 JNE 12B когато получи ASCII кода 27 (1Bh) - клавиш

xx:0133 RET

xx:0134 NOP (CMP – да се сравнят, JNE – ако не е равно)

xx:0135


Ако изпълним тази програма до командата RET (–G 133), на очистения екран се появява прочетената от паметта дума “Escape!”. За повторно стартиране на програмата е необходимо възстановяването на регистър IP=100 и отново въвеждане на командата –G 133.

За да запишем програмата на диска изпълняваме командите:

-N int10.com (именуване)

-R CX

CX 0133

: 35 (задаваме дължината на програмата в байтове е 134h+1h-100h)

-W (запис)

Функциите 09 и 0A не интерпретират никакви управляващи кодове и не преместват курсора при извеждане. Функцията 0E интерпретира следните управляващи кодове:

ASCII 07h Bell (звънец)

ASCII 08h BS, Back Space (възврат на една стъпка)

ASCII 0Ah LF, Line Feed (преход на нов ред)

ASCII 0Dh CR, Carriage Return (възврат на каретката)


Функциите 09, 0A и 13h изискват задаване в CX или брой повторения на един и същи символ (09 и 0A), или дължината на извеждания стринг, което често пъти е неудобно при извеждане на редове с различна дължина.


Най-удобна за извеждане на прости съобщения от програмата е функцията 0Eh: писане на символ в активната видео-страница (емулация на телетайп).

А
AH = 0Eh

AL = записвания символ

BL = цвят за предния план

(при графичните режими)


дресираме извеждания ред

с индексния регистър SI и ще

запишем символ от реда в AL


LEA SI,string

MOV AL, [SI]

Отмествайки указателя SI в цикъл можем посимволно да изведем на екрана стринга. За целта е необходимо или да се зададе броя на извежданите символи в регистъра CX (за цикъла LOOP), или да се определи някакъв символ в качеството на признак за край на стринга.


Функции на MS-DOS за работа с конзолата

Най-често използваното прекъсване за работа с конзолата е системното прекъсване INT 21H. То заема междинно положение между програмите на потребителя и средствата на BIOS. Функция 01H – четене с ехо на символ от клавиатурата.

Функция 02H – извеждане на символ на екрана.

Функция 09h – извеждане на ред от символи на екрана (изисква в края на реда символ '$', а другите функции използват нулев байт).




Свързани:

2. Въвеждане от клавиатурата. Извеждане на екрана. Прекъсвания iconЗадача триъгълници
Програмата трябва да прочете числата n и m от клавиатурата (стандартния вход), а да изведе резултата на екрана (стандартния изход),...
2. Въвеждане от клавиатурата. Извеждане на екрана. Прекъсвания iconТема за 4-6 клас (група d)
Задачата Ви е да напишете програма three. Exe, която въвежда от клавиатурата числото n и някакъв друг знак и след това извежда на...
2. Въвеждане от клавиатурата. Извеждане на екрана. Прекъсвания iconТема за 4
Задача Да се въведат от клавиатурата числата m и n и да се изведат на екрана един до друг n квадрата, всеки със страна от m звездички....
2. Въвеждане от клавиатурата. Извеждане на екрана. Прекъсвания iconМетоди и средства за въвеждане и извеждане на визуални изображения' и 'Технология на електронния бизнес'

2. Въвеждане от клавиатурата. Извеждане на екрана. Прекъсвания iconЗадача 1: Боя
Известно е, че с една кутия боя могат да се боядисат m квадратни единици площ от стената. Напишете програма boja. Cpp, която прочита...
2. Въвеждане от клавиатурата. Извеждане на екрана. Прекъсвания iconТема за група
Да предположим, че един часовник показва 12 часа. Да се направи програма clock. Exe, която въвежда от клавиатурата естествено число...
2. Въвеждане от клавиатурата. Извеждане на екрана. Прекъсвания iconЕлектромер ein alpha. Техническо ръководство В. Таблици за екрана
Величините, които се показват на екрана на електромера ain alpha, могат да се групират в три категории
2. Въвеждане от клавиатурата. Извеждане на екрана. Прекъсвания iconНационална олимпиада по информатика’2005 Областен кръг, 13 март 2005 г. Група e (4–5 клас) задача автобусни линии
Напишете програма bus. Exe, която прочита от клавиатурата две цели числа а и в и извежда на екрана всички числа по-големи или равни...
2. Въвеждане от клавиатурата. Извеждане на екрана. Прекъсвания iconОператори за вход / изход. Работа с файлове
При въвеждане и извеждане на данни в езика С++ често се споменава понятието „поток” (stream). Потокът е последователност от байтове,...
2. Въвеждане от клавиатурата. Извеждане на екрана. Прекъсвания icon1. Контролно табло
Текущата околна температура се посочва на екрана. (3) Натиснете функционалния клавиш на таблото, за да активирате желаната функция,...
Поставете бутон на вашия сайт:
Документация


Базата данни е защитена от авторски права ©bgconv.com 2012
прилага по отношение на администрацията
Документация
Дом