Розробили:  проф. Сидоренко В.В., викл. Дóренський О.П., 2006-2011
Лабораторна робота № 1
ТЕМА:	Використання системного програмування в реальному режимі роботи центрального 	процесора для визначення конфігурації ПК IBM PC.
МЕТА:	Ознайомитись з основами системного програмування, навчитись програмним шляхом одержувати інформацію про системні характеристики ПК типу IBM PC.
Короткі теоретичні відомості
Системна інформація про комп’ютер зберігається у зарезервованих комірках пам’яті, які завантажуються в молодші 640 Кб адресного простору ОЗП та використовуються системними та прикладними програмами під час роботи ПК. 
Розглянемо спрощену схему розподілу пам’яті у реальному режимі (таблиця 1.1).
Таблиця 1.1 – Розподіл пам’яті у реальному режимі
Адреса
Значення
FFFFFF
ПЗП BIOS
F0000
Зарезервовано
C0000
Текстовий відеобуфер
B8000
Графічний відеобуфер
A0000
Область для завантаження транзитних програм (додатків користувача)
Резидентна частина командного процессора
Ядро системи MS DOS
Драйвера пристроїв
00400
Область даних BIOS і DOS
00000
Таблиця векторів переривань
У молодших адресах пам’яті розміщується ядро ОС, перші 1024 байта якої займає таблиця векторів переривань. Кожен елемент цієї таблиці – 32-розрядна адреса підпрограми-обробника переривання (згадайте цю тему з “Мікропроцесорних ВІС”), яка задана у форматі
[сегмент] : [зміщення]
і називається вектором переривань. Ці адреси використовуються CPU виклику підпрограми обробки апаратних та програмних переривань.
Після таблиці векторів переривань розміщено велику ділянку оперативної пам’яті, яка використовується як область даних BIOS та операційної системи (ОС).
Наступні 640 Кбайт ОЗП – область пам’яті, у якій знаходяться драйвери пристроїв ОС. Вони забезпечують керування введенням/виведенням для більшості стандартних пристроїв (наприклад, для клавіатури, дискових накопичувачів, відео адаптера, послідовного та паралельного інтерфейсів).
Як відомо, існує багато моделей ПК IBM PC: Оригінальний IBM PC, ХТ, АТ, PCjr, Compag XT, Sperry PC і ін. Є три способи визначення моделі  та отримання деякої інформації про конфігурацію комп’ютера:
прочитати дану інформацію з комірок ПЗП BIOS;
викликати одну з функцій переривання 15h, яка повертає адресу таблиці конфігурації;
за допомогою системної утиліти debug (дебагер).
Спосіб 1. У постійній пам’яті BIOS за адресою F000:FFFE міститься байт, значення якого є ідентифікацією типу комп’ютера (див. таблицю 1.2). За адресою F000:FFF5 міститься дата виготовлення BIOS, яка записана у коді ASCII в американському форматі (MM/DD/YY – місяць/день/рік) та займає 8 байт.
Таблиця 1.2 – Значення байту ідентифікації типу ПК
Код
Тип  комп’ютера
FF
Оригінальний IBM PC
FE
XT, Portable PC
FD
PCjr
FC
AT
FB
XT з пам’яттю 640К на материнській платі
FA
PS/2 модель 25 або 30
F9
Convertible PC
F8
PS/2 моделі 55SX,70,80
9A
Compag XT, Compag Plus
30
Sperry PC
2D
Compag PC, Compag Deskpro
Для читання вмісту даної комірки області пам’яті BIOS можна використати стандартну функцію TC peekb():
unsigned char Val = peekb(Seg, Offset) ,
де параметр Seg – значення сегменту, Offset – зміщення.
Приклад використання способу 1 наведено в лістингу 1.1.
Лістинг 1.1 – Програма одержання коду типу ПК ІВМ РС.
#include <stdio.h>
#include <conio.h>
int main (void)
{
	unsigned char KOD;
	KOD = peekb(0xF000,0xFFFE);
 	printf("Код типу комп’ютера: %xh\n", KOD);
	return 0;
}
Спосіб 2. Більш детальну інформацію можна отримати, викликавши функцію C0h переривання BIOS INT 15h. Для генерації цього переривання необхідно:
на вході:	АН=C0h
{виклик переривання}
на виході:	ES:BX = адреса таблиці конфігурації
	CF = 0, якщо виклик переривання пройшов успішно
	CF = 1, якщо дана версія BIOS не підтримує виконання функції C0h.
Після виконання переривання регістри ES:BX будуть вказувати на таблицю в області ПЗП BIOS, значення якої наведено у таблиці 1.3. 
Таблиця 1.3 – Таблиця ПЗП BIOS ідентифікації комп’ютера
Зміщення
Розмір, байт
Опис
(+0)
2
Розмір таблиці в байтах
(+2)
1
Код моделі
(+3)
1
Додатковий код моделі
(+4)
1
Версія BIOS revision:  
0 – для першої реалізації;  2 - для другої і т.д.
(+5)
1
Байт конфігурації обладнання
біт 7
канал 3 DMA використовується дисковою системою базового введення/виведення (дисковою BIOS)
біт 6
Встановлено 2й контролер переривання 8259;
біт 5
Встановлено RTC;
біт 4
Після кожного виклику переривання від клавіатури INT 9h викликається функція 4Fh переривання INT 15h
біт 3
У BIOS реалізовано функцію очікування зовнішньої події
біт 2
Використовується розширена область даних BIOS
біт 1
Якщо встановлено – використовується шина Micro Channel, ні – ISA
біт 0
Зарезервовано
6
2
Зарезервовано і містить 0
8
2
Зарезервовано і містить 0
 Довідка: в ТС регістри зарезервовані як _AH, _BX, _CX, _ES і т.д.
Для генерації переривання в ASM використовується команда INT або функція TС
geninterrupt(Num),
де параметр функції Num – номер переривання (наприклад, geninterrupt(0х15);).
Приклад використання способу 1 наведено в лістингу 1.1.
Лістинг 1.2 – Програма виклику функції C0h переривання 15h.
#include <stdio.h>
#include <conio.h>
int main (void)
{
	_AX=0x0C;
	geninterrupt(0x15);
 	printf("Адреса таблиці конфігурації ПК: %x:%x\n", _ES, _BX);
	return 0;
}
Спосіб 3. Системна програма DEBUG, яка у ОС Windows знаходиться в системній директорії WINDOWS\system32, дозволяє переглядати пам’ять, вводити програми і здійснювати трасування їх виконання, а також може бути використана для одержання системної інформації про ПК.
Після запуску програми debug.exe (Пуск → Выполнить → debug) або завантаження її з диска у пам’ять  з’явиться запрошення до роботи ( з’явиться дефіс, що і є сигналом готовності програми до приймання команд.
Перегляд пам’яті за допомогою дебагера
Перевіримо, насамперед, розмір доступної для роботи пам’яті. Дані значення знаходяться у чарунках пам’яті 413h і 414h. Це значення можна переглянути із Debug за адресою, яка складається з двох частин:
400 ( адреса сегменту, який необхідно записати як 40 (останній нуль не пишеться);
13 ( зміщення від початку сегменту.
Таким чином, для виконання описаної раніше операції необхідно у дебагері у командному рядку задати:
D 40:13
Перші два байти у шістнадцятковій системі лічби означатимуть об’єм пам’яті у Кб, при чому байти будуть розміщення у зворотній послідовності. 
Серійний номер
Серійний номер комп’ютера “зашито” у ROM за адресою FE000h зі зміщенням 00h.
D FE00:0
Дата ROM BIOS
Дата ROM BIOS в форматі MM/DD/YY знаходиться за адресою FFFF5h, тобто необхідно задати:
D FFFF:05
Машинні (асемблерні) коди
Проілюструємо просту програму на машинній мові, її представлення у пам’яті і результати її виконання. Програма:
B82301	mov AX,0123h
052500	add AX,0025h
8BD8	mov BX,AX
03D8	add AX,BX
8BCB	mov CX,BX
2BCB	sub AX,AX
90	nop
СВ	поверення y DOS
Треба зауважити, що машинні команди мають різну довжину: один, два або три байти. Машинні коди знаходяться у пам’яті безпосередньо один за іншим. Виконання програми починаєтьсяз першої команди і послідовно виконується до команди завершення роботи.
Можна ввести наведену вище програму безпосередньо у пам’ять комп’ютера і виконати її покомандно. В той же час можна переглянути вміст регістрів після виконання кожної команди.
Для того, щоб роздрукувати результати роботи дебагера необхідно натиснути <Ctrl>+<PrtScr>.
Для безпосеренього введення програми на машинній мові необхідно ввести наступну команду:
E DS:100 B8 21 01 05 25 00
Команда Е означає введення (Enter). Параметр CS:100 визначає адресу пам’яті, куди будуть вводитись команди, ( 10016 (265) байт від початку сегменту кодів (звичайна стартова адреса для машинних кодів у відлагоджувача Debug). Команда Е записує кожну пару шістнадцяткових цифр у пам’ять у вигляді байту, починаючи з адреси CS:100 до дареси CS:105.
Тому наступною командою має бути
E CS:106 8B D8 03 D8 8B CB
E CS:10C 2B C8 2B C0 90 CB
Правильність введених у пам’ять кодів треба обов’язково перевіряти і у разі помилки обов’язково повторити запис необхідних значень.
Для перегляду стану всіх регістрі процесора необхідно ввести команду R і відлагоджувач виведе на екран стан всіх регістрів. Наприклад,
-R
AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2B  ES=0B2B  SS=0B2B  CS=0B2B  IP=0100   NV UP EI PL NZ NA PO NC
0B2B:0100 B82301        MOV     AX,0123
Стан регістру ІР (вказівник команд) виводиться у вигляді ІР=0100, що є свідченням того, що команда, яка виконається, знаходиться зі зміщенням 100h байт від початку сегмента кодів.
Відразу за значенням регістру ІР виводиться флаги флагового регістру 
NV UP EI PL NZ NA PO NC
Як видно, команда R також показує за зміщенням 100h першу машинну команду, яка виконається (MOV AX,0123).
Для покрокового виконання програми необхідно дати команду Т.
-E CS:100 B8 23 01 05 25 00
-E CS:106 8B D8 03 D8 8B CB
-E CS:10C 2B C8 2B C0 90 CB
-R
AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2B  ES=0B2B  SS=0B2B  CS=0B2B  IP=0100   NV UP EI PL NZ NA PO NC
0B2B:0100 B82301        MOV     AX,0123
-T
AX=0123  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2B  ES=0B2B  SS=0B2B  CS=0B2B  IP=0103   NV UP EI PL NZ NA PO NC
0B2B:0103 052500        ADD     AX,0025
-T
AX=0148  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2B  ES=0B2B  SS=0B2B  CS=0B2B  IP=0106   NV UP EI PL NZ NA PE NC
0B2B:0106 8BD8          MOV     BX,AX
-T
AX=0148  BX=0148  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2B  ES=0B2B  SS=0B2B  CS=0B2B  IP=0108   NV UP EI PL NZ NA PE NC
0B2B:0108 03D8          ADD     BX,AX
-T
AX=0148  BX=0290  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2B  ES=0B2B  SS=0B2B  CS=0B2B  IP=010A   NV UP EI PL NZ AC PE NC
0B2B:010A 8BCB          MOV     CX,BX
-T
AX=0148  BX=0290  CX=0290  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2B  ES=0B2B  SS=0B2B  CS=0B2B  IP=010C   NV UP EI PL NZ AC PE NC
0B2B:010C 2BC8          SUB     CX,AX
-T
AX=0148  BX=0290  CX=0148  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2B  ES=0B2B  SS=0B2B  CS=0B2B  IP=010E   NV UP EI PL NZ AC PE NC
0B2B:010E 2BC0          SUB     AX,AX
-T
AX=0000  BX=0290  CX=0148  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2B  ES=0B2B  SS=0B2B  CS=0B2B  IP=0110   NV UP EI PL ZR NA PE NC
0B2B:0110 90            NOP
-T
AX=0000  BX=0290  CX=0148  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2B  ES=0B2B  SS=0B2B  CS=0B2B  IP=0111   NV UP EI PL ZR NA PE NC
0B2B:0111 CB            RETF
Запис CS=0B2B означає, що початок сегмента кода програми знаходиться зі зміщенням 0В2В0h. Значення 0В2В:0100 означає 10016 байт від початкової адреси 0В2Вh у регістрі CS.
Для перегляду програми у машинних кодах в сегменті кодів треба ввести D:
-D CS:100
0B2B:0100  B8 23 01 05 25 00 8B D8-03 D8 8B CB 2B C8 2B C0   .#..%.......+.+.
0B2B:0110  90 CB E9 C9 D7 E9 C3 D7-89 7E 02 80 34 00 1A 0B   .........~..4...
0B2B:0120  3F 2E B9 08 00 F3 AA 86-C4 AA 86 C4 B1 03 F3 AA   ?...............
0B2B:0130  32 C0 AA C3 BE 69 9B BF-2F 96 B4 60 CD 21 BE D8   2....i../..`.!..
0B2B:0140  95 BF 2F 96 E8 CB E3 C3-33 C0 89 3E 93 9C A2 96   ../.....3..>....
0B2B:0150  9C A2 97 9C 8A F8 9C 57-33 C9 88 0E C2 9A AC E8   .......W3.......
0B2B:0160  73 E3 75 1D 3C 20 74 F6-3C 09 74 F2 86 06 97 9C   s.u.< t.<.t.....
0B2B:0170  0A C0 74 EA F6 C7 80 74-05 C6 06 C2 9A 01 E9 2D   ..t....t.......-
Для того, щоб ще раз провести виконання програми необхідно скинути регістр ІР, що робить команда
R  IP,
після чого на екрані з’явиться запит зміщення:
-R IP
IP 0100
:100
Тепер можна повторити трасування командою Т.
Завершення роботи Debug здійснюється командою Q (Quit – вихід). 
Визначення даних
Визначимо облать даних, яка містить відповідні значення:
Адреса в DS
Значення
Номери байтів
0000
2301
0 і 1
0002
2500
2 і 3
0004
0000
4 і 5
0006
2А2А2А
6, 7 і 8
А10000
Переслати слово, яке починається в DS за адресою 0000, у регістр АХ
03060200
Додати слово, яке починається у DS за адресою 0002, до АХ
А30400
Переслати вміст АХ у слово, яке починається у DS за адресою 0004
СВ
Поверенення в DOS
Введемо команди Е для сегмента даних:
-E DS:00 23 01 25 00 00 00
-E DS:06 2A 2A 2A
Перша команда записує три слова (шість байтів) у початок сегменту даних, DS:00. Зверніть увагу, що кожне слово вводиться у зворотній послідовності.
Друга команда записує три зірочки (***) для того, щоб їх можна було побачити після виконання команди D (Dump) ( іншого значення ці символи не мають. 
Запишемо тепер код команди                
mov AX,[0000]
для завантаження у регітр АХ записаних у сегмент даних зі зміщенням 0000 даних:
-E cs:100 A1 00 00 03 06 02 00
-E CS:107 A3 04 00 CB
-D DS:000
0B2B:0000  23 01 25 00 00 00 2A 2A-2A F0 4F 03 78 05 8A 03   #.%...***.O.x...
0B2B:0010  78 05 17 03 78 05 1D 04-01 01 01 00 02 FF FF FF   x...x...........
0B2B:0020  FF FF FF FF FF FF FF FF-FF FF FF FF 27 05 4E 01   ............'.N.
0B2B:0030  4F 0A 14 00 18 00 2B 0B-FF FF FF FF 00 00 00 00   O.....+.........
0B2B:0040  05 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0B2B:0050  CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20   .!...........
0B2B:0060  20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20           .....
0B2B:0070  20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00           ........
-D CS:100
0B2B:0100  A1 00 00 03 06 02 00 A3-04 00 CB CB 2B C8 2B C0   ............+.+.
0B2B:0110  90 CB E9 C9 D7 E9 C3 D7-89 7E 02 80 34 00 1A 0B   .........~..4...
0B2B:0120  3F 2E B9 08 00 F3 AA 86-C4 AA 86 C4 B1 03 F3 AA   ?...............
0B2B:0130  32 C0 AA C3 BE 69 9B BF-2F 96 B4 60 CD 21 BE D8   2....i../..`.!..
0B2B:0140  95 BF 2F 96 E8 CB E3 C3-33 C0 89 3E 93 9C A2 96   ../.....3..>....
0B2B:0150  9C A2 97 9C 8A F8 9C 57-33 C9 88 0E C2 9A AC E8   .......W3.......
0B2B:0160  73 E3 75 1D 3C 20 74 F6-3C 09 74 F2 86 06 97 9C   s.u.< t.<.t.....
0B2B:0170  0A C0 74 EA F6 C7 80 74-05 C6 06 C2 9A 01 E9 2D   ..t....t.......-
Тепер введіть R для перевірки стану регістрі і мнемоніки команди.
-R
AX=0148  BX=0290  CX=0290  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2B  ES=0B2B  SS=0B2B  CS=0B2B  IP=0100  NV UP EI PL NZ AC PE NC
0B2B:0100 A10000      MOV  AX,[0000]         DS:0000=0123
Виконаємо цю команду і перевіримо результат:
-T
AX=0123  BX=0290  CX=0290  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2B  ES=0B2B  SS=0B2B  CS=0B2B  IP=0103  NV UP EI PL NZ AC PE NC
0B2B:0103 03060200  ADD AX,[0002]            DS:0002=0025
-T
AX=0148  BX=0290  CX=0290  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2B  ES=0B2B  SS=0B2B  CS=0B2B  IP=0107   NV UP EI PL NZ NA PE NC
0B2B:0107 A30400  MOV [0004],AX                          DS:0004=0000
-T
AX=0148  BX=0290  CX=0290  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2B  ES=0B2B  SS=0B2B  CS=0B2B  IP=010A   NV UP EI PL NZ NA PE NC
0B2B:010A CB            RETF
Отже, після команди Т було виконано команду mov AX,[0000], яка пересилає у регістр АХ вміст слова, яке знаходиться з нулевим зміщенням. Після її виконання регістр АХ містить 0123. Наступна команда ADD виконує додавання вмісту АХ (0123) і даних зі зміщенням 0002 ( 0025, тобто 0148. Команда  mov [0004],AX  переміщує результат додавання у чарунку зі зміщення 0004.
-D DS:004
0B2B:0000              48 01 2A 2A-2A F0 4F 03 78 05 8A 03       H.***.O.x...
0B2B:0010  78 05 17 03 78 05 1D 04-01 01 01 00 02 FF FF FF   x...x...........
0B2B:0020  FF FF FF FF FF FF FF FF-FF FF FF FF 27 05 4E 01   ............'.N.
0B2B:0030  4F 0A 14 00 18 00 2B 0B-FF FF FF FF 00 00 00 00   O.....+.........
0B2B:0040  05 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0B2B:0050  CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20   .!...........
0B2B:0060  20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20   .....
0B2B:0070  20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00   ........
0B2B:0080  00 0D 20 20                                        ..
Машинна адресація
Для доступу до машинної команди процесор визначає її адресу із регістру CS з зміщенням у регістрі ІР. Наприклад, нехай регістр CS містить 04AFh (дійсна адреса 04AF0), а регістр ІР містить 0023h, тоді
	CS:	04AF0
	IP:	 0023
         Адреса команди:	                  04В13
Якщо, наприклад, за адресою 04В13 знаходиться команда
   Адреса 04В13:	А11200	mov AX,[0012]
то у пам’яті за адресою 04В13 знаходиться перший байт команди. Процесор отримує доступ до цього байту і по коду команди (А1) визначає довжину команди ( три байта.
Для доступа до даних зі зміщенням [0012] процесор визначає адресу, виходячи з вмісту регістру DS (як правило) і зміщення в операторі команди. Якщо DS містить 04В1h (реальна адреса 04В10), то результуючиа адреса даних визначається наступним чином:
	DS:	04В10
	 Зміщення:	  0012
              Адреса даних:	04В22
Якщо, наприклад, за адресою 04В22 знаходиться число 24, а за 04В23 ( число 01, то процесор вибирає значення 24 і розміщує його у регістр AL, а значення 01 ( у регістр AH. Таким чином, регістр АХ буде мати значення 0124. У процесі вибірки кожного байту команди процесор збільшує значення регістр ІР на одиницю (інкрементує) і до початку виконання наступної команди у вище наведеному прикладі ІР буде містити зміщення 0026. Таким чином, процесор тепер готовий для виконання наступної команди, яку він отримує із адреси, яка знаходиться у регістрі CS (04AF0) зі зміщенням, значення якого знаходиться у регістрі ІР (0026), тобто 04В16.
Парна адресація
Сучасні процесори функціонують більш, оскільки у них у програмі забезпечується доступ до слів, розміщеним по парних адресах. 
Наприклад, нехай команда повинна виконати вибірку слова, яке починається з адреси 04В23 і завантажити його у регістр АХ:
                Пам’ять:	|xx|24|01|xx|
	           |
                            Адреса :	   04В23
Спочатку процесор отримує доступ до байтів за адресою 4В22 та 4В23 і пересилає байт з чарунки 4В23 у регістр AL. Потім він отримує доступ до батів за адресами 4В24 та 4В25 і пересилає байт з чарунки 4В23 у регістр АН. У результаті регістр АХ буде містити 0124. семблер має директиву EVEN, яка викликає вирівнювання даних і команд на парні адреси пам’яті.
Визначення розміру пам’яті
BIOS має у своїй RОM підпрограму, яка здійснює визначення об’єму пам’яті. Можна викликати дану функцію BIOS перериванням 12h, в результаті чого BIOS поверне у регістр АХ розмір пам’яті у Кбайтах.
E CS:100 CD 12 CB
Резільтат виконання підпрограми BIOS:
-Т
AX=0280  BX=0000  CX=0000  DX=0000  SP=FFB4  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=0210  IP=09AA   NV UP DI PL NZ NA PE NC
0210:09AA C4C4          LES     AX,SP
-T
AX=0280  BX=0000  CX=0000  DX=0000  SP=FFB4  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=0210  IP=064C   NV UP DI PL NZ NA PE NC
0210:064C 1E            PUSH    DS
-T
AX=0280  BX=0000  CX=0000  DX=0000  SP=FFB2  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=0210  IP=064D   NV UP DI PL NZ NA PE NC
0210:064D 50            PUSH    AX
-T
AX=0280  BX=0000  CX=0000  DX=0000  SP=FFB0  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=0210  IP=064E   NV UP DI PL NZ NA PE NC
0210:064E B84000        MOV     AX,0040
-T
AX=0040  BX=0000  CX=0000  DX=0000  SP=FFB0  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=0210  IP=0651   NV UP DI PL NZ NA PE NC
0210:0651 8ED8          MOV     DS,AX
-T
AX=0040  BX=0000  CX=0000  DX=0000  SP=FFB0  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=0210  IP=0653   NV UP DI PL NZ NA PE NC
0210:0653 F70614030024  TEST    WORD PTR [0314],2400               DS:0314=3000
-T
AX=0040  BX=0000  CX=0000  DX=0000  SP=FFB0  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=0210  IP=0659   NV UP DI PL NZ NA PE NC
0210:0659 754F          JNZ     06AA
-T
AX=0040  BX=0000  CX=0000  DX=0000  SP=FFB0  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=0210  IP=06AA   NV UP DI PL NZ NA PE NC
0210:06AA 58            POP     AX
-T
AX=0280  BX=0000  CX=0000  DX=0000  SP=FFB2  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=0210  IP=06AB   NV UP DI PL NZ NA PE NC
0210:06AB 1F            POP     DS
-T
AX=0280  BX=0000  CX=0000  DX=0000  SP=FFB4  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=0210  IP=06AC   NV UP DI PL NZ NA PE NC
0210:06AC CF            IRET
-T
AX=0280  BX=0000  CX=0000  DX=0000  SP=FFBA  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=0105  IP=0102   NV UP DI PL NZ NA PE NC
0105:0102 CB            RETF
-T
AX=0280  BX=0000  CX=0000  DX=0000  SP=FFBE  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=3002  IP=0210   NV UP DI PL NZ NA PE NC
3002:0210 0000          ADD     [BX+SI],AL                         DS:0000=F8
Як видно, регістр АХ містить розмір пам’яті у шістнадцятковому форматі. Для вихода із підпрограми BIOS і повернення у програму використовується команда IRET.
Спеціальні засоби відлагоджувача
Команда А (Assembler) переводить Debug у режим прийому команд ассемблера і перетворення їх у машинні коди. Наприклад,
-A 100
3002:0100 MOV AL,25
3002:0102 MOV BL,32
3002:0104 ADD AL,BL
3002:0106 RET
Після натискання <Enter> без команди у рядку Debug припиняє прийом команд. Покроково виконаємо введену програму для перевірки
-T
AX=0225  BX=0032  CX=0000  DX=0000  SP=FFC0  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=3002  IP=0102   NV UP DI PL NZ NA PO NC
3002:0102 B332          MOV     BL,32
-T
AX=0225  BX=0032  CX=0000  DX=0000  SP=FFC0  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=3002  IP=0104   NV UP DI PL NZ NA PO NC
3002:0104 00D8          ADD     AL,BL
-T
AX=0257  BX=0032  CX=0000  DX=0000  SP=FFC0  BP=0000  SI=0000  DI=0000
DS=0040  ES=0B2B  SS=0B2B  CS=3002  IP=0106   NV UP DI PL NZ NA PO NC
3002:0106 C3            RET
Команда U (Unassembler) виводить на екран машинні коди команд ассемблера.  Необхідно задати адреси першої і останньої команди, які необхідно переглянути. Перевіримо код програми, яку ввели за допомогою команд А.
-U 100,106
3002:0100 B025          MOV     AL,25
3002:0102 B332          MOV     BL,32
3002:0104 00D8          ADD     AL,BL
3002:0106 C3            RET
Збереження програми із відлагоджувача
Можна використовувати Debug для збереження програм на диск. Для цього використовується команда W. Для цього необхідно виконати наступні дії:
присвоїти програмі ім’я: N Name.com;
за допомогою команди R  у регістр СХ записати довжину файлу (у нашому прикладі 106 – 100 = 6 байт).
дати Debug команду запису файлу – W.
Для прикладу, збережемо введену раніше програмку:
-N dorensky.com
-R CX
CX 0000
:6
-W
Запись 00006 байт
Якщо ж програму було завантажено з диску  та необхідно зберегти зроблені у ній зміни, то треба дати Debug тільки команду W. Наприклад, зробимо зміни у програмі KNTU.com і збережемо їх:
-U 100,106
0B2B:0100 B025          MOV     AL,25
0B2B:0102 B332          MOV     BL,32
0B2B:0104 00D8          ADD     AL,BL
0B2B:0106 C3            RET
-A 102
0B2B:0102 	 MOV BL,10
0B2B:0104
-U 100,106
0B2B:0100 B025          MOV     AL,25
0B2B:0102 B310          MOV     BL,10
0B2B:0104 00D8          ADD     AL,BL
0B2B:0106 C3            RET
-W
Запись 00006 байт
ЗАВДАННЯ
Розробити блок-схему алгоритма і програму, яка виводить на екран ПК:
Тип персонального комп’ютера IBM PC (див. табл. 1.2);
Дату виготовлення BIOS у повному форматі прописом “число місяць рік” (наприклад, “01 лютого 2013 року”);
Результати роботи програм 1.1-1.2  перевірити за допомогою дебагера (debbug.exe).
ПИТАННЯ ДЛЯ САМОКОНТРОЛЮ
Поясніть суть і призначення BIOS.
Що таке переривання? Які є види переривань?
Що таке вектор переривань, таблиця векторів переривань? Для чого вони служать і де знаходяться?
За допомогою яких стандартних функцій ТС можна звертатись до портів в/в?
Чим чарунка пам’яті відрізняється від порту?
Що таке дебагер? Де знаходиться дебагер у ОС Windows?
Основні команди дебагера, їх формати і призначення.
Що таке “сегмент” та “зміщення” і для чого вони використовуються?
Якими стандартними функціями ТС можна звернутись до чарунки пам’яті (R/W)?
За допомогою  якої стандартної функції ТС можна згенерувати задане переривання?
ПРИКЛАД ВИКОНАННЯ ЛАБОРАТОРНОЇ РОБОТИ №1
МЕТА:	Ознайомитись з основами системного програмування, навчитись програмним шля-хом одержувати інформацію про системні характеристики комп’ютера IBM PC АТ.
ЗАВДАННЯ
Написати програму, яка визначає, чи даний ПК відноситься до типу IBM PC АТ.
Написати програму, яка виводить на екран дату виготовлення BIOS.
Перевірити результати виконання програм 1 та 2 за допомогою дебагера.
ВИКОНАННЯ
1. Як відомо, існує багато моделей ПК. Є дві можливості визначення моделі  та отримання деякої інформації про конфігурацію комп’ютера: 1) Прочитати дану інформацію з чарунок ПЗП BIOS; 2) Викликати одну з функцій переривання 15h, яка повертає адресу таблиці конфігурації. У постійній пам’яті BIOS за адресою F000:FFFE міститься байт, значення якого є ідентифікацією типу комп’ютер. Прочитати цю чарунку пам’яті можна за допомогою функції ТС peekb(). Якщо її значення FCh – ПК типу АТ.
Блок-схема алгоритму
Лістинг програми
#include <stdio.h>
#include <conio.h>
int main (void)
{
	unsigned char KOD;
	KOD = peekb(0xF000,0xFFFE);
	if (KOD == 0xFC)
		printf("Даний ПК має тип АТ.\n");
	else
		printf("Даний ПК не типу АТ.\n");
	return 0;
}
Результат роботи програми:
Даний ПК має тип АТ.
2. За адресою F000:FFF5 ПЗП BIOS міститься дата виготовлення BIOS. Вона записана у коді ASCII та займає 8 байт. Її формат американський:  MM/DD/YY.
Блок-схема алгоритму
Лістинг програми
#include <stdio.h>
#include <conio.h>
int main (void)
{
	unsigned char DATA;
	int i;
	printf