Нацiональний унiверситет “Львiвська Полiтехнiка”
Кафедра “Електроннi обчислювальнi машини”
Збiрник лабораторних робiт
з дисциплiни
"Системне програмування"
Укладено:
лектор:
лаб.роб./
пр.зан.:
Львiв - 2000
Лабораторна робота №1.
Операцiйна система MS-DOS: основнi команди, конфiгурацiя середовища, команднi файли.
Мета: оволодiння навичками роботи в середовищi операцiйної системи MS-DOS в режимi командного рядка, виконання базових функцiй управлiння файловою системою та потоками даних, створення командних файлiв.
До складу операцiйної роботи входять такi основнi модулi:
BIOS – базова система вводу-виводу. Знадодиться в ПЗП. Призначена для автоматичного тестування апаратних пристроїв; виклику блоку початкового завантаження (Boot Record) i передачi йому управлiння; обслуговування апаратних переривань.
Boot Record – блок початкового завантаження. Знаходиться на 0-й сторонi 1-го сектора 0-ої (00) дорiжки системного диску i займає 512 байт. Автоматично заноситься на диск при його форматуваннi. Призначена для перевiрки наявностi в перших двох позицiях системного диску основних модулiв ОС (IO.SYS, MSDOS.SYS); завантаження цих файлiв в ПЗП та передачi їм управлiння або виводу на екран повiдомлення в разi їх вiдсутностi.
IO.SYS – модуль розширення базової системи вводу-виводу. Тiсно пов’язаний iз особливостями апаратури i є iнварiантним по вiдношенню до даної моделi ПК. Знаходиться в першiй позицiї каталога системного диску, пiсля завантаження розмiщується в молодших адресах ПЗП. Призначений для настройки переривань та iнших параметрiв ОС у вiдповiдностi iз стандартною конфiгурацiєю ПК; пiдключення драйверiв нестандартних пристроiв i нестандартного командного процесора; запуску модуля обробки переривань (MSDOS.SYS) i завершення завантаження ОС шляхом завантаження командного процесора (COMMAND.COM). При конфiгуруваннi середовища i необхiдностi пiдключення драйверiв додаткових нестандартних зовнiшнiх пристроїв модуль IO.SYS використовує файл CONFIG.SYS.
MSDOS.SYS – модуль обробки переивань ОС (основний модуль ОС). Утворює верхнiй рiвень ОС, з яким взаємодiє бiльшiсть прикладних програм. Знадодиться на другiй позицiї каталога системного диску, пiсля завантаження – в молодших адресах ОЗУ пiсля IO.SYS. Призначений для обробки логiчних та програмних переривань, що забезпечують роботу файлової системи та пристроїв вводу-виводу (клавiатури, дисплея, принтера, тощо); обслуговування прикладних прогрма та обробки помилок.
COMMAND.COM – командний процесор. Знаходиться на системному диску, при завантаженнi роздiляється на двi частини – резидентну (постiйно знаходиться в ОЗУ), яка розмiщується в молодших адресах ОЗУ пiсля MSDOS.SYS, i нерезидентну, яка розмiщується в старших адресах ОЗУ та при виконаннi прикладних програм може бути повнiстю чи частково знищена (з метою економiї пам’ятi). Призначений для прийому та аналiзу команд, введених з клавiатури або отриманих при виконаннi командного файла; виконання вбудованих команд ОС; завантаження i виконання зовнiшнiх команд ОС i прикладних програм; виконання файла автозапуску AUTOEXEC.BAT для початкової настройки ОС при її запуску; завантаження (у випадку знищення) нерезидентної частини командного процесора в ОЗУ його резидентною частиною.
Утилiти DOS – зовнiшнi (транзитнi) програми, що являють собою програми, якi входять до стандартного комплекту ОС у виглядi окремих виконавчих модулiв i виконують сервiснi функцiї.
Ядро MS-DOS складають модулi 2й - 5й iз загальним об’ємом використовуваної пам’ятi приблизно 60 Kb.
Процес завантаження системи: пiсля тестування апаратури (модуль BIOS) i виконання початкового завантаження (модуль Boot Record) в пам’ять послiдовно зчитуються i виконуються модулi IO.SYS, MSDOS.SYS. Пiсля зчитування файлу CONFIG.SYS (конфiгурацiя системи) завантажуються драйвери пристроїв та встановлюються параметри ОС. Якщо CONFIG.SYS вiдсутнiй, параметри встановлюються по замовчуванню. Пiсля цього завантажується та починає працювати командний процесор COMMAND.COM. Якщо в кореневому каталозi присутнiй файл AUTOEXEC.BAT, то вiн запускається на виконання. У випадку вiдсутностi цього файлу ОС запитує користувача про поточну дату та час. Всi файли ОС зчитуються з того накопичувача, з якого було завантажено програму-завантажувач. Пiсля успiшного завершення завантаження системи на екран видається системне запрошення (prompt) для вводу команд – пiсля цього ПК очiкує дiй користувача.
Базовий синтаксис команд MS-DOS:
[disk:][path\] command [parameters] <Enter>
При цьому атрибути, що обмеженi квадратними дужками, є необов’язковими. В командах (якщо це необхiдно) допускається використання шаблонiв iмен файлiв:
“*” - замiняє будь-яку к-ть символiв вiд позицiї вставки до кiнця iменi або розширення файлу;
“?” - замiняє один будь-який символ в позицiї вставки в iменi або розширеннi файлу.
За призначенням команди MS-DOS, як правило, подiляються на такi групи:
Робота з каталогами:
DIR, MKDIR, CHDIR, RMDIR, TREE
DIR [drive:][path][filename] [/P] [/W] [/A[[:]attributes]][/O[[:]sortorder]] [/S] [/B] [/L] [/C]
MKDIR [drive:]path | MD [drive:]path
CHDIR [drive:][path] | CHDIR[..] | CD [drive:][path] | CD[..]
RMDIR [drive:]path | RD [drive:]path
TREE [drive:][path] [/F] [/A]
Дозволяють визначити, якi файли та пiдпорядкованi каталоги входять до складу поточного каталога, створити новий пiдкаталог в заданому або поточному каталозi, знищити пустий каталог, змiнити поточний каталог (перейти до iншого калога), вивести на екран шляхи до всiх каталогiв поточного диску.
Робота з файлами:
TYPE, COPY, XCOPY, RENAME, DEL, PRINT, FASTOPEN, FIND, ATTRIB
TYPE [drive:][path]filename
COPY [/Y|/-Y] [/A|/B] source [/A|/B] [+ source [/A|/B] [+...]][destination [/A|/B]] [/V]
XCOPY source [destination] [/Y|/-Y] [/A|/M] [/D:date] [/P] [/S] [/E] [/V] [/W]
RENAME [drive:][path]filename1 filename2
REN [drive:][path]filename1 filename2
DEL [drive:][path]filename [/P]
ERASE [drive:][path]filename [/P]
PRINT [/D:device] [/B:size] [/U:ticks1] [/M:ticks2] [/S:ticks3] [/Q:qsize] [/T] [[drive:][path]filename[ ...]] [/C] [/P]
FASTOPEN drive:[[=]n] [drive:[[n][...]] [/X]
FC [/A] [/C] [/L] [/LBn] [/N] [/T] [/W] [/nnnn][drive1:][path1]filename1 [drive2:][path2]filename2
FIND [/V] [/C] [/N] [/I] "string" [[drive:][path]filename[...]]
ATTRIB [+R|-R] [+A|-A] [+S|-S] [+H|-H][[drive:][path]filename] [/S]
Дозволяють вивести на екран вмiст будь-якого файлу, скопiювати файл або групу файлiв в iнший каталог, перейменувати файл або групу файлiв iз збереженням його/їх в тому ж каталозi, знищити файл або групу файлiв, роздрукувати вмiст файлу, порiвняти декiлька файлiв за вмiстом, знайти потрiбний файл на лиску або в каталозi, переглянути/змiнити атрибути файлу, та iн.
Команди-фiльтри для роботи з поками даних:
FIND, SORT, MORE
FIND [/V] [/C] [/N] [/I] "string" [[drive:][path]filename[...]]
SORT [/R] [/+n] [<] [drive1:][path1]filename1 [> [drive2:][path2]filename2]
[command |] SORT [/R] [/+n] [> [drive2:][path2]filename2]
MORE < [drive:][path]filename
command-name | MORE
Дозволяють переадресувати потоки даних зi стандартних пристроiв вводу (клавiатури) або виводу (дисплей) на вхiд iнших програм.
Робота з дисками i пам’яттю:
FORMAT, CHKDSK, DISKCOPY, DISKCOMP, VERIFY, SYS, VOL, LABEL, SUBST, MEM
FORMAT drive: [/V[:label]] [/Q] [/U] [/F:size][/B|/S] [/C]
FORMAT drive: [/V[:label]] [/Q] [/U] [/T:tracks /N:sectors] [/B|/S] [/C]
FORMAT drive: [/V[:label]] [/Q] [/U] [/1] [/4] [/B|/S] [/C]
FORMAT drive: [/Q] [/U] [/1] [/4] [/8] [/B|/S] [/C]
CHKDSK [drive:][[path]filename] [/F] [/V]
DISKCOPY [drive1: [drive2:]] [/1] [/V] [/M]
DISKCOMP [drive1: [drive2:]] [/1] [/8]
VERIFY [ON|OFF]
SYS [drive1:][path] drive2:
VOL [drive:]
LABEL [drive:][label]
SUBST [drive1: [drive2:]path]
SUBST drive1: /D
MEM [/CLASSIFY|/DEBUG|/FREE|/MODULE modulename] [/PAGE]
Дозволяють здiйснювати форматування диску, перевiряти правильнiсть структури диску, створювати копiю вмiсту гнучкого диску, перевiряти правильнiсть структури гнучкого диску, запису на диск системних файлiв NS-DOS, присвоєння та перегляду мiтки логiчного диску, змiни логiчного iменi диску, визначення об’єму доступної пам’ятi.
Настройка конфiгурацiї середовища:
DATE, TIME, VER, MODE, BUFFERS, DEVICE, FILES, BREAK, LASTDRIVE, SHELL
DATE [mm-dd-yy]
TIME [hours:[minutes[:seconds[.hundredths]]][A|P]]
VER
MODE LPTn[:] [c][,[l][,r]]
MODE LPTn[:] [COLS=c] [LINES=l] [RETRY=r]
MODE COMm[:] [b[,p[,d[,s[,r]]]]]
MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s] [RETRY=r]
MODE LPTn[:]=COMm[:]
MODE [device] [/STATUS]
MODE device CODEPAGE PREPARE=((yyy [...]) [drive:][path]filename)
MODE device CODEPAGE SELECT=yyy
MODE device CODEPAGE REFRESH
MODE device CODEPAGE [/STATUS]
MODE [display-adapter][,shift[,T]]
MODE [display-adapter][,n]
MODE CON[:] [COLS=c] [LINES=n]
MODE CON[:] [RATE=r DELAY=d]
BUFFERS=n[,m]
DEVICE=[drive:][path]filename [dd-parameters]
FILES=x
BREAK [ON|OFF]
LASTDRIVE=x
SHELL=[[drive:]path]filename [parameters]
Дозволяють здiйснювати вивiд на екран та встановлювати поточну дату та час, визначати версiю використовуваної ОС, встановлювати параметри конфiгурацiї ОС (режим роботи зовнiшнiх пристроїв, необхiдна к-ть буферiв та максимальна к-ть одночасно вiдкритих файлiв, встановлення додаткових драйверiв, та iн.). Останнi 7 команд цiєї групи використовуються в командному файлi CONFIG.SYS.
Органiзацiя командних файлiв:
ECHO, CLS, PAUSE, REM, PROMPT, PATH, SET, GOTO, IF, FOR, SHIFT, CALL
ECHO [ON|OFF]
CLS
PAUSE
REM
PROMPT [text]
PATH [[drive:]path[;...]]
SET variable=[string]
GOTO label
IF [NOT] ERRORLEVEL number command | IF [NOT] string1==string2 command |
IF [NOT] EXIST filename command
FOR %%variable IN (set) DO command [command-parameters]
FOR %variable IN (set) DO command [command-parameters]
SHIFT
CALL [drive:][path]filename [batch-parameters]
ЗАВДАННЯ:
Пояснити змiст команд наданого викладачем командного файлу.
За допомогою системних команд MS-DOS виконати вказаний викладачем варiант завдання.
Створити власний командний файл, що реалiзує виконанi в п.1 команди. Передбачити вивiд на екран повiдомлення в разi виникнення помилки при виконаннi одної з виконуваних команд. Перевiрити роботу створеного файлу, викликавши створений командний файл з файлу AUTOEXEC.BAT.
Скласти звiт про виконану роботу.
Варiанти завдання (набiр пунктiв з Основного набору операцiй):
Основний набiр операцiй:
ЛIТЕРАТУРА:
1.Фролов А.В., Фролов Г.В. Операционная система MS-DOS: В 3 кн. – М.:”ДИАЛОГ-МИФИ”, 1991-1992.
3.Данкан Р. Профессиональная работа в MS-DOS: Пер. С англ. – М:Мир, 1992. – 509 с.
4.Зверев С.А. Практическая работа в MS-DOS. – М.:Воениздат, 1991. – 76 с.
Лабораторна робота №2.
Технологiя виконання системних робiт на IBM PC.
Мета: оволодiння навичками роботи iз системною програмою DEBUG (наладчик).
РОБОТА IЗ ПРОГРАМОЮ DEBUG
Програма DEBUG - це наладчик програм у системi MS-DOS. Debug можна викликати за допомогою наступної команди MS-DOS:
DEBUG [<специфiкацiя_файла] [<список_аргументiв >]
Наприклад,
DEBUG file.exe
Якщо вказане iм'я файлу, то можна задавати ще й список параметрiв запуску даної програми. Команди debug складаються з лiтери та одного чи декiлькох параметрiв.
Команда debug | функцiя
A [<address>] асемблювання
С <range> <address> порiвняння
D [<range>] вивiд дампа на екран
E <address> [<list>] ввiд байтiв з клавiатури
F <range> <list> наповнення (зони в пам'ятi)
G [=<address> [<address>...]] запуск програми
H <value> <value> hex-арифметика
I <value> ввiд байта з порту
L [<address>[<drive:>
<record> <record>]] завантаження
M <range> <address> пересилання блока пам'ятi
N <filename>[<filename>] задати iм'я [файла]
O <value> <byte> вивiд байта до порту
Q вихiд до MS-DOS
R <register-name> вмiст регiстра
S <range> <list> пошук
T [=address>][<value>] трасування
U [<range>] деасемблювання
W [<address> [<drive:>
<record> <record>] запис
Якщо у командi debug присутня синтаксична помилка, вiн виводить помилковий командний рядок та вказує на помилку символом "^" та словом error.
Наприклад,
dcs:100 cs:110 (вiрно: dcs:100 l10)
^ error
db 123
^ error
Пiд час вводу команд дозволенi довiльнi сполучення символiв верхнього та нижнього регiстрiв.
Параметри у командi можуть бути розмежованi комами або пропусками. Наступнi команди еквiвалентнi:
dcs:100 110
d cs:100 110
d,cs:100,110
Опис деяких команд DEBUG.
1.Команда ASSEMBLE активує режим вводу команд асемблера та переводу їх в машиннi коди. Встановлення початкової адреси здiйснюється за допомогою команди:
A nnnn <Enter>
де nnnn - адреса змiщення в кодовому сегментi, з якої буде здiйснюватись ввiд команд
Завершити ввiд команд можна двiчi натиснувши клавiшу <Enter>.
2.Команда UNASSEMBLE деасемблює вказаний дiапазон байтiв з вказiвкою адрес та значень байтiв.
Наприклад:
U04BA:0100 L10
debug деасемблює 16 байтiв, починаючи вiд адреси 04BA:0100.
3.Команда TRACE має наступний формат:
T[=адреса][значення]
Якщо наведено значення параметра [=адреса], буде виконана команда, що розташована за вказаною адресою. Якщо наведений параметр <значення, команда трасування Т буде виконана вiдповiдне число разiв.
Наприклад:
T=011a 10
debug виконає 16(10h) iнструкцiй, починаючи вiд адреси 011A у поточному сегментi.
4.Команда GO має наступний формат:
G [=адреса][адреси]
Здiйснює/поновлює виконання програми з адреси вказаної в IP. Якщо наведено значення параметра [=адреса], будуть виконанi всi програмнi iнструкцiї, що знаходяться в дiапазонi адрес змiщень мiж поточним значенням IP та [=адреса], пiсля чого виконання буде призупинено.
Наприклад:
C:\> DEBUG <Enter>
A 100 <Enter>
0D13:100 MOV AH,00
0D13:102 INT 16H
0D13:104 CMP AL,00
0D13:106 <Enter>
T <Enter>
На цiй стадiї виконання IP буде мiстити 0102 i вказуватиме на наступну команду - INT 16H. Для того, щоб автоматично виконати викликану функцiю не трасуючи її тiла, необхiдно застосувати наступну команду:
G 104 <Enter>
Пiсля цього наладчик автоматично виконає всi iнструкцiї до вказаної адреси, пiсля чого можна продовжити трасування безпосередньо введеної програми.
5.Команда DUMP виводить на екран вмiст вказаної зони пам'ятi.
Наприклад:
dcs:100 110
debug друкує дамп у наступному форматi:
04BA:0100 42 45 52 54 41 ... 4E 44 TOM SAWYER
6.Команда REGISTERS виводить на екран вмiст регiстрiв та ознак. В якостi необов'язкового параметра можна вказати який-небудь окремий регiстр, значення якого необхiдно вивести на екран. По замовчуванню команда виводить значення всiх регiстрiв.
Регiстр прапорiв:
ЗАВДАННЯ:
Запустити наладчик.
Активувати режим асемблювання.
Ввести програмний код вказаного викладачем варiанту завдання.
Виконати трасування введеної програми.
Покроково задокументувати змiну значень регiстрiв даних, сегментних регiстрiв та регiстру прапорiв, пояснити змiну цих значень.
Визначити i проаналiзувати представлення введеної програми в машинному кодi.
Скласти звiт про виконану роботу.
Варiанти завдання:
ЛIТЕРАТУРА:
1.Р.Джордейн.Справочник програмиста персональных компъютеров типа IBM PC XT и AT. - M."Финансы и статистика",1992,стор.13-31.
2.Л.О.Березко,В.В.Троценко. Особливостi програмування на Турбо-асемблерi. -Киiв,НМК ВО,1992.
3.Л.Дао. Программирование микропроцессора 8088.Пер. с англ.-М."Мир",1988.
4.П.Абель.Язык ассемблера для IBM PC и программирования. Пер. с англ.-М.,"Высшая школа",1992.
5.Операционная система MS-DOS(версия 3.3). Справочное руководство.
6.А.Шнайдер.Язык ассемблера для персонального компъютера фирмы IBM.Пер. с англ.- М.,"Мир",1988.
Лабораторна робота №3.
*.COM - файли та програмування мовою assembler для IBM PC.
Мета: оволодiння навичками створення *.COM - файлiв.
Програма типу .COM вмiщує лише один сегмент, де розташованi усi компоненти програми:
- префiкс програмного сегмента;
- програмний код;
- данi;
- стек.
Структура типової програми має вигляд:
title Програма типу .COM
text segment 'code'
assume CS:text, DS:text, ES:text, SS:text
org 100h
myproc proc
... ; текст прграми
myproc endp
... ; означення даних
text ends
end myproc
Програма мiстить лише один сегмент text з класом 'CODE'. Оператор ASSUME затверджує, що усi чотири сегментнi регiстри вказують на цей єдиний сегмент. Оператор ORG 100h резервує 256 байтiв для PSP (префiкса програмного сегмента). Наповнювати PSP буде система. У програмi нема потреби iнiцiалiзувати регiстр DS, бо його, як всi iншi сегментнi регiстри, iнiцiалiзує система. Система у випадку .COM - файлу завжди задає IP=100h. Через це негайно за оператором ORG 100h повинен знаходитись перший виконуваний рядок програми. Якщо власнi данi бажано розмiстити на початку програми, тодi першою командою програми має бути jmp через цi данi.
Образ пам'ятi програми типу .COM наведено на рис.
-------------------
CS,DS,ES,SS -> | PSP (256 байтiв) | меншi адреси
| ---------------- | <-- IP
| Програма та |
| данi |
| -----------------| бiльшi адреси
| Стек |
------------------ <-- SP= FFFEh
До покажчика стека автоматично записується число FFFEh. Незалежно вiд реального розмiру програми їй надається 64 K адресного простору, тобто один i тiльки один сегмент. Стек зростає в напрямку зменшення адрес та за умови поганого планування програмiстом може "наїхати (тобто затерти)" на власнi данi та програму.
Розрiзняють два стилi оформлення ( запису ) асемблерних програм - iз стандартними та спрощеними сегментними директивами. Наступний приклад iлюструє застосування стандартних сегментних директив.
CODE SEGMENT WORD 'CODE'
ORG 100h
ASSUME cs:CODE, ds:CODE, ss:CODE, es:CODE
ProgramStart:
Jmp cont
HelloMessage db 'Hello, world', 13, 10, '$'
cont:
mov dx,OFFSET HelloMessage ;DS:DX points to the HelloMessage
mov ah,09 ;DOS string print function
int 21h ;print the HelloMessage
mov ah,4Ch ;DOS terminate program function
int 21h ;end of the program
CODE ENDS
END ProgramStart
;Нижче наведено приклад iз спрощеними сегментними директивами.
.MODEL TINY
.CODE
org 100h
start:
jmp prog
;власнi данi, що потребують перестрибування
HelloMessage DB 'Hello, world', 13, 10, '$'
prog:
mov ah,09 ;DOS print string function
mov dx,OFFSET HelloMessage ;point to "Hello, world"
int 21h ;display "Hello, world"
mov ah,4ch ;DOS terminate program function
int 21h ;terminate the program
END start
;----------------------------------------------------------
Система Turbo-Assembler виробляє .COM-файл в наступний спосiб:
C:\> tasm filename.asm <Enter>
Результат - файл filename.obj. Необов'язковi параметри /l або /la призводять до додаткової генерацiї файлу filename.lst, що мiститть лiстинг асемблювання програми.
C:\> tlink/t filename.obj <Enter>
Результат - файл filename.com, що вже можна запускати.
ЗАВДАННЯ:
Створити програму типу .COM, що реалiзує вказаний викладачем варiант завдання.
Перевiрити роботу створеної програми за допомогою наладчика DEBUG. Покроково проаналiзувати змiну значень регiстрiв даних, сегментних регiстрiв та регiстру прапорiв, пояснити змiну цих значень.
Скласти звiт про виконану роботу.
Варiанти завдання:
Див. "Лабораторна робота №2"
ЛIТЕРАТУРА:
1.Р.Джордейн.Справочник програмиста персональных компъютеров типа IBM PC XT и AT. - M."Финансы и статистика",1992,стор.13-31.
2.Л.О.Березко,В.В.Троценко. Особливостi програмування в турбо-асемблерi. -Киiв,НМК ВО,1992.
3.Л.Дао. Программирование микропроцессора 8088.Пер.с англ.-М."Мир",1988.
4.П.Абель.Язык ассемблера для IBM PC и программирования. Пер. з англ.-М.,"Высшая школа",1992.
Лабораторна робота №4.
*.EXE - файли та програмування мовою assembler для IBM PC.
Мета: оволодiння навичками створення *.EXE - файлiв та визначення конфiгурацiї ПЕОМ та її модулiв.
1.Структура стандартної програми типу .EXE
Структура стандартної програми типу .EXE має наступний вигляд:
TITLE Програма типу .EXE
STACK SEGMENT PARA STACK 'STACK'
db 200h DUP (?)
STACK ENDS
DATA SEGMENT WORD 'DATA'
HelloMessage db 'Hello, world',13,10,'$'
DATA ENDS
CODE SEGMENT WORD 'CODE'
ASSUME cs:CODE, ds:DATA
ProgramStart:
push ds ;initialize stack segment
sub ax,ax ;initialize stack segment
push ax ;initialize stack segment
mov ax,Data ;initialize data segment
mov ds,ax ;initialize data segment
mov dx,OFFSET HelloMessage ;DS:DX points to the HelloMessage
mov ah,09 ;DOS string print function
int 21h ;print the HelloMessage
mov ah,4Ch ;DOS terminate program function
int 21h ;end of the program
CODE ENDS
END ProgramStart
Порядок запису сегментiв у програмi на мовi Turbo-Assembler може бути довiльним.
Образ програми у пам'ятi починається з префiкса програмного сегмента (Program Segment Prefix, PSP), що утворюється та заповнюється системою. PSP завжди має розмiр 256 байтiв та вмiщує таблицi та поля даних, що використовуються системою пiд час виконання програми. Пiсля PSP розташовуються сегменти програми. Сегментнi регiстри автоматично iнiцiалiзуються наступним чином: ES та DS вказують на початок PSP, CS - на початок програмного сегменту, SS - на початок сегменту стеку. До IP завантажується вiдносна адреса точки входу до програми (з операнда директиви END).
Додаткова iнiцiалiзацiя та завершення:
Оскiльки системний завантажувач використовує DS для встановлення початкової точки PSP, програма користувача повинна зберегти цю адресу, записавши значення DS до стеку. Система вимагає, щоби наступне значення в стеку було нульовою адресою (точнiше, змiщенням). Необхiдно також iнiцiалiзувати DS так, щоб вiн вказував на власнi данi програми користувача (оскiльки не iснує способу пересилання безпосереднiх значень до сегментних регiстрiв, в якостi промiжного пункту пересилання використовується один iз регiстрiв даних, наприклад, AX). Послiдовнiсть операцiй:
push ds ;store DS in stack
sub ax,ax ;zero AX
push ax ;store zero in stack
mov ax,Data ;store Data segment address in DS
mov ds,ax
Образ пам'ятi програми типу .EXE наведено на рисунку:
DS,ES -> -------------------
| PSP (256 байтiв) | меншi адреси
CS -> | ---------------- | <-- IP
| Програмний |
| сегмент |
|------------------|
| Сегмент даних |
SS -> |------------------|
| Сегмент стека |
| -----------------| <-- SP
Розмiр кожного сегменту не може перевищувати 64KB.
Команда RET використовує значення DS, що було збережено в стеку на початку програми, для повернення в DOS.
Розрiзняють два стилi оформлення ( запису ) асемблерних програм - iз стандартними та спрощеними сегментними директивами. Попереднiй приклад iлюструє застосування стандартних сегментних директив. Нижче наведено приклад iз спрощеними сегментними директивами.
Приклад оформлення асемблерної програми у стилi .EXE файла iз спрощеними сегментними директивами:
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
HelloMessage db 'Hello, world', 13, 10, '$'
.CODE
push ds ;initialize stack segment
sub ax,ax
push ax
mov ax,@data
mov ds,ax ;set DS to point to the data segment
mov ah,9 ;DOS print string function
mov dx,OFFSET HelloMessage ;point to "Hello, world"
int 21h ;display "Hello, world"
mov ah,4ch ;DOS terminate program function
int 21h ;terminate the program
END
Система Turbo-Assembler продукує .EXE-файл в наступний спосiб:
C:\> tasm filename.asm <Enter>
Результат - файл filename.obj. Необов'язковi параметри /l або /la призводять до додаткової генерацiї файлу filename.lst, що мiстить лiстинг асемблювання програми.
C:\> tlink filename.obj <Enter>
Результат - файл filename.exe, що вже можна запускати.
2. Конфiгурацiя ПЕОМ
Для вирiшення деяких задач необхiдно знати тип ЕОМ, тип мiкропроцесора, склад зовнiшнiх пристроїв та їхнi технiчнi характеристики (наприклад, спроба звертання програми до неiснуючого пристрою може призвести до "зависання" операцiйної системи). Ця iнформацiя зберiгається у певних комiрках ОЗП, ПЗП i КМОП-пам'ятi i наводиться нижче.
2.1. Визначення типу ПЕОМ.
ПЗП BIOS мiстить за адресою F000:FFFEH байт що дозволяє iдентифiкувати тип ПЕОМ:
FFH оригiнальний IBM PC;
FEH XT, Portable PC; FDH - PCjr;
FCH AT;
FBH XT iз пам'яттю 640Kb на системнiй платi;
FAH PS/2 модель 25 або 30;
F9H Convertible PC;
F8H PS/2 моделi 55SX, 70,80;
9AH Comrad XT, Compaq Plus;
30H Sperry PC;
2DH Compaq PC, Compaq Deskpro.
2.2. Визначення типу мiкропроцесора.
Алгоритм визначення типу мiкропроцесора грунтується на розходженнях у регiстрах прапорiв (Рг) мiкропроцесорiв (МП) 8086, 80286 i 80386 i полягає в наступному:
У регiстр прапорiв записується 0. Якщо чотири старших розряди РгП встановлюються в 1 - це МП 8086. Якщо нi, то в регiстр прапора записується код F000H. Якщо пiсля цього 4 старшi розряди РгП залишаються в 0, то це МП 80286, у противному випадку - 80386.
2.3. Визначення дати створення BIOS.
Дата створення BIOS займає в ПЗП BIOS 8 байтiв починаючи з адреси F000:FFF5H i зберiгається у форматi ASCII у виглядi мм/дд/рр, де мм - номер мiсяця; дд - день; рр рiк.
2.4. Визначення конфiгурацiї IBM PC XT.
Мiкросхема послiдовного паралельного iнтерфейсу з периферiєю Intel 8255 у ПЕОМ призначена для багатьох цiлей. Вона повiдомляє про позицiю перемикачiв на системнiй платi, приймає данi з клавiатури, управляє рядом периферiйних пристроїв, включаючи мiкросхему таймера 8253.
З машин сiмейства IBM PC лише AT не використовує мiкросхему 8255; вона зберiгає iнформацiю про обладнання разом iз годинником реального часу в спецiальнiй мiкросхемi з незалежним живленням. Проте для роботи з клавiатурою i управлiння мiкросхемою таймера, мiкросхема AT використовує тi ж адреси портiв, що i 8255.
2.5. Визначення конфiгурацiї IBM PC AT.
2.5.1. Данi, що зберiгаються в КМОП-памяти.
КМОП-пам'ять органiзована на базi мiкросхеми MC146818 фiрми Motorola i має 64 8-розрядних комiрки (регiстри). У таблицi 1 приведений вмiст тих комiрок пам'ятi, в яких зберiгаються данi про конфiгурацiю i стан машини.
Звертання до КМОП-пам'ятi (запис i зчитування) здiйснюється в такий спосiб: спочатку в порт 70H заноситься адреса комiрки (номер регiстру). Потiм в залежностi вiд виконуваної операциии в порт 70H або записуються данi, або з порту 70H данi зчитуються.
Таблиця 1 Вмiст комiрок
Адреса комiрки Вмiст
0EH Байт стану дiагностики при вмиканнi живлення
10H Тип використовуваного НГМД
14H Конфiгурацiя обладнання
15H16H Розмiр основної пам'ятi
30H-31H Розмiр розширеної (extended) пам'ятi
2.5.1.1. Байт стану дiагностики.
Байт стану дiагностики мiстить результати виконання дiагностики при вмиканнi живлення машини. Формат байта стану приведений у таблицi 2.
Таблиця 2 Вмiст байта дiагностики
Бiт Значення
0-1 - не використовується, дорiвнює 0
2 0 - невiрно встановлено годинник реального часу;
1 - годинник встановлено вiрно
3 1 - несправнiсть НМД, неможливо завантажити операцiйну систему з жорсткого диску;
0 - НМД справний
4 - фактичний розмiр оперативної пам'ятi не вiдповiдає встановленому в КМОП-пам'ятi;
0 - розмiр оперативної пам'ятi встановлений правильно
5 - помилка в конфiгурацiї системи;
0 - конфiгурацiя встановлена правильно
6 1 - помилка в контрольнiй сумi КМОП-пам'ятi;
0 - контрольна сума КМОП-пам'ятi правильна
7 - розрядка акумулятора, що живить КМОП- пам'ять i годинник реального часу;
0 - акумулятор справний i заряджений
2.5.1.2. Тип використовуваних флоппi-дискiв.
Молодша i старша тетради цього байта описують вiдповiдно другий i перший НГМД:
0000 - дисковiд не встановлений;
0001 - дисковiд на 360К;
0010 - дисковiд на 1.2М;
0011 - дисковiд на 720К;
0100 - дисковiд на 1.44М.
2.5.1.3. Конфiгурацiя обладнання.
У таблицi 3 приведений байт конфiгурацiї:
Таблиця 3 Байт конфiгурацiї
Бiт Значення
0 1 - у системi встановленi НГМД;
0 - НГМД не використовуються
1 1 - встановлений арифметичний сопроцессор 80287 або 80387;
0 - сопроцесор не встановлений
2-3 Не використовуються, рiвнi 0
4-5 Тип вiдеоконтролера i його режим:
Бiти: 5 4
0 0 - не використовуються або EGA;
0 1 - CGA, EGA, VGA у режимi 40x25
1 0 - CGA, EGA, VGA у режимi 80x25
1 1 - монохромний контролер
6-7 Кiлькiсть використовуваних НГМД
2.5.1.4. Обсяг основної пам'ятi.
Комiрка 15H мiстить молодший байт, а комiрка 16H - старший байт розмiру основної пам'ятi в кiлобайтах.
2.5.1.5. Обсяг додаткової пам'ятi.
Комiрки 16H i 17H мiстять вiдповiдно молодший i старший байти розмiру додаткової пам'ятi (розташованої вище 1М) у кiлобайтах.
2.5.2. Данi, що зберiгаються в областi BIOS оперативної пам'ятi.
BIOS в процесi iнiцiалiзацiї опитує стан перемичок i аналiзує вмiст КМОП-пам'ятi. Пiсля аналiзу BIOS записує у свою область пам'ятi за адресою 0040:0010H слово конфiгурацiї. Призначення окремих бiтiв цього слова приведено в таблицi 4.
Таблиця 4
Бiт Значення
0 1 - система мiстить НГМД;
0 - система не мiстить НГМД
1 1 - встановлений арифметичний сопроцесор;
0 - арифметичний сопроцесор не встановлений
2-3 Обсяг основної пам'ятi, встановленої на системнiй платi:
Бiти: 3 2
0 1 - 16К
1 0 - 32К
1 1 - 64К i бiльше
4-5 Бiти: 5 4
0 0 - не використовується або EGA
0 1 - CGA, EGA, VGA в режимi 40x25;
1 0 - CGA, EGA, VGA в режимi 80x25;
1 1 - монохромний контролер
6-7 Кiлькiсть встановлених НГМД
8 1 - використовується контролер прямого доступу до пам'ятi;
0 - контролер прямого доступу до пам'ятi не використовується
9-11 Кiлькiсть встановлених портiв послiдовної передачi даних RS232S
12 1 - використовується iгровий адаптер (джойстик);
0 - iгровий адаптер не використовується
13 1 - встановлений послiдовний принтер (тiльки для PCjr)
14-15 Кiлькiсть встановлених принтерiв
ЗАВДАННЯ:
Використовуючи довiдкову iнформацiю про технiчнi характеристики ПЕОМ, визначити адресу або область ПЗП, ОЗУ або КМОП-пам'ятi, що мiстять данi, необхiднi для виконання вказаного викладачем варiанту завдання.
Створити програму типу .EXE, що реалiзує вказане завдання. Запустити створену програму та задокументувати результати її виконання.
Скласти звiт про виконану роботу.
Варiанти завдання:
ЛIТЕРАТУРА:
1.Р.Джордейн.Справочник програмиста персональных компъютеров типа IBM PC XT и AT. - M."Финансы и статистика",1992,стор.13-31.
2.Л.О.Березко,В.В.Троценко. Особливостi програмування в турбо-асемблерi. -Киiв,НМК ВО,1992.
3.Л.Дао. Программирование микропроцессора 8088.Пер.с англ.-М."Мир",1988.
4.П.Абель.Язык ассемблера для IBM PC и программирования. Пер. з англ.-М.,"Высшая школа",1992.
Лабораторна робота №5.
Органiзацiя переривань у IBM PC.
Мета: Знайомство з механiзмом переривань, оволодiння навичками їх обробки.
1. Механiзм i типи переривань.
Для обробки подiй, що вiдбуваються асинхронно стосовно виконання програми, найкраще пiдходить механiзм переривань. Переривання можна розглядати як деяку особливу подiю в системi, що потребує моментальної реакцiї. Наприклад, добре спроектованi системи пiдвищеної надiйностi використовують переривання по аварiї в мережi живлення для виконання процедур запису вмiсту регiстрiв i оперативної пам'ятi на магнiтний носiй, iз тим щоб пiсля вiдновлення живлення можна було б продовжити роботу з того ж мiсця.
Оскiльки переривання можуть виникати за рiзноманiтними причинами, кожному перериванню присвоюється номер переривання, з яким зв'язується та або iнша подiя. Система в разi надходження тої чи iншої подiї запускає вiдповiдну процедуру реакцiї на подiю.
За джерелом i характером виникнення переривання роздiляються на групи (Рис. 1):
Рис. 1.
Програмнi переривання викликаються самими програмами, тому вони не є асинхронними. Для цього вони використовують команду INT.
Програмнi переривання зручно використовувати для органiзацiї доступу до окремих спiльних для всiх програм модулiв. Наприклад, програмнi модулi операцiйної системи доступнi прикладним програмам саме через переривання, i немає необхiдностi при виклику цих модулiв знати їхню поточну адресу в пам'ятi. Прикладнi програми самi можуть встановлювати свої обробникi переривань для їхнього наступного використання iншими програмами. Для цього обробникi переривань, що вбудовуються, повиннi бути резидентними в пам'ятi.
Апаратнi переривання викликаються фiзичними пристроями i надходять асинхронно. Цi переривання iнформують систему про подiї, пов'язанi iз роботою пристроїв, наприклад, про те, що завершено друк символу на принтерi i можна видати наступний символ, або про те, що потрiбний сектор диска вже прочитано i його вмiст доступний програмi.
Використання переривань при роботi з повiльними зовнiшнiми пристроями дозволяє сполучити ввiд/вивiд з обробкою даних в центральному процесорi i в результатi пiдвищує загальну продуктивнiсть системи.
Зовнiшнi апаратнi переривання викликаються сигналами, зовнiшнiми стосовно цетрального процесора, i подаються на його входи INT i NMI.
Переривання по входi INT вiдносяться до апаратних маскованих переривань, оскiльки можуть бути дозволенi або забороненi прапором IF регiстра прапорiв. Номер вектора переривань, що маскуються, передається до процесора по його вiсьми молодших розрядах шини даних.
Вхiд немаскованого переривання NMI звичайно використовується для повiдомлень про "катастрофiчнi" подiї (вiдключення живлення, виявлення помилок пам'ятi i т.д.). Номер цього переривання дорiвнює 2.
Внутрiшнi (логiчнi) переривання формуються безпосередньо процесором, коли виникає така особлива ситуацiя, як, наприклад, дiлення на 0. Цi переривання мають номери 0, 1, 3, 4 (див. табл.1).
Таблиця 1. Найбiльш важливi переривання
Номер Опис
0 Помилка дiлення. Викликається автоматично пiсля виконання команд DIV або IDIV, якщо в результатi дiлення вiдбулося переповнення. DOS зазвичай при обробцi цього переривання виводить повiдомлення про помилку й зупиняє виконання програми. Для процесора 8086 при цьому адреса повернення вказує на наступну пiсля команди дiлення команду, а в процесорi 80286 - на перший байт команди, що викликала переривання
1 Переривання покрокового режиму. Виникає пiсля виконання кожної машинної команди, якщо в словi прапорiв встановлений бiт покрокового трасування TF. Використовується для наладки програм. Переривання не виникає пiсля виконання команди MOV у сегментнi регiстри або пiсля завантаження сегментних регiстрiв командою POP
2 Апаратне немасковане переривання. Це переривання може використовуватися по-рiзному в рiзних машинах. Звичайно виникає при помилцi парностi в оперативнiй пам'ятi i при запитi переривань вiд сопроцесора
3 Переривання для трасування. Це переривання генерується при виконаннi однобайтової команди з кодом CCh i звичайно використовується наладчиками для встановлення точки переривання
4 Переповнення. Генерується машинною командою INTO, якщо встановлений прапор OF. Якщо прапор не встановлений, то команда INTO виконується як NOP. Це переривання використовується для обробки помилок при виконаннi арифметичних операцiй
5 Друк копiї екрана. Генерується при натисканнi на клавiатурi клавiшi PrtScr. Звичайно використовується для друку образу екрана. Для процесора 80286 генерується при виконаннi машинної команди BOUND, якщо значення, що перевiряється, вийшло за межi заданого дiапазону
6 Невизначений код операцiї або довжина команди бiльше 10 байтiв (для процесора 80286)
7 Особливий випадок вiдсутностi сопроцессора
8 IRQ0 - переривання iнтервального таймера, виникає 18,2 разiв в секунду
9 IRQ1 - переривання вiд клавiатури. Генерується при натисканнi i при вiдпусканнi клавiшi. Використовується для читання даних з клавiатури
A IRQ2 - використовується для каскадування апаратних переривань у машинах класу AT
B IRQ3 - переривання асинхронного порту COM2
C IRQ4 - переривання асинхронного порту COM1
D IRQ5 - переривання вiд контролера жорсткого диска для XT
E IRQ6 - переривання генерується контролером флоппi-диска пiсля завершення операцiї
F IRQ7 - переривання принтера. Генерується принтером, коли вiн готовий до виконання чергової операцiї. Багато адаптерiв принтера не використовують це переривання
10 Обслуговування вiдеоадаптера
11 Визначення конфiгурацiї пристроїв у системi
12 Визначення розмiру оперативної пам'ятi в системi
13 Обслуговування дискової системи
14 Послiдовний ввiд/вивiд
15 Розширений сервiс для AT-комп'ютерiв
16 Обслуговування клавiатури
17 Обслуговування принтера
18 Запуск BASIC у ПЗУ, якщо вiн є
19 Завантаження операцiйної системи
1A Обслуговування годинника
1B Обробник переривань Ctrl-Break
1C Переривання виникає 18,2 разiв в секунду, викликається програмно обробником переривання таймера
1D Адреса вiдеотаблицi для контролера вiдеоадаптера 6845
1E Покажчик на таблицю параметрiв дискети
1F Покажчик на графiчну таблицю для символiв iз кодами ASCII 128-255
20-5F Використовуються DOS або зарезервованi для DOS
60-67 Переривання, зарезервованi для користувача
68-6F Не використовуються
70 IRQ8 - переривання вiд годинника реального часу
71 IRQ9 - переривання вiд контролера EGA
72 IRQ10 - зарезервовано
73 IRQ11 - зарезервовано
74 IRQ12 - зарезервовано
75 IRQ13 - переривання вiд сопроцесора
76 IRQ14 - переривання вiд контролера жорсткого диска
77 IRQ15 - зарезервовано
78-7F Не використовуються
80-85 Зарезервованi для BASIC
86-F0 Використовуються iнтерпретатором BASIC
F1-FF Не використовуються
2. Таблиця векторiв переривань.
Для того щоб зв'язати номер переривання з адресою програми реакцiї на переривання (обробника переривань), використовується таблиця векторiв переривань, що займає перший кiлобайт оперативної пам'ятi - адреси вiд 0000:0000 до 0000:03FF. Таблиця складається з 256 елементiв - 4-байтних адрес обробникiв переривань. Цi елементи називаються векторами переривань. У першому словi елемента таблицi записане змiщення, а в другому - сегмент адреси обробника переривань. Перериванню з номером 0 вiдповiдає адреса 0000:0000, перериванню з номером 1 - 0000:0004 i т.д. Перериванню з номером n буде вiдповiдати адреса 0000:4*n.
Iнiцiалiзацiя таблицi вiдбувається частково програмою BIOS пiсля тестування апаратури, частково при завантаженнi DOS. DOS може переключити на себе деякi переривання BIOS.
3. Маскування переривань.
Часто при виконаннi критичних дiлянок програм, для того щоб гарантувати виконання визначеної послiдовностi команд, необхiдно забороняти переривання. Це можна зробити командою CLI (скидання прапора дозволу переривання). Її потрiбно ввести в початок критичної послiдовностi команд, а наприкiнцi ввести команду STI (встановити прапор дозволу переривання). Команда CLI забороняє тiльки маскованi переривання, немаскованi - завжди обробляються процесором.
Якщо програмiст використовує заборону переривань за допомогою команди CLI, необхiдно слiдкувати за тим, щоб переривання не вiдключалися на тривалий перiод часу, оскiльки це може призвести до небажаних наслiдкiв, наприклад, вiдставання системного годинника. Якщо потрiбно заборонити лише деякi переривання, наприклад, вiд клавiатури, для цього треба скористатися послугами контролера переривань.
4. Змiна таблицi векторiв переривань.
Якщо програмi буде потрiбно органiзувати обробку деяких переривань, для цього необхiдно перевстановити потрiбний вектор переривань на свiй обробник змiнивши вмiст вiдповiдного елемента таблицi векторiв переривань. Дуже важливо не забути перед завершенням роботи програми вiдновити вмiст змiнених векторiв, оскiльки пiсля завершення роботи програми пам'ять, що була надана їй системою, вважається вiльною i може бути використана для завантаження iншої програми. Якщо вектор не був вiдновлений i виникло переривання, робота системи може порушитися - вектор тепер вказує на область, що може мiстити все, що завгодно.
Послiдовнiсть дiй для нерезидентных програм, що обробляють переривання, повинна бути такою:
прочитати вмiст елемента таблицi векторiв переривань для вектора з номером переривання, яке потрiбно обробити;
зберегти цей вмiст (адреса старого обробника переривання) в областi даних програми;
встановити нову адресу в таблицi векторiв переривань так, щоб вона вказувала на початок програми обробки переривання користувача;
перед завершенням роботи програми прочитати з областi даних адресу старого обробника переривання i записати його в таблицю векторiв переривань.
* для резидентних програм останнiй пункт виконувати не потрiбно.
Операцiя змiни вектора переривань повинна бути неперервною в тому сенсi, що пiд час змiни не повинно виникнути переривання з номером, для якого вiдбувається замiна програми обробки. Для цього перед записом у вектор переривання потрiбно заборонити переривання командою CLI, а пiсля запису - дозволити командою STI.
Для полегшення операцiї замiни переривань DOS має спецiальнi функцiї для читання елемента таблицi переривань i для запису в неї нової адреси. Коректнiсть операцiй при цьому буде гарантована. Для читання вектора використовуйте функцiю 35h DOS (переривання 21h). Перед її викликом регiстр AL повинен мiстити номер вектора в таблицi. Пiсля виконання функцiї в регiстрах ES:BX буде розмiщена адреса обробника переривання. Функцiя 25h DOS встановлює для вектора з номером, що знаходиться в AL, обробник переривань DS:DX.
5. Корекцiя системних обробникiв переривань.
Якщо необхiдно додати якi-небудь власнi дiї до тих, що виконує стандартний обробник переривання, можна органiзувати ланцюжок переривань. Для органiзацiї ланцюжка переривань необхiдно записати в таблицю векторiв адресу власного обробника, попередньо зберiгши попереднє значення елементу, що записується. Обробник користувача отримує управлiння по перериванню, виконує свої дiї, потiм передає управлiння стандартному обробнику. В разi необхiдностi можна вставити додаткову обробку пiсля виклику стандартного обробника.
6. Приклад транзитного обробника перивання по <Ctrl-C> (функцiя 23h команди DOS 21h).
Програма перiодично виводить на екран рядок символiв. При натисканнi комбiнацiї клавiш <Ctrl-C> управлiння передається на внутрiшнiй обробник пркладної програми.
Варiант запису тексту програми може бути наступним:
STACK_SEG SEGMENT PARA STACK 'Stack' ;start of stack segment
db 32 dup('?') ;reserve some space
STACK_SEG ENDS ;end of stack segment
DATA_SEG SEGMENT PARA 'Data'
message1 db ‘Press CTRL+C to activate new handler…',10,13,'$'
message2 db '--> ', '$'
message3 db '<CTRL/C> handler activated', 13, 10, '$'
time dw 100
count dw 6
DATA_SEG ENDS
CODE_SEG SEGMENT PARA 'Code' ;start of code segment
MAIN_PROC PROC FAR ;start of main procedure
assume cs:CODE_SEG, ds:DATA_SEG, ss:STACK_SEG
push ds ;save ds position
sub ax,ax ;get yourself a '0' value - e.g. in ax
push ax ;zero-initialize stack
mov ax,DATA_SEG
mov ds,ax
mov ah,9h
mov dx,offset message1 ;print the first message
int 21h
push ds ;save ds
mov ax,SEG NEW_HANDLER ;set new handler address
mov ds,ax
mov ah,25h ;"set vector" function
mov al,23h ;handler ID
mov dx,offset NEW_HANDLER ;ds:dx now points to new handler
int 21h
pop ds ;restore ds
go:
mov ah,9h
mov dx,offset message2 ;print the second message
int 21h
push cx ;setup "wait" loop
mov cx,time
outer:
push cx
mov cx,0
inner:
loop inner
pop cx
loop outer
pop cx
dec count ;decrease print message counter
test count,0FFFFH ;done ?
jne go ;no --> proceed
mov ah,4Ch ;get out to DOS
int 21h
NEW_HANDLER:
push ax
push bx
push cx
push dx
mov ah,9h
mov dx,offset message3 ;print the new hadler message
int 21h
mov count,10 ;change the counter to indicate
;new handler activity
pop dx
pop cx
pop bx
pop ax
iret
get_out:
ret ;return to DOS
MAIN_PROC ENDP ;end of main procedure
CODE_SEG ENDS ;end of code segment
END MAIN_PROC
ЗАВДАННЯ:
Створити програму, що виконує функцiї транзитного обробника одного iз зарезервованих для користувача переривань i реалiзує вказаний викладачем варiант завдання.
Запустити створену програму та задокументувати результати її виконання.
Скласти звiт про виконану роботу.
Варiанти завдання:
Див. "Лабораторна робота №4"
ЛIТЕРАТУРА:
1.Р.Джордейн.Справочник програмиста персональных компъютеров типа IBM PC XT и AT. - M."Финансы и статистика",1992,стор.13-31.
2.Л.О.Березко,В.В.Троценко. Особливостi програмування в турбо-асемблерi. -Киiв,НМК ВО,1992.
3.Л.Дао. Программирование микропроцессора 8088.Пер.с англ.-М."Мир",1988.
4.П.Абель.Язык ассемблера для IBM PC и программирования. Пер. з англ.-М.,"Высшая школа",1992.
Лабораторна робота №6.
Управлiння клавiатурою IBM PC.
Мета: Вивчення органiзацiї та принципiв роботи клавiатури, оволодiння навичками управлiння клавiатурою за допомогою системних функцiй.
Процес взаємодiї системи з клавiатурою
_____
| | Адреса ПОП з вектора
|---------------->| ЦП |<--- переривання 09h (комiрки
|Апаратне |_____| 00:24h та 00:26h)
Вiдпускення/ |переривання |
натискання |типу 09h _____|______ Слово прапорiв клавiатури
клавiшi ____|______ Порт | ПОП int 09h| _______________
__|__|__|_ | Контролер | 60h |____________| | Адреса 40h:17h|
|Клавiатура|-->| клавiатури|------>| + |<--------|_______________|
|__________| |___________| Скен-|____________| | | | | | | | |
код | Розряд:
| 7: Ins
| 6: Caps Lock
| Скен + 5: Num Lock
| ASCII 4: Scroll Lock
| 3: Alt
Кiльцевий | 2: Ctrl
буфер | 1: Shift Left
вводу | 0: Shift Right
____________ |
40h:1eh| | |
|___________ | |
Початок --->|Скен |ASCII | |
40h:1Ah | |_____|______| |
| |Скен |ASCII |<-|
| |_____|______|
| | |<------- Кiнець 40h:1Ch
| |____________|
| |____________| 40h:3Ch
| _____________________
|->| Програма користувача|
| int 16h |
|_____________________|
Клавiатура має три основних типи клавiш:
Символьнi (алфавiтно-цифровi): букви вiд А до Z, цифри вiд 0 до 9, символи !,@,#,$,% i т.iн.
Функцiональнi: <Home>, <End>, <Backspace>, стрiлки, <Return>, <Del>, <Ins>, <PgUp>, <PgDn> i програмно-функцiональнi клавiшi.
Управляючi: <Alt>, <Ctrl>, <Shift>, якi працюють в сукупностi з iншими клавiшами.
Роботою клавiатури управляє спецiальна мiкросхема - контролер клавiатури. В його функцiї входить розпiзнавання натиснутої клавiшi та пересилання закрiпленого за нею коду у свiй вихiдний регiстр (порт), як правило, з номером 60h. Код клавiшi, що поступає в порт, називається скен-кодом. При цьому кожнiй клавiшi присвоєнi два скен-коди, якi вiдрiзняються на 80h (менший код пересилається в порт при натисканнi клавiшi, бiльший - при вiдпусканнi).
Програма обробки переривання вiд клавiатури INT 09H окрiм портiв працює ще з двома областями пам'ятi: кiльцевим буфером вводу (адреси вiд 40h:1Eh до 40h:3Dh), куди врештi решт пересилаються ASCII коди натиснутих клавiш, i словом стану (словом прапорiв) клавiатури (адреса 40h:17h, 40h:18h), в якому фiксується стан управляючих клавiш (<Shift>,<Caps Lock>,<Num Lock> i т.iн). Якщо визначено скен-код клавiшi-перемикача (правий Shift, лiвий <Shift>, <Ctrl>, <Alt>, <Scroll Lock>, <Num Lock>, <Caps Lock> i <Insert>), змiнюється вмiст комiрок слова стану клавiатури. В буфер клавiатури при цьому нiчого не пересилається (виключенням є лише клавiша <Insert>).
Формат байта за адресою 0040:0017H
Бiт Значення, коли бiт = 1
0 натиснуто праву клавiшу <Shift>
1 натиснуто лiву клавiшу <Shift>
2 натиснуто клавiшу <Ctrl>
3 натиснуто клавiшу <Alt>
4 режим <Scroll Lock> включено
5 режим <Num Lock> включено
6 режим <Caps Lock> включено
7 режим вставки включено
Формат байта за адресою 0040:0018H
Бiт Значення, коли бiт = 1
0 натиснуто клавiшi лiвий <Shift> / <Ctrl>
1 натиснуто клавiшi лiвий <Shift> / <Alt>
2 натиснуто клавiшу <SysRq>
3 натиснуто клавiшi <Ctrl> / <Num Lock>
4 режим <Scroll Lock> включено
5 режим <Num Lock> включено
6 режим <Caps Lock> включено
7 режим вставки включено
Стан клавiш-перемикачiв може бути змiнений програмно.
При натисканнi клавiшi програма INT 09H зчитує з порту 60h її скен-код натискання i за таблицею трансляцiї скен-кодiв в коди ASCII формує двобайтовий код, старший байт якого мiстить скен-код, а молодший - код ASCII. При цьому якщо скен-код характеризує клавiшу, то ASCII код визначає закрiплений за нею символ. Оскiльки за кожною клавiшею закрiплено, як правило, не менше двох символiв ("а"/"А", i т.iн.), то кожному скен-коду вiдповiдає, як мiнiмум, два коди ASCII.
Одержаний в результатi трансляцiї двобайтовий код пересилається до кiльцевого буферу вво