Смекни!
smekni.com

Узгодження різномовних модулів (стр. 4 из 5)


3.6 Стислий опис відладчика Debug

У цій першій вправі для перегляду вмісту комірок пам'яті використовується програма DOS DEBUG. Для запуску цієї програми введіть DEBUG і натисніть Enter, у результаті програма DEBUG повинна завантажиться з диска в пам'ять. Після закінчення завантаження на екрані з'явиться запрошення у вигляді дефіса, що свідчить про готовність програми DEBUG для прийому команд.

Розглянемо використання відладчика DEBUG для безпосереднього введення програм в пам'ять й трасування їхнього виконання.

Машинні команди мають різну довжину: один, два або три байти. Машинні команди перебувають у пам'яті безпосередньо один за одним. Виконання програми починається з першої команди й далі послідовно виконуються інші.

Можна ввести програму безпосередньо в пам'ять машини й виконати її покомандно. У той же час можна переглядати вміст регістрів після виконання кожної команди. Після завантаження DEBUG на екрані з'явиться запрошення до введення команд у вигляді дефіса.

Для безпосереднього введення програми машинною мовою введіть наступну команду, включаючи пробіли:

E CS:100 B8 23 01 05 25 00 (натисніть Enter)

Команда E позначає Enter (введення). CS:100 визначає адреси пам'яті, куди будуть вводитися команди, - тичина.100 (256) байт від початку сегмента кодів. (Звичайна стартова адреса для машинних кодів в відладчику DEBUG).

Команда E записує кожну пару шістнадцяткових цифр в пам'ять у вигляді байта, починаючи з адреси CS:100 до адреси CS:105.

Наступна команда Enter:


E CS:106 8B D8 03 D8 8B CB (Enter)

вводить шість байтів в осередки, починаючи з адреси CS:106 і далі в 107, 108, 109, 10A й 10B. Остання команда Enter:

E CS:10C 2B C8 2B C0 90 CB (Enter)

уводить шість байтів, починаючи з CS:10C в 10D, 10E, 10F, 110 й 111.

Перевірте правильність введення значень. У випадку, якщо є помилки, то варто повторити команди, які були введені неправильно.

Тепер залишилося найпростіше - виконати ці команди.

Введіть команду R для перегляду вмісту регістрів і прапорів. У цей момент відладчик покаже вміст регістрів у шічтнадцятковому форматі, наприклад, AX=0000, BX=0000,...

Вміст регістра IP (покажчик команд) виводиться у вигляді IP=0100, показуючи що виконувана команда перебуває на зсуві 100 байт від початку сегмента кодів. Регістр прапорів показує наступні значення прапорів:

NV UP DI PL NZ NA PO NC

Дані значення відповідають:

1. NV — немає переповнення

2. UP — правий напрямок

3. DI — переривання заборонені

4. PL — знак плюс

5. NZ — не нуль

6. NA — немає зовнішнього переносу

7. PO — контроль на чесність

8. NC — немає переносу.

Команда R показує також по зсуві 0100 першу виконувану машинну команду.

MOV AX,0123 — асемблерний мнемонічний код, що відповідає введеній машинній команді. Це є результат операції дизасемблювання, що забезпечує відладчик для більш простого розуміння машинних команд. Розглянута в цьому випадку команда позначає пересилання безпосереднього значення в регістр AX.

У цей момент команда MOV ще не виконана. Для її виконання натисніть клавішу T (для трасування) і клавішу Enter. У результаті команда MOV буде виконана й відладчик видасть на екран вміст регістрів, прапори, а також наступну на черзі команду. Помітимо, що регістр AX тепер містить 0123. Машинна команда пересилання в регістр AX має код B8 і за цим кодом треба безпосередні дані 2301. У ході виконання команда B8 пересилає значення 23 у молодшу частину регістра AX, тобто, однобайтовый регістр AL, а значення 01 — у старшу частину регістра AX, тобто, у регістр AH:

AX: | 01 | 23 |

Вміст регістра IP:0103 показує адреси наступної виконуваної команди в сегменті кодів:

13C6:0103 052500 ADD AX,0025

Для виконання даної команди знову введіть T. Команда додасть 25 до молодшої (AL) частини регістра AX й 00 до старшої (AH) частини регістра AX, тобто, додасть 0025 до регістра AX. Тепер регістр AX містить 0148, а регістр IP 0106 — адресу наступної команди для виконання.

Введіть знову команду T. Наступна машинна команда пересилає вміст регістра AX у регістр BX і після її виконання в регістрі BX буде втримуватися значення 0148. Регістр AX зберігає колишнє значення 0148, оскільки команда MOV тільки копіює дані з одного місця в інше. Тепер введіть команду T для покрокового виконання кожної команди, що залишилася в програмі. Наступна команда додасть вміст регістра AX до вмісту регістра BX, в останньому одержимо 0290. Потім програма скопіює вміст pегистра BX в CX, відніме AX з CX, і відніме AX з нього самого. Після цієї останньої команди, прапор нуля змінить свій стан c NZ (не нуль) на ZR (нуль), тому що результатом цієї команди є нуль (вирахування AX із самого себе очищає цей регістр в 0).

Можна ввести T для виконання останніх команд NOP й RET, але це ми зробимо пізніше. Для перегляду програми в машинних кодах у сегменті кодів уведіть D для дампа:

D CS:100

У результаті відладчик видасть на кожен рядок екрана по 16 байт даних у шістнадцятковому поданні (32 шіст. цифри) і в символьному поданні в коді ASCII (один символ на кожну пару шіст. цифр). Подання машинного коду в символах ASCII не має змісту й може бути ігноровано.

Перший рядок дампа починається з 00 і представляє вміст осередків від CS:100 до CS:10F. Другий рядок представляє вміст осередків від CS:110 до CS:11F. Незважаючи на те, що ваша програма закінчується за адресою CS:111, команда Dump автоматично видасть на восьми рядках екрана дамп із адреси CS:100 до адреси CS:170.

При необхідності повторити виконання цих команд скиньте вміст регістра IP і повторіть трасування знову. Введіть R IP, введіть 100, а потім необхідне число команд T. Після кожної команди натискайте клавішу Enter.

Для завершення роботи із програмою DEBUG введіть Q (Quit — вихід). У результаті відбудеться повернення в DOS і на екрані з'явиться запрошення A> або C>. У випадку, якщо друкувався протокол роботи з відладчиком, то для припинення знову натисніть Ctrl/PrtSc.

Спеціальні засоби відладчика

В операційній системі DOS можна використати DEBUG для введення команд Асемблера так само, як і команд машинної мови. На практиці можна користуватися обома методами.

Команда A

Команда відладчика A (Assemble) переводить DEBUG у режим прийому команд Асемблера й перекладу їх у машинні коди.

Команда U

Команда відладчика U (Unassemble) показує машинні коди для команд Асемблера. Необхідно повідомити відладчику адреси першої й останньої команди, які необхідно переглянути

Введення програми звичайно використовується мовою Асемблера, коли машинний код невідомий, а введення в машинному коді - для зміни програми під час виконання. Однак у дійсності програма DEBUG призначена для налагодження програм.

Збереження програми з відладчика

Можна використати DEBUG для збереження програм на диску в наступних випадках:

1. Після завантаження програми в пам'ять машини і її модифікації необхідно зберегти змінений варіант. Для цього треба:

а. завантажити програму по її імені: DEBUG n:ім'я файлу [Enter]

б. переглянути програму за допомогою команди D й увести зміни по команді E

в. записати змінену програму: W [Enter]

2. Необхідно за допомогою DEBUG написати невелику по обсягу програму й зберегти її на диску. Для цього треба:

а. викликати відладчик DEBUG

б. за допомогою команд A (assemble) і E (enter) написати програму

в. привласнити програмі ім'я: N ім'я файлу.COM [Enter].

Тип програми повинен бути COM - тому що тільки програміст знає, де дійсно кінчається його програма, указати відладчику довжину програми в байтах.

1. запросити регістр CX командою: R CX [Enter] - відладчик видасть на цей запит CX 0000 (нульове значення)

2. указати довжину програми - 6

3. записати змінену програму: W [Enter]

В обох випадках DEBUG видає повідомлення "Writing nnnn bytes" (Запис nnnn байтів). У випадку, якщо nnnn дорівнює 0, то відбулася помилка при уведенні довжини програми, і необхідно повторити запис знову.

Відладчик DOS DEBUG цей засіб, корисний для налагодження асемблерних програм. Однак варто бути обережним з її використанням, особливо для команди E (уведення). Уведення даних у неправильні адреси пам'яті або уведення некоректних даних можуть привести до непередбачених результатів.

На екрані в цьому випадку можуть з'явитися "дивні" символи, клавіатура заблокована або навіть DOS перерве DEBUG і перезавантажить себе з диска. Які-небудь серйозні ушкодження навряд чи відбудуться, але можливі деякі несподіванки, а також втрата даних, які вводилися при роботі з відладчиком.

У випадку, якщо дані, уведені в сегмент даних або сегмент кодів, виявилися некоректними, треба, знову використовуючи команду E, виправити їх. Однак, можна не помітити помилки й почати трасування програми. Але й тут можливо ще використати команду E для змін. У випадку, якщо необхідно почати виконання з першої команди, то варто встановити в регістрі командного покажчика (IP) значення 0100.

Введіть команду R (register) і необхідний регістр у наступному виді:

R IP [Enter]

Відладчика видасть на екран вміст регістра IP і перейде в очікування введення. Тут варто ввести значення 0100 і нажати для перевірки результату команду R (без IP). Відладчик видасть уміст регістрів, прапорів і першу виконувану команду. Тепер можна, використовуючи команду T, знову виконати трасування програми.

У випадку, якщо ваша програма виконує які-небудь підрахунки, то можливо буде потрібно очищення деяких областей пам'яті й регістрів. Але впевніться у збереженні вмісту регістрів CS, DS, SP й SS, які мають специфічне призначення


ВИСНОВКИ

При виконанні курсового проекту я навчився розробляти й узгоджувати між собою різномовні модулі, а також закріпив свої вміння з програмування мовами Turbo Pascal та Асемблера. В курсовому проекті написання модулів проводилося на мові Turbo Pascal та мові Асемблера. Введення даних та перевірка відповідності їх діапазону реалізувалася мовою Turbo Pascal, а процедура обчислення виразу – мовою Асемблера. Для розробки модулів програми я використовував середовище Turbo Pascal 7.0 фірми Borland. Асемблер є убудованим у середовище Turbo Pascal 7.0. Розробка різномовних модулів буде здійснюватися на ПК, що працює під керівництвом ОС Windows XP SP2.