рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Двухпроходный Ассемблер — второй проход

Двухпроходный Ассемблер — второй проход - раздел Образование, Свойства операторов работы с экраном Обычно 2-Й Проход Ассемблера Читает Исходный Модуль С Самого Начала И Отчасти...

Обычно 2-й проход Ассемблера читает исходный модуль с самого начала и отчасти повторяет действия 1-го прохода (лексический разбор, распознавание команд и директив, подсчет адресов). Это, однако, скорее дань традиции — с тех времен, когда в вычислительных системах ощущалась нехватка (или даже полное отсутствие) внешней памяти. В те далекие времена колода перфокарт или рулон перфоленты, содержащие текст модуля, вставлялись в устройство ввода повторно. В системах с эволюционным развитием сохраняются перфокарты и перфоленты (виртуальные), так что схема работы Ассемблера — та же. В новых системах Ассемблер может создавать промежуточный файл — результат 1-го прохода, который является входом для 2-го прохода. Каждому оператору исходного модуля соответствует одна запись промежуточного файла, и формат этой записи приблизительно такой:

 

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

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

· регистр;

· непосредственный операнд;

· адресное выражение.

Виды адресных выражений зависят от способов адресации вычислительной системы, некоторые (возможно, наиболее типовые) способы адресации:

· абсолютный адрес;

· [базовый регистр]+смещение (здесь и далее квадратные скобки означают «содержимое того, что взято в скобки»);

· [базовый регистр]+[индексный регистр]+смещение;

· имя+смещение;

· литерал.

Адресное выражение моет содержать арифметические операции, соображения, касающиеся арифметики в этом случае — те же, что и в адресной арифметике языка C.

Имена в адресных выражениях должны заменяться на значения. Замена абсолютных имен (определенных в директиве EQU) очень проста — значение имени из таблицы символов просто подставляется вместо имени. Перемещаемые имена (метки и имена переменных) превращаются Ассемблером в адресное выражение вида [базовый регистр]+смещение. В таблице символов значения этих имен определены как смещение соответствующих ячеек памяти относительно начала программы. При трансляции имен необходимо, чтобы:

· Ассемблер «знал», какой регистр он должен использовать в качестве базового;

· Ассемблер «знал», какое значение содержится в базовом регистре;

· в базовом регистре действительно содержалось это значение.

Первые два требования обеспечиваются директивами, третье — машинными командами. Ответственность за то, чтобы при обеспечении этих требований директивы согласовывались с командами, лежит на программисте. Эти требования по-разному реализуются в разных вычислительных системах. Приведем два примера.

В Intel Ассемблер использует в качестве базовых сегментные регистры (DS при трансляции имен переменных, CS при трансляции меток). Для простой программы, состоящей из одной секции,

 

Загрузчик перед выполнением заносит во все сегментные регистры сегментный адрес начала программы и Ассемблер считает все смещения относительно него.

Сложная программа может состоять из нескольких секций, и в сегментном регистре может содержаться адрес той или иной секции, причем содержимое сегментного регистра может меняться в ходе выполнения программы. Загрузка в сегментный регистр адреса секции выполняется машинными командами:

MOV AX,секция

MOV сегментный_регистр,AX

Для того, чтобы Ассемблер знал, что адрес секции находится в сегментном_регистре, применяется директива:

ASSUME сегментный_регистр:секция

Далее при трансляции имен Ассемблер превращает имена в адресные выражения вида

[сегментный_регистр]+смещение в секции

Отмена использования сегментного регистра задается директивой:

ASSUME сегментный_регистр:NOTHING

Обратим внимание на то, что при трансляции команды

MOV AX,секция

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

Более гибкая система базовой адресации применяется в S/360, S/370, S/390. В качестве базового может быть использован любой регистр общего назначения. Директива:

USING относительный_адрес,регистр

сообщает Ассемблеру, что он может использовать регистр в качестве базового, и в регистре содержится адрес — 1-й операнд. Чаще всего относительный_адрес кодируется как * (обозначение текущего значения счетчика адреса), это означает, что в регистре содержится адрес первой команды, следующей за директивой USING. Занесение адреса в базовый регистр выполняется машинной командой BALR. Обычный контекст определения базового регистра:

BALR регистр,0

USING *,регистр

 

С такими операндами команда BALR заносит в регистр адрес следующей за собой команды.

Зная смещение именованной ячейки относительно начала программы и смещение относительно начала же программы содержимого базового регистра, Ассемблер легко может вычислить смещение именованной ячейки относительно содержимого базового регистра.

В отличие от предыдущего примера, в этом случае не требуется модификации при загрузке, так как команда BALR заносит в регистр абсолютный адрес.

Директива

DROP регистр

отменяет использование регистра в качестве базового.

В качестве базовых могут быть назначены несколько регистров, Ассемблер сам выбирает, какой из них использовать в каждом случае.

Выше мы говорили, что Ассемблер «знает» базовый регистр и его содержимое. Это «знание» хранится в таблице базовых регистров. Обычно таблица содержит строки для всех регистров, которые могут быть базовыми и признак, используется ли регистр в таком качестве. Формат строки таблицы:

 

– Конец работы –

Эта тема принадлежит разделу:

Свойства операторов работы с экраном

Расширенные возможности экранных операций Байт атрибутов Фон Текст Атрибут BL R G B I R G... Прерывание BIOS INT H... Прерывание INT H обеспечивает управление всем экраном В регистре AH устанавливается код определяющий функцию...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Двухпроходный Ассемблер — второй проход

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Команда прерывания INT
Ранее мы имели дело с программами, в которых данные oпределялись в операндах команд (непосредственные данные) или инициализировались в конкретных полях программы. Число практических применений таки

Установка курсора
Экран можно представить в виде двумерного пространства с адресуемыми позициями в любую из которых может быть установлен курсор. Обычный видеомонитор, например, имеет 25 строк (нумеруемых от 0 до 24

Очистка экрана
Запросы и команды остаются на экране пока не будут смещены в результате прокручивания («скроллинга») или переписаны на этом же месте другими запросами или командами. Когда программа начина

Использование символов возврата каретки, конца строки и табуляции для вывода на экран
Один из способов получения более эффективного выводе на экран — использование управляющих символов возврата каретки, перевода строки и табуляции: Десятичные ASCII Шестнадцатерич

Байт атрибутов
Байт атрибутов в текстовом (не графическом) режиме определяет характеристики каждого отображаемого символа. Байт-атрибут имеет следующие 8 бит: Фон Текст Атрибут: BL R G B I R G B

Эффект выделения
Фон Текст RGB RGB Неотображаемый (черный по черному) 000 000 Подчеркивание (не для цвета) 000 001 Нормальный (белый по черному) 000 111 Инвертированный

Расширенный ASCII код
ASCII-коды от 128 до 255 (шест. 80-FF) представляют собой ряд специальных символов полезных при формировании запросов, меню, специальных значков с экранными атрибутами. Например, используя cледующи

Функциональные клавиши
Клавиатура располагает тремя основными типами клавишей: 1. Символьные (алфавитно-цифровые) клавиши: буквы от a до z, цифры от 0 до 9, символы %, $, # и так далее. 2. Функциональны

Скэн-коды
Клавиатура имеет по две клавиши для таких символов как *, + и -. Нажатие «звездочки», например, устанавливает код символа шест.2A в регистре AL и один из двух скэн-кодов в регистре AH в зависимости

Текстовой режим
Текстовой режим предназначен для обычных вычислений с выводом букв и цифр на экран. Данный режим одинаков для черно-белых (BW) и для цветных мониторов за исключением того, что цветные мониторы не п

Байт-атрибут
Текстовой режим допускает использование байта атрибута. Цвет на экране сохраняется до тех пор, пока другая команда не изменит его. Для установки цвета можно использовать в команде INT 10H

Комментарии в программах на Ассемблере
Использование комментариев в программе улучшает ее ясность, oсобенно там, где назначение набора команд непонятно. Комментаpий всегда начинаются на любой строке исходного модуля с си

Формат кодирования
Основной формат кодирования команд Ассемблера имеет следующий вид: [метка] команда [операнд(ы)] Метка (если имеется), команда и операнд (если имеется) pазделяются

Директивы
Ассемблер имеет ряд операторов, которые позволяют упpавлять процессом ассемблирования и формирования листинга. Эти операторы называются псевдокомандами или директивами. Они действ

Директива PAGE
В начале программы можно указать количество строк, распечатываемых на одной странице, и максимальное количество символов на одной строке. Для этой цели cлужит директива PAGE. Следующей директивой у

Директива TITLE
Для того, чтобы вверху каждой страницы листинга печатался заголовок (титул) программы, используется диpектива TITLE в следующем формате: TITLE текст Рекомендуется в качестве текст

Директива SEGMENT
Любые ассемблерные программы содержат по крайней мере один сегмент — сегмент кода. В некоторых программах используется сегмент для стековой памяти и сегмент данных для определения данных. Асcемблер

Объединение
Этот элемент определяет объединяется ли данный сегмент с другими сегментами в процессе компоновки после ассемблирования. Возможны следующие типы объединений: STACK, COMMON, PUBLIC, AT выражение и M

Директива PROC
Сегмент кода содержит выполняемые команды программы. Кроме того этот сегмент также включает в себя одну или несколько процедур, определенных директивой PROC. Сегмент, содержащий только одну процеду

Директива ASSUME
Процессор использует регистр SS для адресации стека, регистр DS для адресации сегмента данных и регистр CS для адресации cегмента кода. Ассемблеру необходимо сообщить назначение каждого се

Директива END
Директива ENDS завершает сегмент, а директива ENDP завершает процедуру. Директива END в свою очередь полностью завершает всю программу:   Директива Операнд END [имя_процедуры

Память и регистры
Рассмотрим особенности использования в командах имен, имен в квадратных скобках и чисел. В следующих примерах положим, что WORDA определяет слово в памяти: MOV AX,BX ;Переслать содержимое

Инициализация программы
Существует два основных типа загрузочных программ: EXE и COM. Рассмотрим требования к EXE-программам. DOS имеет четыре требования для инициализации ассемблерной EXE-программы:

Ввод программы
Исходный текст программы, предназначенный для ввода с помощью текстового редактора можно ввести при помощи DOS EDLIN или другого текстового редактора. Для ввода исходной программы наберите

Подготовка программы для выполнения
После ввода на диск исходной программы необходимо проделать два основных шага, прежде чем программу можно будет выполнить. Сначала необходимо ассемблиpовать программу, а затем выполнить компоновку.

Ассемблирование программы
Для того, чтобы выполнить исходную ассемблерную программу, необходимо прежде провести ее ассемблирование и затем компоновку. На дискете с ассемблерным пакетом имеются две версии aссемблера. ASM.EXE

Двухпроходный Ассемблер
В процессе трансляции исходной программы Ассемблер делает два просмотра исходного текста, или два прохода. Одной из основных причин этого являются ссылки вперед, что происходит в том случае, когда

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

Выполнение программы
После ассемблирования и компоновки программы можно (наконец-то!) выполнить ее. В случае, если EXE-файл находится на дисководе C, то выполнить ее можно командой: C:имя программы.EXE или C:и

Файл перекрестных ссылок
В процессе трансляции Ассемблер создает таблицу идентификаторов (CRF), которая может быть представлена в виде листинга перекрестных ссылок на метки, идентификаторы и переменные в п

Определение длины команды
Эта задача может решаться существенно разным образом для разных языков. В языках некоторых Ассемблеров мнемоника команды однозначно определяет ее формат и длину (S/390, все RISC-процессоры). В этом

Листинг
Строка листинга печатается в конце каждой итерации обработки команды. Строка листинга 1-го прохода содержит: номер оператора, значение счетчика адреса (только для команд и директив, приводящих к вы

Некоторые структуры данных 1-го прохода
Таблица команд содержит одну строку для каждой мнемоники машинной команды. Ниже приведен пример структуры такой таблицы для простого случая, когда мнемоника однозначно определяет формат и длину ком

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

OGR Установка адреса
Операндом директивы является числовая константа или выражение, вычисляемое при ассемблировании. Как правило, Ассемблер считает, что первая ячейка обрабатываемой им программы располагается по адресу

START/ SECT
Начало модуля или программной секции. Операндом директивы является имя секции. Этой директивой устанавливается в 0 счетчик адресов программы. Программа может состоять из нескольких программных секц

Одно- и многопроходный Ассемблер
Мы показали, что в двухпроходном Ассемблере на 1-м проходе осуществляется определение имен, а на втором — генерация кода. Можно ли построить однопроходный Ассемблер? Трудность состоит в то

Команда JMP
Большинство программ содержат ряд циклов, в которых несколько команд повторяются до достижения определенного требования, и различные проверки, определяющие, какие из нескольких действий следует вып

Безусловный переход
JMP Цикл: LOOP Условный переход: J nnn (больше,меньше,равно) Вызов процедуры: CALL

Команда LOOP
Команда JMP реализует бесконечный цикл. Но более вероятно подпрограмма должна выполнять определенное число циклов. Команда LOOP, которая служит для этой цели, использует начальное значение в регист

OF (Overflow Flag) — флаг переполнения
Фиксирует арифметическое переполнение, то есть, перенос вниз старшего (знакового) бита при знаковых арифметических операциях. В качестве примера: команда CMP сравнивает два операнда и возд

Команды условного перехода
Команда LOOP уменьшает на единицу содержимое регистра CX и проверяет его: если не ноль, то управление передается по адресу, указанному в операнде. Таким образом, передача управления зависит от конк

Знаковые и беззнаковые данные
Рассматривая назначение команд условного перехода следует пояснить характер их использования. Типы данных, над которыми выполняются арифметические операции и операции сравнения определяют какими ко

Сегмент стека
Ниже буду рассмотрены только две команды, использующие стек, — это команды PUSH в начале сегмента кодов, которые обеспечивают возврат в DOS, когда EXE-программа завершается. Естественно дл

Изменение строчных букв на заглавные
Существуют различные причины для преобразований между строчными и заглавными буквами. Например, вы могли получить файл данных, созданный на компьютере, который работает только с заглавными буквами.

Команды сдвига и циклического сдвига
Команды сдвига и циклического сдвига, которые представляют собой часть логических возможностей компьютера, имеют следующие свойства: uобрабатывают байт или слово;

Команды сдвига
При выполнении команд сдвига флаг CF всегда содержит значение последнего выдвинутого бита. Существуют следующие команды cдвига: SHR ;Логический (беззнаковый) сдвиг вправо

Команды циклического сдвига
Циклический сдвиг представляет собой операцию сдвига, при которой выдвинутый бит занимает освободившийся разряд. Существуют следующие команды циклического сдвига: ROR ;Циклический сдвиг вп

Организация программ
Ниже даны основные рекомендации для написания ассемблерных программ: 1. Четко представляйте себе задачу, которую должна решить программа. 2. Сделайте эскиз задачи в общих чертах и

Межсегментные вызовы
Примеры программ, рассматриваемых ранее, состояли из одного шага ассемблирования. Возможно, однако, выполнение программного модуля, состоящего из нескольких ассемблированных программ. В этом случае

Директива PUBLIC
Директива PUBLIC указывает Ассемблеру и компоновщику, что адрес указанного идентификатора доступен из других программ. Директива имеет следующий формат: PUBLIC идентификатор [, ... ]

Компоновка программ на языке С и Ассемблере
Трудность описания связи программ на языке C и ассемблерных программ состоит в том, что различные версии языка C имеют разные соглашения о связях и для более точной информации следует пользоваться

Выполнение COM-программы
В отличие от EXE-файла, COM-файл не содержит заголовок на диске. Так как организация COM-файла намного проще, то для DOS необходимо «знать» только то, что тип файла — COM. Загруженным в па

AL=0. Загрузка и выполнение
Данная операция устанавливает префикс программного сегмента для новой программы, а также адрес подпрограммы реакции на Cntrl/Break и адрес передачи управления на следующую команду после завершения

AL=3. Оверлейная загрузка
Данная операция загружает программу или блок кодов, но не создает PSP и не начинает выполнение. Таким образом можно создавать оверлейные программы. Блок параметров адресуется по регистрово

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги