ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 25

Приложение E. Использование Турбо отладчика TDW с различными языками
В данное приложение мы объединили некоторые замечания о том, как можно наиболее эффективно использовать Турбо отладчик TDW с различными языками. 
Замечания по встроенному Ассемблеру
Просмотр данных в непосредственном шестнадцариричном виде
Для просмотра непосредственного дампа данных вы можете использовать команды DataіAdd Watch (ДанныеіДобавить выражение просмотра) и DataіEvaluateіModify (ДанныеіВычислениеіМодификация) c модификатором формата, например: 
     [ES:DI],20m
определяет, что вы хотите просмотреть дамп памяти (20  байт),  на которую указывает пара регистров ES:DI, в шестнадцатиричном виде. 
Отладка на уровне исходного кода
Выполнять код Ассемблера можно с помощью окна Module (Модуль), как и при работе с другими языками. Если вы хотите просмотреть значения регистров, в правой части окна Moduule вы можете вывести окно Registers (Регистры). 
Иногда можно обращаться к окну CPU (ЦП), где также просматривать ваш исходный код. Для этого откройте окно CPU, затем выберите область кода и команду Mixed (Смешанный). Это даст вам возможность просматривать как исходный код, так и байты машинного кода. 

Помните о том, что если вы хотите просматривать байты машинного кода, можно переключить окно CPU (нажав клавишу F5). 
Проверка и изменение регистров
Очевидный способ изменения регистров состоит в подсветке регистра в окне CPU (ЦП) или Registers (Регистры). Быстро изменить содержимое регистра можно с помощью команды DataіEvaluate/Modify (ДанныеіВычисление/Модификация). Можно ввести выражение присваива
ния, которое непосредственно модифицирует содержимое регистров, например: 
   SI = 99
 (здесь регистр SI будет загружен значением 99). 
Аналогично, вы можете с помощью того же метода проверить содержимое регистра: 
   Alt-D E AX
 (выведется содержимое регистра AX). 
Замечания по Турбо Паскалю
Прохождение кода инициализации
При первоначальной загрузке программы в Турбо отладчик TDW стрелка будет указывать на ключевое слово begin основной программы. На самом деле begin соответствует серии обращений к разделам инициализации всех модулей, используемых в программе (если они сод
ержат код инициализации). Все программы начинаются с обращения к коду инициализации модуля System. 
В этой точке вы можете нажать клавишу F7 (сокращение для команды RunіTrace Into (ВыполнениеіТрассировка вглубь)) и трассировать код инициализации первого модуля со встроенной информацией для отладки. Если вы используете F7 для выполнения после последнего
 end кода инициализации первого модуля, вы будет трассировать следующий модуль, то в итоге вы возвратитесь в основную программу (при этом первый ее оператор будет готов к выполнению). 
С другой стороны, если в начале программы вы нажимаете клавишу F8 (сокращение команды RunіStep Over (ВыполнениеіШаг с пропуском), то код инициализации будет пропущен, и вы начнете выполнять тело основной программы. 
Выполнение процедур Exit
Когда ваша программа завершает работу, управление передается последовательности процедур выхода. Когда вы выполняете оператор end основной программы, Турбо отладчик TDW не трассирует процедуры выхода. Для трассировки этой последовательности процедур уста
новите точку остановки на каждой процедуре выхода, которые вы хотите отладить. 
Константы
Идентификаторы констант распознаются только для скаляров и типизованных констант. Например: 
     program Test;
     const
             A = 5;
             B = Pi;
             Message = 'Testing';
             Caps = ['A'..'Z']
             Digits : string[10] = '0123456789';
     begin
              Writeln(A);
              Writeln(B);
              Writeln(Message);
              Writeln('A' in Caps);
              Writeln(Digits);
     end.
В данной программе вы можете проверить значение A (скалярная константа) и Digits (типизованная константа), но не B (константа с плавающей точкой) или Message и Caps (константы строкового и множественного типа). 
Временные значение строкового и множественного типа в стеке
Если вы используете окно CPU (ЦП), учтите, что Турбо Паскаль автоматически выделяет временные области в стеке для значений строкового и множественного типа, и делает это следующим образом. Операция плюс (+) при использованиии ее со строками и все строков
ые функции резервируют в стеке пространство для результата операций (это делается в границах стека вызывающей программы). Аналогично, операции для работы со множествами *, + и - резервируют в стеке пространство для промежуточных результатов. 
Автоматическое приведение типа
В модуле Dos определен внутрений формат данных для всех предопределенных типов. Вы можете использовать эти описания для проверки данных любой файловой переменной. Попробуйте ввести программу: 
     program Typecast;
     uses Dos;
     var
             TestFile : Text;
             IntFile : file og integer;
     begin
             Assign(TextFile, 'TEXT.DTA');
             Rewrite(TextFile);
             Assign(IntFile,'INT.DTA');
             Rewrite(IntFile);
             Close(TestFile);
             Close(IntFile);
     end.
     Теперь добавьте следующие выражения просмотра:
             IntFile
             TextFile
             FileRec(IntFile),r
             TextRec(TextFile),r
Первые два выражения выводят не экран результат (CLOSED - закрыт, OPEN - открыт, INPUT - ввод, OUTPUT - вывод) и имя файла на диске, а вторые два используют приведение типа для вывода внутренних имен полей и значений файловых переменных. 
    Замечания по использованию для Паскаля окна CPU
- Процедуры модуля System неименованы. При просмотре инструкций вызова в окне CPU (ЦП) вы увидите обращение по абсолютному адресу, а не по имени идентификатора. 
- Некоторые программы ввода-вывода, например, ReadLn и WriteLn, часто генерируют несколько вызовов языка Ассемблера. 
- Проверка диапазона, проверка стека и проверка ввода-вывода генерируют для выполнения соответствующих функций вызовы библиотечных процедур. 
 - Некоторые подпрограммы (умножение типа LongInt, конкатенация строк и т.д.) реализованы с помощью вызова библиотечных подпрограмм. 
 - Литеральные константы (строки, множества, значения с плавающей точкой) процедуры помещаются в сегмент кода, непосредственно перед точкой вызова процедуры. 


Яндекс цитирования