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.