Э. Таненбаум - Архитектура компьютера (1127755), страница 201
Текст из файла (страница 201)
Команды без значения в столбце «Адрес» не имеют адреса. Символ л обозначает целочисленное смещение. Трассер 789 Таблица В.Т. Команды трассера Адрес Команда Пример Описание Выполнение одной команды Выполнение № команд 24 ,!,Х д 1 Ь /вгаП +50 /в1аП +5Ь Прогон до строки № после метки Т Размещение контрольной точки в строке № после метки Т /Т ч-№ Л+№ Удаление контрольной точки со строки № после метки Т /з1аг1 +5с Выполнение программы до строки № Выполнение программы до повторного достижения текущей строки Размещение контрольной точки в текущей строке Удаление контрольной точки из текущей строки Выполнение программы до следующей строки Выполнение до контрольной точки или до конца Прогон программы до аналогичного уровня подпрограмм Прогон до уровня подпрограмм минус 1 Прогон до уровня подпрограмм плюс 1 Отображение сегмента данных в метке +№ Отображение сегмента данных в метке +№ Обновление окон 1080 /Ьц1+ 6 /Ьц1+ бб Р /О +№ /О +№ о 1 Р, СТРЬ Ь Завершение трассировки, возврат в командную оболочку Команда д позволяет перейти к определенной строке исходного файла.
Эта команда существует в трех вариантах. Если перед ней указывается номер строки, трассер продолжает работу до достижения этой строки. ?1ри наличии метки /Т (с или без символов +Ф в адресе) номер строки, на которой трассер должен остановиться, вычисляется на основе метки команды Т. Если перед командой д нет никаких дополнительных элементов, трассер продолжает выполнять команды до повторного достижения строки с текущим номером. Существует два варианта команды ЛаЬе1: для меток команд и меток данных. В первом случае строка в нижнем окне заполняется или заменяется набором данных, начинающемся с данной метки.
Во втором случае команда ЛаЬе1: эквивалентна команде д. 11осле метки может быть установлен знак «плюс > и число (в табл. В.Т числа обозначены символом 11), позволяющее выполнить смещение от метки. Командой Ь можно установить контрольную точку. Перед командой Ь можно поставить метку команды со смещением или без него. Если во время выполнения встречается строка с контрольной точкой, трассер останавливается. Чтобы возобновить выполнение с контрольной точки, нужна команда возврата или запуска. Если метка и число опускаются, контрольная точка устанавливается в текущей строке.
Снять контрольную точку позволяет специальная команда с, которая, подобно команде Ь, может предваряться метками и числами. Существует 790 Приложение В. Программирование на языке ассемблера также команда запуска г, которую трассер выполняет вплоть до контрольной точки, вызова команды завершения или конца команд.
Кроме того, трассер отслеживает уровень подпрограмм, на котором работает программа. Этот уровень указывается под секцией процессора; его можно также определить по цифрам в секции стека. На уровнях подпрограмм основываются три команды. Команда - заставляет программу трассировки работать до того момента, пока текущий уровень подпрограмм не сменится более низким (точнее говоря, следующим в порядке понижения). Фактически, эта команда продолжает выполнять команды процессора до завершения текущей подпрограммы.
Противоположную функцию выполняет команда +, заставляющая программу трассировки работать до перехода на более высокий (следующий в порядке повышения) уровень подпрограмм. Команда продолжает работу трассера до уровня, аналогичного текущему, и может применяться для выполнения подпрограмм в рамках команды САСС Прн использовании команды = подробные сведения о подпрограмме в окне трассера не указываются. Существует схожая команда и, которая продолжает выполнение до следующей строки программы.
Она особенно полезна в случае вызова в качестве команды ЫЮР1 выполнение прекращается одновременно с завершением цикла. Подготовительные действия В этом разделе перечислены действия, необходимые, чтобы подготовиться к работе с вышеописанными инструментами. В первую очередь, нужно подобрать программное обеспечение для конкретной платформы. Мы скомпилировали версии для Яо!айз, ПЫ1Х, 1аппх и Ж1пг)огчз. Все эти версии есть на сопроводительном компакт-диске и в Интернете по адресу аггггг.ргепйа11.соа/гапепЬапа.
Перейдите на сайт, затем — в раздел Соарапюп ггеЬ 5йе, относящийся к этой книге, и, наконец, выберите нужную ссылку в левом меню. Распакуйте выбранный гйр-файл в папке аззеаЫег. В этой папке и в ее вложенных папках содержится весь необходимый материал. На компакт-диске основными папками являются В)Вепопх, Е11епдйх и М511г)проз. В каждой из них есть вложенная папка аззеаЫег, в которой, опять же, можно найти все необходимое. Три упомянутые папки предназначены для систем ПЫ1Х с прямым порядком следования байтов (то есть для рабочих станций 5пп), для систем ПХ1Х с обратным порядком следования байтов (ОС )лппх, установленных на ПК) и систем Ъг)пг)о яз.
После распаковки или копирования в папке аззеаЫег должны оказаться следуюгцне вложенные папки: РЕАО МЕ, Ьгп, аз згс, загсе згс, ехаар1ез и ехегс)зе. Предварительно скомпилированные исходные файлы размещены в папке Ь)п, а соответствующие двоичные файлы — в папке ехаар1ез. Чтобы получить базовые сведения о работе системы, перейдите в папку ехагпр1ез и введите команду ГЗВ Н11оиг1О Эта команда представлена в первом примере из раздела «Примерыгн Исходный код для ассемблера находится в папке аз згс.
Файлы исходного кода написаны на языке С, а перекомпилировать нх можно командой ва1ге. Для Примеры 791 Р081Х-совместимых платформ в папке исходных файлов предусмотрена утилита Иа1ей(е, которая выполняет перекомпиляцию. Для ЪУшдоууз имеется командный файл щаке.йа1. Возможно, после компиляции придется либо переместить исполняемые файлы в папку программы, либо изменить переменную РАТН таким образом, чтобы сделать ассемблер аз88 и программу трассировки г88 видимыми из папок с исходным кодом.
Если этого не сделать, то вместо команды 188 придется вводить полный путь к файлу. В системах Ъ"шдоууз 2000 и ХР необходимо установить драйвер терминала апзйзуз; для этого в конфигурационный файл сопйд.пт следует добавить строку: Ое»1СЕ=ХеуегепКооГГУ5уетев32Уеою еуе Этот файл располагается по следующему пути: + в уу'ше)оууз 2000 — ~уу1пп1~зуз1ееэ32~сопйдл1; + в Ъ'шдоууз ХР— ~уу1пдоууз~зузтею32~сопйд.п1. В Ж1пе(оууз 95, 98 и МЕ строку для установки драйвера следует ввести в файл сопйд.зук В 111у11Х и Ыппх он обычно установлен по умолчанию.
Примеры В разделах «Процессор 8088», «Память и адресация» и «Набор команд 8088» мы рассматривали процессор 8088, его память и команды. Затем, в разделе «Ассемблер» мы разбирали основной для данного руководства язык ассемблера — аз88. Раздел «Трассер» был посвящен изучению трассера. Наконец, в разделе «Подготовительные действия» были приведены инструкции по настройке набора инструментов. Теоретически, всей этой информации вполне достаточно для написания и отладки программ на языке ассемблера посредством указанных инструментальных средств.
В то же время, нам кажется, что читателю будет небезынтересно познакомиться с подробными примерами программ на языке ассемблере и способами их отладки с помощью трассера. Такие примеры представлены в данном разделе. Все программы, которые мы здесь рассмотрим, можно найти в папке ехаеэр1ез набора инструментов.
Самостоятельные ассемблирование и трассировка каждого примера горячо приветствуются. Не!!о Иог1(:1 Начнем с примера программы Н1(оуУуЫ.к В листинге В.1 представлен исходный код программы, а на рис. В.5 показано содержимое окна трассера В листинге символ комментария (! ) отделяет команды от номеров строк. В первых трех строках содержатся определения констант, привязывающие условные имена двух системных вызовов и файл вывода к соответствующим внутренним представлениям. Псевдокоманда .5ЕСТ в строке 4 указывает на то, что нижеследующие строки входят в секцию текста, иначе говоря, являются командами процессора.
Аналогичным образом, все, что следует за строкой 17, считается данными. В строке 19 инициализируется строка данных, состоящая из 12 байт, в том числе одного пробела и символа перевода строки (Ап) в конце. 792 Приложение В. Программирование на языке ассемблера СЗ: 00 ОЗ=ЗЗ=ЕЗ: 002 АН:ОО А!лОо АХ: !г вн:оо выоо вх: о сн:оо сыоо сх: !г он:оо о!Моо ох: о 8Р: 7148 ЗР О О 3 2 С 8Р: 0000 СС . > Р 81: ОООО !Р:ОООо:РС о1: оооо маг! МОУ СХ,ое-ьа РОЗН СХ РОЗН НЧУ РОЗН ЗТОООТ РОЗН Игя!ТЕ ЗУЗ АОО ЗР,В ЗОВ СХ,АХ РОЗН СХ ! 8 в ! в .
!о ! 11 ! 12 . !З ! 14 =>0004 ооо! оооо оооо На > Н е По ХУог101л Рис. В.З. Содержимое окна трассера при выполнении программы из листинга В.1 Листинг В.1. Ассемблерный код программы Н!!СИИг!С.з ЕХ1Т "1 ! И81ТЕ 4 ! 2 5ТОООТ - 1 ! 3 .5ЕСТ .ТЕХТ ! 4 51аггл МОУ СХ.Ое-пи ! 8 Р05Н СХ ! 7 Р05Н Ми ! 8 Р05Н 5ТОООТ ! 9 Р05Н ИК!ТЕ 10 575 АОО 5Р, 8 ! 12 508 СХ.ЯХ ! 13 Р05Н СХ 14 Р05Н ЕХ1Т ! 15 575 ! 18 .5ЕСТ .ОАТА ! 17 Ни: ! 18 .Я5С11 "Не11о Иог1йл" ! 19 Ое: .ВУТЕ 0 ! 20 В строках 5, 18 и 20 содержатся метки, обозначеннь!е двоеточием !':). Они представляют численные значения, схожие с константами. В данном случае ассемблеру приходится определять эти численные значения.
Поскольку метка 51агЕ находится в начале секции текста, соответствующее значение принимается за О, но значения в последующих метках секции текста (в этом примере они не показаны) обуславливаются количеством предшествующих байтов кода. Теперь рассмотрим строку 6. Она заканчивается разностью двух меток — численной константой.
Таким образом, строку 6 можно приравнять к следующему выражению: МОУ СХ.12 ЕХ1Т = 1 1! 07Р!ТЕ =4 ! 2 ЗТОООТ =1 ! 3 .ЗЕСТ .ТЕХТ ! 4 Иав ! 5 МОУ СХ,Ое-ла ! 8 РОЗН СХ ! 7 РОЗН П !в РОзн зтооот , в РОЗН УУР!ТЕ !1О ЗУВ !11 АОО ЗР,8 112 ЗОВ СХ,АХ . ! З РОЗН СХ !14 РОЗН ЕХ!Т ! 15 ЗУЗ !!в .ЗЕСТ .ОАТА па: !!в .АЗСП 'Не!И ЗУолв!л" ! !В ое!.ВУТЕ О ! 20 Ла + О = ОООО: 48 Вв Во Во В! гО 57 В Нено Утог!4 2582В Примеры 793 Разница между ними заключается лишь в том, что в одном случае длину строки определяет ассемблер, а в другом — программист. Указанное здесь значение выражает объем пространства в секции данных, зарезервированное для размещения строки, расположенной в строке 19. Команда НОЧ в строке 6 представляет собой команду копирования Ве -Ь~ в регистр СХ.
Содержание строк 7-11 демонстрирует механизм формирования системных вызовов в применяемом наборе инструментов. Фактически, эти строки представляют собой переведенный на языке ассемблера вызов функции из языка С: иг1ГеПС Эи, 12Н Здесь первый параметр представляет собой дескриптор файла стандартного вывода (1), второй выражает адрес отображаемой строки (Ьг), а третий — длину строки (12). В строках 7 — 9 эти параметры помещаются в стек в обратном порядке, что соответствует последовательности вызова, принятой в С и применяемой данной программой трассировки.
В строке 10 в стек вводится номер системного вызова для функции иг11е (4), а в строке 11 выполняется сам вызов. Такой порядок по большей части соответствует механизму выполнения программы на языке ассемблера в клонах (ЛЧ1Х (или 1лппх), однако при работе в другой операционной системе его необходимо скорректировать в расчете на конкретные правила выполнения системных вызовов. Впрочем, даже при работе в среде %'1пдочгз ассемблер аз88 и трассер 188 реализуют правила вызовов, принятые в 13г11Х. Системный вызов в строке 11 ответственен за вывод данных.