Э. Таненбаум - Архитектура компьютера (1127755), страница 200
Текст из файла (страница 200)
Различия между этими моделями зависят от способа применения сегментных регистров. В большой модели можно выполнять дальние вызовы и изменять регистр 05. Процессор сам по себе налагает некоторые ограничения на сегментные регистры (например, регистр С5 не может быть целевым адресом в команде МОЧ). Для упрощения трассировки в аз88 применяется модель памяти, сходная с малой, хотя ассемблер и без помощи трассера может обрабатывать сегментные регистры без каких-либо дополнительных ограничений.
В двух вышеупомянутых ассемблерах нет секции 855, а инициализируют память они только в секциях данных. Обычно код на языке ассемблера начинается с заголовка в том или ином виде; затем следует секция данных, обозначаемая ключевым словом .ба1а, после чего пишется текст программы с ключевым словом .себе.
В заголовке используются ключевые слова ь111е (название программы), .еоде1 (модель памяти) и .зСасЕ (резервирование памяти для стекового 786 Приложение В. Программирование на языке ассемблера сегмента). Если целевой двоичный файл должен быть записан с расширением .сов, применяется миниатюрная модель памяти; при этом все сегментные регистры уравниваются, а в начале объединенного сегмента 256 байт резервируются для «префикса сегмента программы». Вместо директив .НОВО .ВТТЕ и АВС17 в ассемблерах ТАЯМ и МАЯМ применяются ключевые слова ОИ (определение слова) и ОВ (определение байта). После директивы ОВ может быть помещено определение строки в двойных кавычках.
После меток в определениях данных двоеточия не ставятся. Крупные блоки памяти инициализируются ключевым словом ООР; перед ним указывается число байтов, а после него определяется инициализация. Например; ~АВЕ! 00 1000 00Р (О) Этот оператор инициализирует 1000 байт памяти байтами АЯСП-нулей по адресу метки САВЕЛА . После меток подпрограмм устанавливается не двоеточие, а ключевое слово РВОС. В конце подпрограммы эта метка дублируется, а после нее ставится ключевое слово ЕМОР, которое позволяет ассемблеру определить точную область действия подпрограммы. Локальные метки не поддерживаются.
Ключевые слова, применяемые с командами, идентичны в МАЯМ, ТАЯМ и аз88. Кроме того, в командах с двумя операндами исходный операнд ставится после целевого. С другой стороны, чаще всего для передачи аргументов функциям используется не стек, а регистры. Если же программы на языке ассемблера вставляются в программы на С или С++, стек предпочтительнее, поскольку он согласуется с механизмом вызова подпрограмм С.
Это не очень принципиально, поскольку в аз88 стек можно заменить регистрами. Самое существенное различие между МАЯМ, ТАЯМ и аз88 сводится к механизму выполнения системных вызовов. В МАЯМ и ТАЯМ они совершаются с помощью системного прерывания 1МТ. Самый распространенный его вариант— 1МТ 21Н; он применяется для выполнения системных вызовов МЯ-ПОЯ.
Номер вызова при этом помещается в регистр АХ (вновь аргументы передаются регистрам). Различным устройствам соответствуют разные векторы и номера прерываний, например, 1МТ 16Н для клавиатурных функций В10Я и 1МТ 10Н для дисплея. Чтобы программировать эти функции, программист должен знать огромное количество данных о тех или иных устройствах. Системные вызовы 13Х1Х, реализованные в аз88, значительно проще. Трассер Рассматриваемый трассер/отладчик адаптирован для обычного (Ъ'Т100) терминала 24 х 80 со стандартным для терминалов набором А)ЧЯ1-команд. В машинах ПН1Х и 11пцх этим требованиям обычно отвечает эмулятор терминала в системе Х-чг)пдои. В машинах %'1пдотчз для этой цели с файлами инициализации системы загружается драйвер алзйзуж процедура загрузки которого будет описана далее.
Структуру окна трассера мы уже показывали. Как видно из рис. ВА, экран трассера разделен на семь секций. Трао сер 787 Рис. В.4. Секции окна трассера В верхней левой части окна находится секция процессора; в ней содержимое регистров общего назначения указывается в десятичном представлении, всех остальных регистров — в шестнадцатеричной. Поскольку численное значение счетчика команд не слишком информативно, строкой ниже определяется положение в исходном коде программы по отношению к предыдущей глобальной метке. Над полем счетчика команд показаны пять кодов условий.
Переполнение обозначается символом и, флаг направления — символом > (увеличение) или ( (уменьшение). Флаг знака может быть выражен символами и (отрицательиые значения) или р (нуль и положительные значения). Установленный нулевой флаг обозначается как г, а установленный флаг переноса — как с. Знак — означает сброшенный флаг. В верхней средней секции размещается стек в шестнадцатеричном представлении. Положение указателя стека обозначается стрелкой (=>). Адреса возврата подпрограмм указываются цифрой, устанавливаемой перед шестнадцатеричным значением. В верхней правой секции выводится часть исходного файла, в которой находится следующая в порядке выполнения команда.
Положение счетчика команд, как и положение указателя стека, определяется стрелкой (=>). Под секцией процессора указываются последние точки вызова подпрограмм в исходном коде. Еще ниже находится секция команд трассера, где предыдущая команда указывается сверху, а курсор команды — снизу. Имейте в виду, что каждая команда должна завершаться символом возврата каретки (на клавиатурах ПК он вводится нажатием клавиши Еп1ег). В нижней секции могут находиться шесть элементов глобальной памяти данных. Каждый такой элемент начинается с позиции, отсчитываемой относительно той или иной метки, за которой следует абсолютная позиция в сегменте данных. Далее ставится двоеточие и выводится 8 байт в шестнадцатеричном представлении.
Следующие 11 позиций зарезервированы для символов, за которыми могут следовать четыре слова в десятичном представлении. Байты, символы и слова представляют одну и ту же область памяти, но для символьного выражения 788 Приложение В. Программирование на языке ассемблера предусмотрено три дополнительных байта. Это решение обусловливается тем, что изначально не ясно, в каком виде будут представлены данные; в виде целых чисел со знаком или без знака либо в виде строки. Средняя правая секция отводится под ввод и вывод.
В первой строке следует вывод ошибок трассера, вторую строку занимает ввод, а несколько последующих — вывод. Выводу ошибок предшествует буква Е, вводу — буква 7, стандартному выводу — символ >. В поле ввода стрелка (->) обозначает следующий в порядке чтения указатель. При вызовах геаб или де1с11аг следующее введенное в командной строке трассера выражение попадает в поле ввода. В этом случае необходимо завершить ввод нажатием клавиши Еп1еп Необработанная на данный момент часть строки находится после стрелки (->).
Как правило, трассер считывает команды и входные данные из файла стандартного ввода. В то же время, можно подготовить файл с командами трассера и файл со строками ввода, которые будут считаны до передачи управления файлу стандартного ввода.
Файлы с командами трассера сохраняются с расширением .1, а файлы ввода — с расширением л'. В языке ассемблера в ключевых словах, системных подпрограммах и псевдокомандах могут быть задействованы символы как в верхнем, так и в нижнем регистрах. В процессе ассемблирования создается файл с расширением .8, в котором ключевые слова в нижнем регистре преобразуются в верхний регистр, а символы возврата каретки отбрасываются. При такой системе в каждом проекте (предположим, он называется рг) может быть до шести файлов: 1. Файл с исходным кодом на языке ассемблера (рпз), 2.
Файл с объединенным исходным кодом (рп5). 3. Файл загрузки (рг.88). 4. Предустановленный файл стандартного ввода (ргй). 5. Предустановленный файл с командами трассера (рг.1). 6. Файл для компоновки кода на языке ассемблера с файлом загрузки (рг.й). Содержимым последнего файла трассер заполняет верхнюю правую секпию окна и поле счетчика команд. Кроме того, трассер проверяет, когда был создан файл загрузки: до последнего изменения исходного кода программы или после; в первом случае генерируется предупреждение. Команды трассера Команды трассера перечислены в табл. В.7.
Наиболее важными из них считаются команда однократного возврата (первая строка таблицы), которая выполняет одну команду процессора, и команда выхода о (нижняя строка таблицы). Число в качестве имени команды обозначает количество команд процессора, подготовленных к выполнению. Так, число Й эквивалентно Й-кратному повторению команды возврата. Аналогичный эффект достигается в том случае, если после числа ставится знак восклицания (! ) или символ Х. После каждой команды должен вводиться символ возврата каретки (нажатием клавиши Еп1е~). Пустая ячейка указывает на то, что дополнительных действий, помимо возврата каретки, не требуется.