MS-DOS и TASM 2.0. Часть 11. Turbo Debugger.

Отладчик ассемблера Turbo Debugger.

Отладчик ассемблера Turbo Debugger.

Применим усвоенные понятия на практике — прогоним нашу крохотную программу prg.com через отладчик ассемблера Turbo Debugger  (TD). Именноо TD мы будем использовать в изучении 16 битного ассемблера. Для 32 и 64 битного программирования имеется свое програмное обеспечение. Вместе с тем, для своих целей Turbo Debugger очень хорош. Работать с программой просто и понятно — ничего лишнего — то, что нужно для начинающих.

Запускаем отладчик Turbo Debugger (D:\UTILS\TD.EXE) и открываем нашу простейшую программу «Hello World!» D\WORK\PRGCOM\PRG.COM. Если не видит файл в директории, поменяйте перечень отображаемых файлов с *.exe на *.* . Для удобства работы жмём F5 — увеличиваем размер основного окна. Мы видим основные окна отладчика:

  • Окно кода.
  • Окно данных.
  • Окно регистров.
  • Окно стека.
  • Окно флагов.

Отладчик ассемблера Turbo Debugger достаточно прост. Тем не менее, он обладает особенностями, свойственными всем отладчикам.

Отладчик позволяет нам просмотреть исполнение нашей программы пошагово. В Turbo Debugger есть функция пошагового выполнения программы с паузой:
Основное меню ->Run->Animate. При нажатии вам предложат выставить паузу между шагами в 0,1 секунды и цикл будет проходить до нажатия Esc либо до
завершения программы.

Основы ассемблерного отладчика.

Чтобы освоить отладчик ассемблера TD, достаточно запомнить горячие клавиши основных команд, которые являются ядром всех, даже самых сложных отладчиков:

  • Run F9 — запуск программы. Программа будет выполняться до точки останова, до завершения работы или пока не будет прервана пользователем.
  • Breakpoint (Break) F2 — точка останова или «бряк» в простонародье.
  • Trace Into (Trace) F7 — выполнять пошагово программу, заходя в циклы и процедуры (функции).
  • Step Over (Step) F8 — выполнять пошагово программу, пропуская в циклы и процедуры (функции).

Теперь пройдёмся по нашему незамысловатому коду, наблюдая за поведением отладчика ассемблера.

Анализируем Hellow, World! с помощью ассемблерного отладчика.

1. Программа начинает выполняться с адреса CS:100. Это заданное нами начальное значение смещения программы типа «*.COM» в памяти — 100h:
org 100h.
2. По адресу в памяти CS:100 у нас расположен машинный код (в цифровом шестнадцатеричном виде, как его видит машина — B409). Этот код отладчик преобразует в более понятную для нас ассемблерную форму:
mov ah,9

Отладчик TD - преобразование машинного кода.
Машинный код B409 преобразуется в mov ah,9 .

3. Жмём F8 (или F7 пока для нас это не важно). Процессор сделал один шаг — и в регистре указателя команд появился адрес следующей команды, которую будет выполнять процессор:
IP 0102
Курсор переместился на эту строку:
mov dx,0108
Машинный код — BA0801, наш код — mov dx,offset message. Необходимо отметить, что в dx загружается адрес строки байт, определённая в коде:
message db «Hello World!»,0Dh,0Ah,’$’ ; строка для вывода.
Мы уже понимаем, что 0108 — это смещение, указывающее на строку символов. Перемещаемся с помощью нажатия клавиши TAB или при помощи курсора мыши в окно данных и клавишей «вниз» клавиатуры или с помощью курсора перемещаемся к смещению 108. По данному адресу находится наша текстовая строка!

Отладчик ассемблера TD не различает данные и код.
Turbo Debugger дизассемблирует данные как код.

4. Директивой .model tiny мы определили модель памяти для нашей программы как СОМ. В ней (в отличие от EXE) сегменты кода, данных и стека объединены.
То есть:
CS=DS=SS=ES
Проверяем это. Смотрим на данные сегментных регистров — CS=DS=SS=ES = 4CEA — здорово!

Отладчик ассемблера TD - программа типа *.com .
Программа типа «*.com» : CS=DS=SS=ES .

Так как все сегменты владеют одной памятью, то одни и те же её кусочки должны иметь одинаковые значения (CD 20 FF 9F).

Отладчик ассеблера для DOS.
Значение по одному и тому же адресу в памяти естественно совпадает.

Посмотрим, что у нас по смещению 100h (начальное значение смещения программы типа «*.COM» в памяти). Везде значение B409 (байты перевернуты младшему байту — младшее смещение, но стеком воспринимается как слово кода, поэтому 09B4).
5. Именованный указатель на нашу строку символов «message»:
mov dx,offset message ; адрес строки — в DX
…..
message db «Hello World!»,0Dh,0Ah,’$’ ; строка для вывода

получил свое естественное цифровое отображение (по смещению 108):
CS:0102 BA0801 mov dx,0108
…..
DS:0108 48 65 6C 6C 6F 20 57 6F Hello Wo
DS:0110 72 6C 64 21 0D 0A 24 00 rld!

Необходимый софт качаем по ссылке: DOS-1.rar.

Добавить комментарий