Работа с отладчиком Turbo Debugger (TD)
Tasm умеет ассемблировать синтаксически правильные программы, но не понимает, что, собственно, эта программа делает. Часто программа работает не так, как, по вашему мнению, должна была бы работать. В такой ситуации может помочь TD -программа, разработанная для поиска и исправления логических ошибок [5, 6, 12, 14]. Подобно всем отладчикам TD может работать в режиме супервизора, беря на себя управление программой в режиме пошагового исполнения, кода программы. Можно при этом изменять значения операндов в памяти, а также значения регистров и флагов. TD используется и в качестве учителя при изучении форматов машинных команд процессора в различных режимах адресации операндов. Чтобы показать, как использовать TD при изучении языка ассемблера, исследуем программу Hello под управлением отладчика. Произведём заново ассемблирование и компоновку программы с опциями, которые добавляют отладочную информацию в obj - и exe -файлы: tasm/zi hello.asm tlink/v hello.obj td hello.exe После выполнения последней команды на экране увидите окно Module с исходным текстом программы Hello.asm. Это окно номер 1. Просмотреть программу можно, используя клавиши управления курсором, передвигая его вверх и вниз по тексту. Для получения другого представления программы войдите в меню Viev [обзор], выберите команду Cpu и нажмите < F5 > для распахивания окна на весь экран. В Cpu- окне, состоящем из пяти областей, содержится в сокращённом виде исходный текст вашей программы, действительные машинные коды, находящиеся в памяти, значения регистров и флагов, стек и дамп байтов памяти. Для передвижения курсора из одной области в другую нажимайте клавишу < Tab >. Область окна Cpu, в которой находится курсор, считается активной. Нажатие клавиши < Alt+F10 > вызывает появление локального меню для активной секции окна Cpu. Перейдите в главную область окна Cpu и нажмите < Alt+F10 >. Выберите команду Mixed (смесь), которая имеет три установки: No, Yes и Both. Режим Both ( оба) устанавливается по умолчанию и является наилучшим способом просмотра, показывая в левой колонке байты машинного кода, а в правой – строки исходного текста программы. Окно Cpu используется для наблюдения за текущим состоянием процессора при пошаговом выполнении инструкций программы. Маленькая стрелка-треугольник слева от первой команды mov ax, @data показывает, что она является следующей исполняемой командой. Для выполнения этой команды нажмите < F8 >, стрелка перейдёт на следующую команду с изменённым значением регистра ax в окне регистров. Снова нажмите < F8 >, для выполнения инструкции mov ds, ax. Обратите внимание, что значение в регистре ds стало таким же, как и в регистре ax, но произошло изменение сегментации дампа памяти (левая нижняя область) с регистра ds на регистр es. Сделайте активной область с дампом памяти, нажмите < Alt+F10 > и в появившемся локальном меню выберите команду Goto (переход). Появится заставка, в которой наберите ds: 0000 и нажмите < Enter >. Теперь дамп памяти будет соответствовать массиву инициализированных данных вашей программы при их побайтовом представлении (ASCII -код символов переменной Promt, Good Morning и Good Afternoon). Для просмотра всего дампа используйте передвижение курсора с помощью стандартных клавиш. Объяснение этому факту следует из особенностей загрузки операционной системой MS-DOS в память программ с расширением exe (рис. 1.2). Чтобы лучше разобраться с представлением переменной Promt в дампе памяти, войдите в меню Data (данные), выберите команду Inspect (проверка). В появившейся заставке наберите Promt и нажмите < Enter >. Раздвиньте с помощью мыши появившееся окно Inspecting Promt по вертикали на всю высоту экрана в правой его части. В левой колонке данного окна указывается номер элемента переменной массива Promt[i], а в правой – значение ASCII -кода этого элемента. Найдите эти коды в дампе памяти, а именно: ds: 0000 exCode=00h ds: 0001 Promt[0]='Э'=9Dh ds: 0002 Promt[1]='т'=E2h ds: 0003 Promt[2]='о'=AEh и т. д. Продолжим покомандное исполнение программы с помощью клавиши < F8 >, предварительно закрыв окно Inspecting Promt, щёлкнув мышью по кнопке закрытия. После выполнения каждой команды наблюдаем за изменением значений регистров. Описанный выше процесс выполнения программы прерывается после исполнения команды прерывания DOS (Int 21, функция ah = 1) по вводу символа с клавиатуры на экран. TD переводит вас с окна Cpu в окно пользователя User Screen, в котором появляется сообщение-запрос переменной Promt. Ответив на этот запрос (прописной или строчной буквой: Y или y), вы автоматически снова перейдёте в окно Cpu, для дальнейшего покомандного выполнения программы. Переход, при необходимости, к окну пользователя от TD и обратно можно осуществить нажатием клавиш < Alt+F5 >. Если вы забыли это сочетание клавиш, то обратитесь к меню управления окнами Window, найдите строку User Screen с уже упомянутыми клавишами. Кстати, ниже этой строки будет приведён список всех открытых вами окон TD, а именно: Module Hello (1) CPU (2) Inspector (3) Вы можете вызвать любое открытое вами окно с помощью нажатия клавиш < Alt+ номер окна > или путём их последовательного перебора с помощью клавиши < F6-Next >. Если вы хотите закрепить данное расположение окон при следующей работе с TD, то войдите в меню Options (параметры), выберите кнопку с командой Layot (схема окон). Данная схема будет зафиксирована утилитой Tdconfig.dt. Раз уж мы находимся в меню Options, укажем здесь ещё на одну полезную команду Display options (вывести параметры). Всплывающая заставка Display swapping (переключение экрана) позволяет выбрать один из трёх способов управления переключением между экраном TD и экраном пользователя. По умолчанию устанавливается параметр Smart (эффективный), который позволяет переключиться на экран пользователя User Screen автоматически по требованию программы (это мы наблюдали только что при выполнении требования программы Hello операции ввода одиночного символа). Вернёмся снова в окно Cpu для завершения работы с программой Hello. Используя клавишу < F8 >, доводим маркер исполнения текущей команды до команды с меткой Exit (вызов функции DOS с номером 4Сh для выхода из программы) и, нажав < Alt+F5 >, увидим на экране пользователя ответ программы на наш диалог с ней. Если вы хотите повторить выполнение программы, то она может быть перезагружена с произвольной команды с помощью нажатия клавиш < Ctrl+F2 > или командой меню Run = Program Reset (сброс программы). При этом программа снова загружается с диска и TD восстанавливает свои исходные опции. Если вы находитесь в окне Cpu или Module, то на дисплее не будет показан возврат к началу вашей программы – для этого надо нажать < F8 >. Завершая краткое описание работы с отладчиком TD, перечислим здесь возможные режимы исполнения программы в TD. · Режим автоматического исполнения, клавиша F9 (Run). · Выполнение по шагам (клавиши F8 или F7-Trace into). Отличие в назначении этих клавиш проявляется в том, что клавиша F7 используется для пошагового исполнения тела цикла, процедуры или подпрограммы обработки прерывания. Клавиша же F8 исполняет эти процедуры как одну обычную команду и передаёт управление следующей команде программы. · Выполнение до текущего положения курсора. Для активизации этого режима необходимо установить курсор на нужную строку программы (строка будет подсвечиваться другим цветом) и нажать клавишу F4. · Выполнение с установленными точками прерывания (Breakpoints). Перед исполнением программы необходимо установить эти точки, для чего следует перейти в нужную строку программы и нажать клавишу F2 (toggle). Выбранная строка с контрольной точкой подсвечивается красным цветом. Чтобы убрать контрольную точку, надо повторить эту операцию снова. После установки точек прерывания программа запускается на исполнение клавишей F9. После первого нажатия клавиши F9 программа остановится на первой точке прерывания, после второго – на второй точке и.т.д. Это очень удобный режим отладки программы, когда необходимо контролировать правильность её исполнения в некоторых характерных точках. Завершать работу с отладчиком следует командой File = Quit или с помощью клавиш < Alt+X >. TD имеет множество других возможностей, изучить которые вам предлагается самостоятельно при исследовании демонстрационных программ, приведённых в приложении П.1.2 к данной работе.
|