Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
212-235.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
179.35 Кб
Скачать

Краткий вариант

{ Процесс подготовки и отладки программы на языке ассемблера включает этапы подготовки исходного текста, трансляции, компоновки и отладки. Подготовка исходного текста программы выполняется с помощью любого текстового редактора. Файл с исходным текстом должен иметь расширение .asm.

Трансляция исходного текста программы состоит в преобразовании строк исходного языка в коды машинных команд и выполняется с помощью транслятора с языка ассемблера (т.е. с помощью программы ассемблера). Можно воспользоваться макроассемблером корпорации IBM, пакетами TASM корпорации Borland или MASM корпорации Microsoft. Однако, входной язык (т.е. мнемоника машинных команд и других операторов и правила написания предложений ассемблера) для всех ассемблеров одинаков. В результате трансляции образуется объектный файл с расширением .obj.

Компоновка объектного файла выполняется с помощью программы компоновщика (редактора связей). Файл с программой компоновщика обычно имеет имя link.exe. В результате компоновки образуется загрузочный, или выполнимый файл с расширением .exe.}

Пример:

''Диск'':\ ''Транслятор''\bin\''Программа которая транслирует'' /''ключ'' /''ключ'' /''ключ'' ''файл''

d:\masm32\bin\ml /c /Zd /coff File1.asm

d:\masm32\bin\link /SUBSYSTEM:WINDOWS File1.obj

d:\masm32\File1.exe

220

………………………………………..

221

Назначение всех текстовых редакторов – сделать более удобной, менее трудоемкой, чем при использовании обычных пишущих машинок, работу с текстовой информацией. Поэтому текстовые редакторы как инструмент нашли широкое применение в делопроизводстве, редакционно-издательской деятельности, электронной почте, а при наличии домашнего компьютера и в быту.

Основные функции текстовых редакторов – обеспечение ввода текстов в компьютер (в оперативную память – ОЗУ), их редактирования, сохранения во внешней памяти (ВЗУ) и печати на бумагу. Программы этого класса позволяют автоматизировать работу с текстами. Можно сказать, что текстовый редактор – это программа-инструмент, специализированный исполнитель.

Редактор текста программ содержит в себе код самой программы, следит за корректностью данных, ввода и написания и сообщает об этом программисту. После попытки запуска программы служит окном в котором отображаются ошибки и подробную информацию о них для дальнейшего исправления.

222

МАКРОГЕНЕРАТОР

Возможны два варианта взаимодействия макрогенератора (МГ) с ассемблером. В первом варианте МГ работает до ассемблера и полностью независим от него: МГ вводит текст программы на макроязыке и преобразует его, получая новый текст на «чистом» языке ассемблера (ЯА), и только затем начинает работать ассемблер. В этом случае МГ выступает в роли т.н. препроцессора (препроцессором называют вспомогательную программу, работающую до основной программы и преобразующую исходный текст к виду, удобному для работы основной программы). Достоинством этого варианта является то, что так легче понять сам макроязык и работу МГ, так легче реализовать МГ и ассемблер. Однако у этого варианта имеются недостатки. Во-первых, приходится дважды просматривать текст программы (а это потери времени), а во-вторых, и это главное, при таком взаимодействии МГ не может использовать информацию, извлекаемую ассемблером из программы.

Отмеченные недостатки устраняются при втором варианте взаимодействия МГ с ассемблером - когда текст программы просматривается только раз, но его обрабатывают одновременно (а точнее, чередуясь) и МГ, и ассемблер. Делается это так. Очередное предложение программы сначала просматривает МГ. Если это обычное предложение ЯА (например, директива N EQU 1), тогда МГ ничего с ним не делает, а сразу передает его на обработку ассемблеру. Ассемблер же, обработав это предложение (у нас - записав в таблицу имен, что N - это имя константы со значением 1), возвращает управление МГ, который переходит к следующему предложению программы. Если же очередное предложение программы - это конструкция макроязыка (например, IF N EQ 1), тогда его обработкой занимается сам МГ. В таких случаях МГ либо ничего не сообщает ассемблеру об этом предложении (как в случае директивы IF), либо (если это макрокоманда) генерирует несколько обычных предложений, которые по одному передает на обработку ассемблеру, и только после этого переходит к следующему предложению программы. Ясно, что в данном случае МГ может пользоваться информацией, извлеченной ассемблером из программы; например, в нашем случае МГ может забраться в таблицу имен и узнать, что означает имя N.

223

ОБРАБОТКА МАКРОСОВ.

В своей работе Макрогенератор(МГ) использует стек (обычный стек ПК), несколько таблиц и несколько счетчиков. Наиболее важные из счетчиков такие:

НС - номер строки исходного текста программы, которую сейчас рассматривает МГ; вначале НС=1.

НОМ - четырехзначный 16-ричный номер, используемый для формирования специмен вида ??номер, на которые при макроподстановках заменяются локальные метки, указанные в директивах LOCAL; вначале НОМ=0000.

УР - уровень вложенности макросов. Пока МГ обрабатывает предложения вне макроопределений, УР равен 0, но когда МГ начинает обработку макроопределения, то он увеличивает этот счетчик на 1, а по выходу из макроопределения уменьшает на 1. Вначале УР=0.

ОБРАБОТКА БЛОКОВ ПОВТОРЕНИЯ.

Объяснять действия макрогенератора при обработке блоков повторения я буду на следующем примере:

исходный текст окончательный текст

-------------- -------------------

| ... ...

100 | REPT 3 DW ?

101 | DW ? DB 1

102 | IRP X,<1,2> DB 2

103 | DB X DW ?

104 | ENDM DB 1

105 | ENDM ...

106 | ...

Сразу отмечу, что из-за возможной вложенности одних блоков повторения в другие информация о каждом из них не должна мешать информации о другом, поэтому макрогенератор хранит информацию о каждом блоке повторения в стеке.

Эти директивы очень удобно использовать при разработке макрокоманд, которые являются макросредством, предоставляемым компилятором ассемблера.

Директиви:

  • директива слияния строк catstrидентификатор catstr строка_1,строка_2,... — значением этого макроса будет новая строка, состоящая из сцепленной слева направо последовательности строк строка_1,строка_2,...  В качестве сцепляемых строк могут быть указаны имена ранее определенных макросов.  К примеру:

    pre equ Привет,

    name equ < Юля>

    privet catstr pre,name ;privet= “Привет, Юля”

  • директива выделения подстроки в строке substrидентификатор substr строка,номер_позиции,размер — значением данного макроса будет часть заданной строки, начинающаяся с позиции с номером номер_позиции и длиной, указанной в размер.  Если требуется только остаток строки, начиная с некоторой позиции, то достаточно указать только номер_позиции без указания размера.  К примеру:

    ;продолжение предыдущего фрагмента:

    privet catstr pre,name ;privet= “Привет, Юля”

    name substr privet,7,3 ;name=“Юля”

  • директива определения вхождения одной строки в другую instrидентификатор instr номер_нач_позиции,строка_1,строка_2 — после обработки данного макроса транслятором идентификаторубудет присвоено числовое значение, соответствующее номеру (первой) позиции, с которой совпадают строка_1 и строка_2.  Если такого совпадения нет, то идентификатор получит значение 0;

  • директива определения длины строки в текстовом макросе sizestrидентификатор sizestr строка — в результате обработки данного макроса значение идентификатор устанавливается равным длине строки.

;как продолжение предыдущего фрагмента:

privet catstr pre,name ;privet= “Привет, Юля”

len sizestr privet ;len=10

224

Трансляция в ассемблер

Трансляция программы в ассемблер несколько упрощает конструирование компилятора. Однако, такой подход удлиняет технологическую цепочку выполнения программы, так как объектная программа, порожденная компилятором, должна быть впоследствии обработана ассемблером, а также редактором связей и загрузчиком.

У трансляции в ассемблер есть несколько ощутимых преимуществ:

уровень ассемблера все-таки выше, чем у машинного кода; поэтому при трансляции в ассемблер программисту не приходится возиться с некоторыми утомительными техническими деталями, например, ассемблер берет на себя разрешение операторов безусловного перехода на еще неопределенные метки (переходы вперед), распределение памяти под данные, расчет длин переходов и т.п.

  • использование ассемблера позволяет отследить целый ряд ошибок, которые могут возникнуть при генерации кода (например, неправильная мнемоника команды); при генерации в машинные коды отловить такие ошибки значительно труднее

  • порождаемый текст на ассемблере значительно читабельней, чем машинный код; это может помочь при отладке компилятора.

RTL(Register Transfer Language)—язык перемещения регистров. Фактически RTL представляет собой Ассемблер, не зависящий от конкретного процессора.

Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати тексты программы и т. д.

Трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определённом смысле, равносильную первой. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати тексты программы и т. д.

Проход синтаксического анализа вызывается только однажды для анализа всего ввода. Промежуточный код RTL для функции генерируется, когда функция анализируется. Обработка происходит пооператорно. Каждый оператор считывается как синтаксическое дерево и затем преобразуется в RTL; после этого память, содержащая дерево оператора, освобождается. Типы (и выражения для их размеров), объявления, представления связывания контуров и как они вкладываются сохраняются, пока функция не скомпилируется; все они необходимы, чтобы вывести информацию об отладке.

ТАБЛИЦЫ АССЕМБЛЕРА

Таблица директив.

Таблица мнемокодов.

Таблица имен (ТИ).

Таблица сегментов (ТС).

Таблица распределения сегментных регистров (ТРСР).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]