Використання системного програмування в реальному режимі роботи центрального процесора для визначення конфігурації ПК IBM PC.

Інформація про навчальний заклад

ВУЗ:
Донецький національний технічний університет
Інститут:
О
Факультет:
КН
Кафедра:
Не вказано

Інформація про роботу

Рік:
2011
Тип роботи:
Лабораторна робота
Предмет:
Архітектура комп’ютерів та комп’ютерних систем

Частина тексту файла (без зображень, графіків і формул):

Розробили: проф. Сидоренко В.В., викл. Дóренський О.П., 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
Антиботан аватар за замовчуванням

14.05.2018 21:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!