ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
Часть 15 Глава 12. Отладка на уровне Ассемблера Данная глава предназначена для программистов, которые знакомы с программированием на Ассемблере для процессоров серии 80х86. Примечание: Вам не обязательно использовать при отладке программы возможности, которые здесь описаны, но при возникновении определенных проблем они будут более быстро и просто устранены, если использовать описанные в данной главе методы. Мы поясним, в каких случаях желательно использовать отладку на уровне Ассемблера. Затем мы опишем окно центрального процессора (CPU) со встроенным Дизассемблером и Ассемблером. Вы узнаете, как можно с помощью данного окна проверять и модифицировать байты данных непосредственно в шестнадцатиричном виде, как анализировать стек вызова функций, как проверять и модифицировать регистры центрального процессора (ЦП) и его флаги. Когда недостаточно отладки на уровне исходного кода В большинстве случаев при отладке программы вы ссылаетесь на код и данные программы на уровне исходного кода, обращаясь к именам идентификаторов точно так, как они набраны в исходном коде, и "проходите" программу, выполняя участки исходного кода. Однако иногда лучше рассмотреть проблему "изнутри", анализируя те инструкции. которые генерирует компилятор, содержимое регистров ЦП и его стека. Чтобы сделать это, вы должны быть знакомы как с процессором серии 80х86, так и с компилятором, который превр ащает ваш код в машинные инструкции. Поскольку функционированию ЦП посвящено много превосходных книг, мы не собираемся рассказывать здесь об этом подробно. Мы только кратко расскажем о том, как компилятор превращает исходный код в машинные инструкции, ра ссмотрев инструкции, генерируемые каждой строкой исходного кода. Паскаль позволяет вам записывать строки исходного кода, которые выполняют несколько действий сразу. Поскольку отладчик TDW позволяет выполнять программу по одной строке исходного кода, а не по одному выражению Паскаля, вам иногда будет желательно знать р езультат выполнения части строки исходного кода. Выполняя всю программу по одной машинной инструкции, вы сможете проверить промужеточные результаты (хотя потребуются некоторые усилия, чтобы понять, как компилятор транслирует исходные операторы в машинный код). Окно CPU В окне CPU (ЦП) показано все состояние центрального процессора. С его помощью вы можете проверять и изменять биты и байты, составляющие код и данные программы. В окне Code (Код) для временной коррекции своей программы вы можете использовать встроенный Ас семблер. При этом инструкции вводятся точно также, как при наборе исходных операторов Ассемблера. Можно также получить доступ к соответствующим данным любой структуры данных, выводя и изменяя их в различных форматах. Й[ю]НCPU 80286НННННННННННННННННННННННННННННННН3ННН[][]» єTPDEMO.217: Inc(NumLines); ax 0004 іc=0є є cs:04C4:4F36063000 inc word ptr [TPDEMOІ bx 3EEE іz=0є єTPDEMO.121 i := 1; ± cx 0000 іs=0є є cs:04C8 C:43FE0100 word ptr [bp+02].000± dx 5920 іo=0є єTPDEMO.218: while i <= Length(S) do ± si 3CEC іp=0є є cs:04C0 C47ED4 les di,[bp+04] ± bp 3EF4 іa=0є є cs:0400 288A05 mov al,es:[di] ± sp 3EF4 іi=1є є cs:0403 3D84 xor ah,ah ± ds 5920 іd=0є є cs:0405 3B48FE cmp ax,[bp+02] ± es 5920 і є є cs:0408 7D03 jnl TPDEMO.125 (04DD) ± ss 595A і є є cs:040A 898A00 jmp TPDEMO.148 ± cs 548A і є єTPDEMO.219 while (i <= Length(S)) and not ip 04C8 і є єІ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±іДДДДДДДДДДДДДє є ds:0000 00 00 00 00 00 00 00 00 = & ю.і є є ds:0008 5A 5D 5A 5D 5A 5D 00 00 ь$ і ss:3EF2 548Aє є ds:0010 00 00 00 00 00 00 5A 5D І6D·°ц і ss:3EF004C1є є ds:0018 00 00 5A 5D 00 00 00 90 7 Z і ss:3EEE 0246є ИНННННННННННННННННННННННННННННННННННННННННННННННННННННННЅ Рис. 12.1 Окно CPU Окно CPU (ЦП) можно создать, выбрав команду основного меню ViewіCPU (ОбзоріЦентральный процессор). В зависимости от того, что вы просматриваете в текущем окне, окно CPU будет позиционировано на соответствующие код, данные или стек. Это предоставляет удоб ный способ просматривать код, данные или стек (соответствующие текущему положению курсора) "на нижнем уровне". В следующей таблице показано, где будет позиционирован курсор при выборе команды CPU: ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД Текущее окно Область окна CPU Позиционируется на... ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД Окно Stack (Стек) Stack (Стек) Текущие SS:SP Окно Module (Модуль) Code (Код) Текущие SS:SP Окно Action (Действие) Code (Код) Адрес действия Окно Variable (Переменная) Data (*) Адрес элемента Окно Inspector (Проверка) Data Адрес элемента Точка останова (не Адроес точки глобальная) Code (Код) останова * - область кода, если элементом в окне является подпрограммы ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД Окно CPU имеет пять областей. Чтобы переходить из одной области в другую, можно использовать клавиши Tab или Shift-Tab. В верхней левой области (области кода) выводится дизассемблированный код программы, чередующийся со строками исходного текста. Во втор ой области (области регистров) показано содержимое регистров ЦП. Правая область представляет собой область флагов, где выводится состояние восьми флагов ЦП. В нижней левой области (области данных) в непосредственном шестнадцатиричном виде выводится любая выбранная вами область памяти. В нижней правой области (области стека) показано содержимое стека. Стрелка () в области кода показывает текущий адрес программы (CS:IP). В области стека стрелка показывает текущий указатель стека (SS:SP). В области стека можно непосредственно вводить значения. Если в подсвеченной инструкции области кода имеется ссылка на память, то адрес памяти и его текущее содержимое выводятся в верхней строке окна CPU. Это позволяет вам увидеть как операнд инструкции, который указывает на память, так и значение, которое буд ет записано или считано. В области флагов показано значение каждого флага ЦП. Как и во всех других окнах, нажатие клавиш Alt-F10 приводит к выводу локального меню области кода. Если разрешено использова- ние сокращений с клавишей Ctrl, то нажатие клавиши Ctrl с первой буквой нужной команды может использоваться для непосредствен ного доступа к команде. В области кода, данных и стека для смещения начального адреса вывода на 1 байт вверх или вниз можно использовать клавишу Ctrl со стрелками. Если вы хотите просто слегка сместить изображение, это легче, чем использовать команду Goto (Переход). Область кода В этой области по выбранному вами адресу выводятся дизассемблированные инструкции. Локальная команда Mixed (Смесь) позволяет выбрать один из трех способов вывода на экран дизассемблированных инструкций и исходного код (см. далее). В левой части каждой дизассемблированной строки выводится адрес инструкции. Адрес выводится либо в виде шестнадцатиричного значения сегмента и смещения, либо со значением сегмента, замененным именем регистра CS (если значение сегмента совпадает с текущим значение регистра CS). Эта область имеет ширину (которая может переключаться или настраиваться), достаточную для вывода всех образующих инструкцию байт. Дизассемблированная инструкция выводится справа. Дизассемблер В области кода автоматически дизассемблируются и выводятся на экран инструкции вашей программы. Если адрес соответствует глобальному, статическому идентификатору или номеру строки, то (если режим вывода Mixed установлен в значение Yes) перед дизассемблир ованной инструкцией выводится строка. Кроме того, если имеется строка исходного кода, соответствующая адресу идентификатора, то она выводится после идентификатора. Глобальные идентификаторы выводятся просто в виде имени идентификатора. Статические идентификаторы выводятся в виде имени модуля, за которым следует символ # или точка (.) и имя статического идентификатора. Номера строк выводятся в виде имени модуля, за которым следует разделяющий символ # или точка (.) и десятичный номер строки. При выводе непосредственного операнда вы можете определить его размер по числу цифр. Непосредственное байтовое значение состоит из 2 цифр, а непосредственное значение размером в слово - из 4 цифр. Турбо отладчик TDW может распознавать наличие числового сопроцессора 8087, 80287 или 80387 и дизассемблировать соответствующие инструкции с плавающей точкой. Мнемоника инструкции RETF показывает, что это инструкция возврата дальнего типа. Обычная мнемоника RET свидетельствует о ближнем возврате. Там, где это возможно, инструкции JMP и CALL выводятся в символьном виде. Если CS:IP указывают на инструкцию JMP или инструкцию условного перехода, то стрелка (стрелка вверх или вниз), показывающая направление перехода, будет выводиться только в том случ ае, если выполнение инструкции приведет к переходу. Кроме того, адреса памяти, использующиеся в инструкциях MOV, ADD и др., выводятся в виде символьных адресов. Локальное меню области кода Если вы не перешли в область кода, используйте для этого клавиши Tab или Shift-Tab. Затем для вывода локального меню нажмите клавиши Alt-F10. ЪДДДДДДДДДДДДДДї і Goto і Переход і Origin і Начало і Follow і Следующая і Caller і Вызывающая і Previous і Предыдущая і Search і Поиск і View source і Просмотр исходного кода і Mixed Yes і Смешанный іДДДДДДДДДДДДДДі і New cs:ip і Новый CS:IP і Assemble і Ассемблирование і I/O і Ввод-вывод АДДДДДДДДДДДДДДЩ Команда Goto После выбора команды Goto (Переход) вам выводится подсказка для ввода нового адреса, на который вы хотите перейти. Вы можете ввести адрес, выходящий за пределы программы, что позволяет проверить базовую систему ввода-вывода (BIOS), внутренние области DOS и резидентные утилиты. Полное описание ввода адресов содержится в Главе 9. Команда Previous (Предыдущий) восстанавливает область кода в то состояние (позицию), которое она имела до выполнения команды Goto. Команда Origin Команда Origin (Начало) позиционирует вас на текущий адрес программы в соответствии со значениями регистров CS:IP. Команда Previous (Предыдущий) восстанавливает область кода в то состояние (позицию), которое она имела до выполнения команды Origin. Команда Follow Команда Follow (Следующий) позиционирует вас по целевому адресу подсвеченной в данный момент инструкции. Область кода позиционируется заново, чтобы вывести код по адресу, указанному в посвеченной в данный момент инструкции, по которому будет передано упр авление. Для условных переходов адрес показывается в случае выполнения перехода. Эту команду можно использовать с инструкциями CALL, JMP, инструкциями условных переходов (JZ, JNE, LOOP, JCXZ и т.д.) и инструкциями INT. Команда Previous (Предыдущий) восстанавливает область кода в то состояние (позицию), которое она имела до выполнения команды Follow. Команда Caller Команда Caller (Вызывающая программа) позиционирует вас на инструкцию, по которой была вызвана текущая подпрограмма или прерывание. Данная команда будет работать не всегда. Если процедура обработки прерывания или подпрограмма занесла в стек элементы данных, иногда Турбо отладчик TDW не может определить, откуда был выполнен вызов. Команда Previous (Предыдущий) восстанавливает область кода в то состояние (позицию), которое она имела до выполнения команды Caller. Команда Previous Команда Previous (Предыдущий) восстанавливает позицию области кода в соответствии с адресом, который был текущим перед последней командой, явно изменившей его значение. Использование клавиш перемещения (стрелок) или PgUp и PgDn не приводит к запоминанию позиции. При использовании команды Previous позиция окна кода запоминается, поэтому повторное использование этой команды приводит к переключению между двумя адресами (туда и обратно). Команда Search Команда Search (Поиск) позволяет вам вводить инструкцию или список байт, которые вы хотите найти. Вводите инструкцию точно также, как это делается в команде Assemble (Ассемблирование). Будьте внимательны при поиске инструкций. Следует выполнять поиск только тех инструкций, которые не изменяют байт, в которые они ассемблируются, в зависимости от того, где в памяти они ассемблируются. Например, поиск следующих инструкций проблемы не пред ставляет: PUSH DX POP [DI+4] ADD AX,100 а попытка поиска следующих инструкций может привести к непредсказуемым результатам: JE 123 CALL MYFUNC LOOP $-10 Вместо инструкции можно вводить также список байт. Более подробно об этом рассказывается в Главе 9. Команда Mixed Локальная команда Mixed (Смешанный) позволяет выбрать один из трех способов вывода на экран дизассемблированных инструкций и исходного кода: No (Нет) Исходный код не выводится, выводятся только дизассемблрованные инструкции. Yes (Да) Перед первой дизассемблированной инструкцией, соответствующей данной строке, выводится строка исходного кода. Область устанавливается в данный режим, если исходный модуль написан на языке высокого уровня. Both (Оба) Для тех строк, которым соответствует исходный код, дизассемблированные строки заменяются строками исходного текста. В противном случае выводятся дизассемблированные инструкции. Используйте этот режим, когда вы отлаживаете модуль на Ассемблере и хотите видеть строку исходного текста, а не соответствующую дизассемблированную инструкцию. Область устанавливается в данный режим вывода, если текущим модулем является исходный модуль Ассемблера. Команда New CS:IP Команда New CS:IP (Новое значение регистров CS:IP) устанавливает значение счетчика адреса программы (значение регистров CS:IP) в соответствии с текущим (подсвеченным) адресом. При повторном запуске вашей программы выполнение начнется с этого адреса. Это полезно использовать, когда вы хотите пропустить какие-либо участки кода, не выполняя их. Предупреждение: Пользоваться данной командой нужно очень аккуратно. Если вы изменяете значение регистров CS:IP в соотвествии с адресом, где стек имеет состояние, отличное от текущего значения CS:IP, то это почти наверняка приведет к аварийному завершению программы. Не пользуйтесь этой командой, чтобы установить регистры CS:IP в значение адреса, лежащего за пределами программы. Команда Assemble... Команда Assemble... (Ассемблирование) ассемблирует инструкцию, заменяя текущую (подсвеченную) инструкцию. Инструкция, которую требуется ассемблировать, вводится в ответ на подсказку. Более детально это описывается далее в данной главе в разделе "Ассембле р". Данную команду можно вызвать, если просто начать набирать оператор, который вы хотите ассемблировать. Когда вы делаете это, то выводится окно подсказки (так же, как при использовании команды Assemble). Команда I/O Команда I/O (Ввод-вывод) считывает или записывает значение в пространство адресов ввода-вывода ЦП и позволяет вам проверить содержимое регистров ввода-вывода и записать в них значения. При этом выводится меню, показанное ниже: ЪДДДДДДДДДДДДї і In byte і Ввести байт і Out byte і Вывести байт і Read byte і Прочитать байт і Write byte і Записать байт АДДДДДДДДДДДДЩ Команда In Byte Команда In Byte (Ввести байт) считывает байт из адреса ввода-вывода. Вам будет выведена подсказка для ввода адреса ввода-вывода, значение которого вы хотите проверить. Для считывания из адреса ввода-вывода значения размером в слово используйте команду Re ad word (Считать слово). Команда Out Byte Команда Out Byte (Вывести байт) записывает байт по заданному адресу ввода-вывода. Вам будет выведена подсказка для ввода адреса ввода-вывода и значение, которое вы хотите записать. Для записи по адресу ввода-вывода значения размером в слово используйте к оманду Read word (Считать слово). Команда Read Word Команда Read Word (Считать слово) считывает слово из адреса ввода-вывода. Вам будет выведена подсказка для ввода адреса ввода-вывода, значение которого вы хотите проверить. Для считывания из адреса ввода-вывода значения размером в байт используйте команд у Read byte (Считать байт). Команда Write Word Команда Write Word (Записать слово) записывает слово по адресу ввода-вывода. Вам будет выведена подсказка для ввода адреса ввода-вывода и значения, которое вы хотите записать. Для считывания из адреса ввода-вывода значения размером в байт используйте ком анду Write byte (Считать байт). Обращаться к пространству адресов ввода-вывода, где находятся такие контроллеры периферийных устройств, как контроллер диска, платы последовательных портов и видеоадаптеры, можно с помощью инструкций Ассемблера IN и OUT. Предупреждение: Будьте внимательны при использовании данных команд. В некоторых портах ввода-вывода считывание из порта рассматривается, как значительное событие, приводящее к тому, что устройство выполняет некоторые действия, такие, как переустановка би та состояния или загрузка в порт нового байта. При неограниченном использовании данных команд вы можете нарушить нормальную работу отлаживаемой программы или устройства. Область регистров и флагов В области регистров (верхняя область справа от области кода) выводится содержимое регистров центрального процессора. Верхней правой областью является область флагов, где показано содержимое восьми флагов центрального процессора. Различные флаги и то, как они выводятся в области флагов, показан в следующей таблице: ЪДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДї іБуква в области і Название флага і ГДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДґ і c і Флаг переноса і і z і Флаг нуля і і s і Флаг знака і і o і Флаг переполнения і і p і Флаг четности і і a і Флаг дополнительногоі і і переноса і і i і Флаг разрешения і і і прерывания і і d і флаг направления і АДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДЩ Локальное меню области регистров Для вывода локального меню области регистров нажмите клавиши Alt-F10. Если разрешено использование сокращений с клавишей Ctrl, то нажатие клавиши Ctrl с первой буквой нужной команды может использоваться для непосредственного доступа к команде. ЪДДДДДДДДДДДДДДДДДДДї Увеличение і Increment і Уменьшение і Decrement і Обнуление і Zero і Изменение і Change... і 32-разрядные регистры і Register 32-bit Noі АДДДДДДДДДДДДДДДДДДДЩ Команда Increment Команда Increment (Увеличение) добавляет одно значение к подсвеченному в данный момент регистру. Это позволяет легко исправить небольшие ошибки в значении регистра. Команда Decrement Команда Decrement (Уменьшение) вычитает 1 из значения подсвеченного в данный момент регистра. Команда Zero Команда Zero (Ноль) обнуляет содержимое текущего (подсвеченного) регистра. Команда Change... Команда Change... (Изменение) изменяет содержимое текущего (подсвеченного) регистра. Для ввода нового значения вам выводится подсказка. При вводе нового значения можно использовать средство вычисления выражений. Эту команду можно вызвать также, если просто начать набирать новое значение регистра. Когда вы делаете это, выводится окно подсказки (как при использовании команды Change). Команда Registers 32-bit Команда Registers 32-bit (32-разрядные регистры) позволяет с вывода регистров ЦП, как 16-разрядных значений, на 32-разрядные. При работе на процессора 80386 вы обычно видите 32-разрядные регистры (если только не использована данная команда для переключен ия на 16-разрядные регистры). 32-разрядные регистры необходимы только в том случае, если вы отлаживаете программу, в которой используются возможности 32-разрядной адресации процессора 386. Если вы отлаживаете обычную программу, в которой используется 16- разрядная адресация, можно выбрать вывод 16-разрядных регистров. Локальное меню области флагов Для вывода локального меню области флагов нажмите клавиши Alt-F10. Если разрешено использование сокращений с клавишей Ctrl, то нажатие клавиши Ctrl с первой буквой нужной команды может использоваться для непосредственного доступа к команде. ЪДДДДДДДї Переключение і Toggleі АДДДДДДДЩ Команда Toggle Команда Toggle (Переключение) устанавливает значение флага в 0, если он был равен 1, и в 1, если он был равен 0. Значение 0 означает, что флаг сброшен, а 1 - что он установлен. Для изменения (инвертирования) значения текущего (подсвеченного) флага можно также нажать клавишу Enter. Область данных В этой области показано непосредственное содержимое выбранной вами области памяти. В левой части каждой строки показан адрес данных, выводимых на данной строке. Адрес выводится в виде шестнадцатиричного значения сегмента и смещения или значение сегмента заменяется именем сегмента DS, если значение сегмента совпадает с текущим содержимым регистра DS. Далее в области выводится непосредственное содержимое одного или более элементов данных. Формат этой области зависит от режима вывода, выбранного с помощью команды локального меню Display As (Вывести как...). Если вы выбираете один из форматов вывода с п лавающей точкой (Copm, Float, Double, Extended), то на каждой строке выводится одно число с плавающей точкой. При байтовом формате на одной строке выводится 8 байт, в формате размером в слово (Word) - 4 слова на строку, а в длинном формате (Long) - два д линных слова на строку. В правой части каждой строки выводятся символы, соответствующие показанным байтам. Турбо отладчик выводит все печатаемые значения, соответствующие байтовым эквивалентам, поэтому не удивляйтесь, если на экране вы увидите странные символы - просто это симв ольный эквивалент шестнадцатиричных значений байт данных. Число байт, выводимых на каждой строке бывает различным и зависит от формата, заданного к команде Display As. Если вы используете окно данных для проверки содержимого дисплейной памяти, данных базовой системы ввода-вывода или векторов в младших адресах памяти, вы увидите значения, находящиеся там во время выполнения отлаживаемой программы, а действительные значе ния при работе Турбо отладчика. Они не совпадают с теми значениями, которые находтся в указанных областях памяти в тот момент, когда вы их просматриваете. Турбо отладчик определяет, что вы обращаетесь к областям данных, которые также используются им сами м, и извлекает значения этих данных из их копии для программы пользователя. Локальное меню области данных Для вывода локального меню области данных нажмите клавиши Alt-F10. Если разрешено использование сокращений с клавишей Ctrl, то нажатие клавиши Ctrl с первой буквой нужной команды может использоваться для непосредственного доступа к команде. ЪДДДДДДДДДДДДї і Goto і Переход і Search і Поиск і Next і Следующая і Change і Изменение і Follow і Следовать і Previous і Предыдущий іДДДДДДДДДДДДі і Display asі Вывести как... і Block і Блок АДДДДДДДДДДДДЩ Команда Goto Команда Goto (Переход) позиционирует вас на адрес в данных. Введите новый адрес, на который вы хотите перейти. Вы можете ввести внутренний адрес DOS, адрес, расположенный в резидентных утилитах или вне вашей программы, что позволяет вам проверить данные в базовой системе ввода-вывода. Полное описание ввода адресов содержится в Главе 9. Команда Search Команда Search (Поиск) выполняет поиск строки символов, начиная с текущего адреса памяти, указанного позицией курсора. Введите список байт для поиска. При достижении конца сегмента поиск не будет автоматически возобновляться с его начала. Подробнее о списках байт рассказывается в Главе 9. Команда Next Команда Next (Следующий) выполняет поиск следующего вхождения списка байт, который вы задали ранее в команде Search (Поиск). Команда Change... Команда Change... (Изменение) позволяет изменять байты по текущему месту расположения курсора. Если содержимое выводится в коде ASCII или в байтовом формате, то выводится подсказка для ввода списка байт. В противном случае запрашивается элемент, соответс твующий текущему формату вывода. Полное описание списка байт содержится в Главе 9. Эту команду можно вызвать также, если просто начать набирать новое значение или значения. Когда вы делаете это, выводится окно подсказки (как при использовании команды Change). Команда Follow По данной команде выводится следующее локальное меню: ЪДДДДДДДДДДДДДДДДДДДДДДДДДї Ближний код і Near code і Дальний код і Far code і іДДДДДДДДДДДДДДДДДДДДДДДДДі Смещение данных і Offset to data і Сегмент:смещение і Cegment:offset to data і Базовый сегмент і Base segment:0 to data і АДДДДДДДДДДДДДДДДДДДДДДДДДЩ Команда Near Code Данная команда интерпретирует слово под курсором в области данных, как смещение в текущем сегменте кода (как это задается регистром CS). Область кода становится текущей областью и позиционируется на данный адрес. Команда Far Code Данная команда интерпретирует двойное слово под курсором в области данных, как адрес дальнего типа (сегмент и смещение). Область кода становится текущей и позиционируется на данный адрес. Команда Offset to Data Данная команда позволяет вам следовать по цепочке указателей размером в слово (ближнего типа, где используется только смещение). Область данных устанавливается в соответствии со смещением, заданным словом в памяти по текущей позиции курсора. Команда Segment:Offset to Data Эта команда позволяет вам следовать по цепочке указателей дальнего типа размером в двойное слово (где используется сегмент и смещение). Область данных устанавливается в соответствии со смещением, заданным двойным словом в памяти по текущей позиции курсор а. Команда Base Segment:0 to Data Данная команда интерпретирует слово под курсором, как адрес сегмента, и позиционирует область данных на начало сегмента. Команда Previous локального меню области данных Команда Previous (Предыдущий) восстанавливает адрес области данных в адрес, который был до последней команды, явно изменившей значение текущего адреса. Использование клавиш стрелок и клавиш PgUp и PgDn не приводит к запоминанию позиции. Турбо отладчик TDW поддерживает стек из пяти последних адресов, поэтому вы можете вернуться назад после многократного использования команд локального меню Follow, или команды Goto. Команда Display As Команда Display As (Режим вывода) позволяет выбирать формат вывода в области данных. Вы можете выбирать один из форматов данных, использующихся в Паскале или Ассемблере. Эти форматы можно выбрать из меню: ЪДДДДДДДДДДї Байт і Byte і Слово і Word і Длинный тип і Long і Сложный тип і Comp і С плавающей точкой і Float і Вещественный і Real і С удвоенной точностью і Double і С расширенной точностью і Extended і АДДДДДДДДДДЩ Команда Byte Команда Byte (Байт) устанавливает область данных в режим вывода шестнадцатиричных байтовых данных. Это соответствует типу данных byte в Паскале. Команда Word Команда Word (Слово) устанавливает область данных в режим вывода шестнадцатиричных слов. Это соответствует типу данных word в Паскале. Команда Long Команда Long (Длинный) устанавливает область данных в режим вывод длинных шестнадцатиричных целых чисел. Это соответствует типу данных longint в Паскале. Команда Comp Команда Comp (Cложный) устанавливает область данных в режим вывода 8-байтовых целых чисел. Выводится десятичное значение числа. Это соответствует типу данных comp в Паскале (формат IEEE). Команда Float Команда Float (C плавающей точкой) устанавливает область данных в режим вывода 6-байтовых чисел с плавающей точкой. Выводится значение числа с плавающей точкой в научном представлении. Это соответствует вещественному типу данных (single) в Паскале (форма т IEEE). Команда Real Команда Real (вещественный) устанавливает область данных в режим вывода 6-байтовых чисел с плавающей точкой. Выводится значение числа с плавающей точкой в научном представлении. Это соответствует вещественному типу данных (real) в Паскале. Команда Double Команда Double (C двойной точностью) устанавливает область данных в режим вывода 8-байтовых чисел с плавающей точкой. Выводится значение числа с плавающей точкой в научном представлении. Это соответствует типу данных с двойной точностью (тип Паскаля doub le и тип Ассемблера TBYTE). Команда Extended Команда Extended (C расширенной точностью) устанавливает область данных в режим вывода 10-байтовых чисел с плавающей точкой. Выводится значение числа с плавающей точкой в научном представлении. Это внутренний формат, используемый в сопроцессоре 80х87. Он соответствует также типу длинных данных с двойной точностью (long double) в языке Си и типу с расширенной точностью (extended) в Паскале. Команда Block Команда Block (Блок) позволяет вам работать с блоками памяти. Вы можете перемещать, очищать, присваивать значения блокам памяти, а также записывать и считывать блоки памяти из файлов на диске. По данной команде на экран выводится всплывающее меню, показа нное ниже: ЪДДДДДДДДДДї і Clear... і Очистка і Move... і Перемещение і Set... і Установка і Read... і Чтение і Write... і Запись АДДДДДДДДДДЩ Команда Clear Команда Clear (Очистка) устанавливает непрерывный блок в памяти в значение 0. Адрес блока и число байт, которые требуется очистить, запрашиваются в выводимой подсказке. Команда Move Команда Move (Перемещение) копирует блок памяти из одного адреса в другой. Адреса исходного и целевого блока, а также число копируемых байт, будут запрашиваться в выводимой подсказке. Команда Set Команда Set (Присваивание) присваивает непрерывному блоку в памяти конкретное байтовое значение. Адрес блока, число байт, которым требуется присвоить значение, а также само значение запрашиваются в выводимой подсказке. Команда Read Команда Read (Cчитывание) считывает все содержимое или часть файла в блок памяти. Вам сначала будет выведена подсказка для ввода имени считываемого файла, затем адреса, куда требуется считать информацию, и числа считываемых байт. Команда Write Команда Write (Запись) записывает блок памяти в файл. Вам сначала будет выведена подсказка для ввода имени файла, куда требуется записать данные, затем блока памяти, который нужно записать, и числа считываемых байт. Область стека В области стека (в нижнем правом углу окна CPU) показано содержимое стека. Локальное меню области стека В области стека для вывода локального меню нажмите клавиши Alt-F10. Если разрешено использование сокращений с клавишей Ctrl, то нажатие клавиши Ctrl с первой буквой нужной команды может использоваться для непосредственного доступа к команде данного локал ьного меню. ЪДДДДДДДДДї Переход іGoto... і Начало іOrigin і Следующий іFollow і Предыдущий іPrevious і Изменение іChange...і АДДДДДДДДДЩ Команда Goto... Команда Goto... (Переход) позиционирует вас на адрес в стеке. Введите новый адрес стека. При желании вы можете ввести адрес, выходящий за пределя стека программы, хотя для проверки любых данных вне программы используется обычно область данных. Полное опи сание ввода адресов содержится в Главе 9. Команда Previous (Предыдущий) восстанавливает область стека в то состояние (позицию), которое она имела до выполнения команды Goto. Команда Origin Команда Origin (Начало) позиционирует вас на слово в стеке, указанное текущим (подсвеченным) словом. Это полезно использовать для обратного отслеживания изменения границ стека при возврате в вызывающую функцию. Команда Previous (Предыдущий) восстанавливает область стека в то состояние (позицию), которое она имела до выполнения команды Origin. Команда Follow Команда Follow (Следующий) позиционирует вас на слово в стеке, указанное текущим (подсвеченным) словом. Это полезно использовать для обратного отслеживания изменения границ стека при возврате в вызывающую функцию. Команда Previous (Предыдущий) восстанавливает область стека в то состояние (позицию), которое она имела до выполнения команды Follow. Команда Previous Команда Previous (Предыдущий) восстанавливает позицию области стека в соответствии с адресом перед последней командой, которая явно изменила выводимый адрес. Использование клавиш перемещения (стрелок) или PgUp и PgDn не приводит к запоминанию позиции. При использовании команды Previous позиция окна стека запоминается, поэтому повторное использование этой команды приводит к переключению между двумя адресами (туда и обратно). Команда Change... Команда Change... (Изменение) позволяет вам ввести новое значение для текущего (подсвеченного) слова в стеке. Данную команду можно вызвать также, если просто начать вводить новое значение для подсвеченной записи в стеке. Когда вы это делаете, выводится окно подсказки (как и при использовании команды Change). Ассемблер Турбо отладчик TDW позволяет вам ассемблировать инструкции процессоров 8086, 80186 и 80286, а также арифметических сопроцессоров 8087, 80287 и 80387. Когда для модификации программы используется встроенный Ассемблер Турбо отладчика TDW, внесенные в нее изменения не являются постоянными. Если вы перезагрузите свою программу с помощью команд RunіProgram Reset (ВыполнениеіСброс программы) или загрузите д ругую программу с помощью команды FileіOpen (ФайліОткрыть), то все сделанные вами изменения будут потеряны. Обычно Ассемблер используется для проверки правильности предположений о коррекции программы. После того, как вы убедитесь, что при изменениях программа работает правильно, нужно изменить исходный код и перекомпилировать и перекомпоновать программу. В следующих разделах описываются различия между встроенным Ассемблером и синтаксисом, воспринимаемым встроенным Ассемблером Турбо Паскаля. Переопределения размера адреса операнда Для вызовов (CALL) инструкции перехода (JMP) и инструкций условного перехода (JNE, JL, и т.д.) Ассемблер автоматически генерирует наименьшую инструкцию, с помощью которой можно достичь целевого адреса. Перед целевым адресом, чтобы ассемблировать инструкц ию с заданным размером, можно использовать переопределения NEAR (ближний) и FAR (дальний). Например: CALL FAR XYZ JMP NEAR A1 Память и непосредственные операнды Когда вы используете в своей программе идентификатор в качестве операнда инструкции, нужно указать встроенному Ассемблеру, имеете ли вы в виду содержимое идентификатора или его адрес. Если вы используете просто имя идентификатора, то Ассемблер интерпрети рует его, как адрес (как если бы перед ним использовалась операция Ассемблера OFFSET). Если идентификатор заключается в квадратные скобки, то он будет означать ссылку на память. Если в вашей программе содержится определение данных: A DW 4 вы можете ссылаться на содержимое идентификатора A, с помощью [A]. Когда вы ассемблируете инструкцию или вычисляете выражение Ассемблера для ссылки на содержимое переменной, используйте имя переменной (само по себе или в квадратных скобках): mov dx,a mov ax,[a] Ссылаться на адрес переменной можно с помощью операции OFFSET: mov ax,offset a Переопределение размера данных в операндах В некоторых инструкциях перед операндом нужно задавать размер операнда, для чего используется одно из следующих выражений: BYTE PTR WORD PTR Приведем примеры инструкций, в которых используются такие переопределения: add BYTE PTR[si],10 mov WORD PTR[bp+10],99 Кроме этих переопределений при ассемблировании инструкций арифметических сопроцессором 8087/80287/80386 вы можете использовать следующие переопределения: DWORD PTR QWORD PTR TBYTE PTR Вот примеры таких переопределений: fild QWORD PTR[bx] stp TBYTE PTR[bp+4] Строковые инструкции При ассемблировании строковой инструкции в самой мнемонике инструкции нужно указать размер (байт или слово), в противном случае Ассемблер не воспримет такую мнемонику. Например, нужно использовать мнемонику STOSW, а не STOS WORD PTR[DI]. Окно Dump В окне Dupm (Дамп) выводится в непосредственном виде дамп любой одласти памяти. Оно работает так же, как область данных окна CPU (ЦП). ЙН[ю]ННDumpНННННННННННННННННННН3ННННН[][]» є ds:0000 CD 20 00 A0 00 9A F0 FE = & U** є ds:0008 1B 02 B2 01 22 31 7C 01 <.^%і.` І є ds:0010 22 31 88 02 52 2B E2 1D X4-# ± є ds:0018 01 01 01 00 03 FF FF FF ИІ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Щ Рис. 12.2 Окно Dump Описание содержимого и локального меню для данного окна содержится ранее в разделе "Локальное меню области данных". Обычно это окно приходится использовать при отладке программы на Ассемблере на уровне исходного кода, когда вы хотите просмотреть (на нижнем уровне), как выглядят некоторые области данных. Для создания окна Dump (Дамп) можно использовать команду ViewіDum p (ОбзоріДамп). Вы можете также использовать данное окно, находясь в окне Inspector (Проверка), когда нужно в непосредственном виде увидеть байты проверяемого объекта. Для получения окна Dump, позиционированного на данные в окне Inspector, используйте команду ViewіDump. Окно Registers В окне Registers (Регистры) выводится содержимое регистров и флагов центрального процессора. оно работает, как сочетание областей регистров и флагов в окне CPU (ЦП). ЙН[ю]ННRegsННН3Н[][]ї є ax 0000 і c=0 є є bx 0000 і z=0 є є cx 0000 і s=0 є є dx 0000 і o=0 є є si 0000 і p=0 є є di 0000 і a=0 є є bp 0000 і i=1 є є sp 2FFF і d=0 є є ds 61AF і є є es 61AF і є є ss 668F і є є cs 618F і є є ip 084E і є ИНННННННННННННННННННННЅ Рис. 12.3 Окно Registers Описание содержимого и локальных меню для этого окна можно найти в разделе "Локальное меню области регистров". Используйте данное окно, когда при отладке на уровне исходного кода программы на Ассемблере вы хотите просмотреть содержимое регистров. Вы можете сократить размер окна Module (Модуль) и поместить рядом с ним окно Registers. Примечание: Вы можете уменьшить размер окна Module и вывести наряду с ним окно Registers (Регистры). |