Главная » Просмотр файлов » Ассемблер. Компоновщик. Загрузчик. Макрогенератор

Ассемблер. Компоновщик. Загрузчик. Макрогенератор (1108377)

Файл №1108377 Ассемблер. Компоновщик. Загрузчик. Макрогенератор (Ассемблер. Компоновщик. Загрузчик. Макрогенератор)Ассемблер. Компоновщик. Загрузчик. Макрогенератор (1108377)2019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла

19


АССЕМБЛЕР. КОМПОНОВЩИК. ЗАГРУЗЧИК. МАКРОГЕНЕРАТОР.

Полная схема трансляции и запуска на счет модуля, написанного на языке макроассемблера:

модуль на ┌──────────────┐ модуль ┌─────────┐ объектный

макроязыке --> │макрогенератор│ --> на языке --> │ассемблер│ --> модуль -->

└──────────────┘ ассемблера └─────────┘ ┌-->

др.модули --┘

┌───────────┐ загрузочный модуль ┌─────────┐

-> │компоновщик│ --> (исполняемая пр-ма) --> │загрузчик│ --> счет

-> └───────────┘ └─────────┘

1. АССЕМБЛЕР

1.1 ОСНОВНАЯ ИДЕЯ АССЕМБЛИРОВАНИЯ. ДВА ПРОХОДА.

Сначала будем предполагать, что транслируемая программа состоит только из одного модуля, т.е. в ней нет внешних и общих имен, а позже (в 1.5) рассмотрим, какие изменения надо внести в работу ассемблера, чтобы учесть особенности многомодульных программ. Отметим также, что ассемблер работает после макрогенератора, поэтому в программе, которая подается на вход ассемблеру, нет никаких макрокоманд и других директив макроязыка.

Основная идея ассемблирования.

Ассемблер постоянно находится во внешней памяти. Когда операционной системе (ОС) дан приказ

MASM M.ASM, M.OBJ, M.LST;

на трансляцию нашей программы, то ОС считывает ассемблер из внешней памяти (из файла MASM.EXE) в оперативную память (ОП) и передает ему управление. Свою работу ассемблер начинает с того, что считывает из внешней памяти (из файла M.ASM) в ОП программу на языке ассемблера (ЯА). Затем он просматривает ее текст строчка за строчкой и постепенно формирует соответствующие машинные коды, которые записывает в другое место ОП. Когда ассемблер полностью построит машинную программу, он записывает ее во внешнюю память (в файл M.OBJ) и на этом заканчивает свою работу (попутно в файл M.LST записывается листинг).

┌───────>───────┐ ┌────────>───────┐

──────────────────────────────────────────────────────────────

ОП: │программа на ЯА│ │ ассемблер │ │маш.программа│

──────────────────────────────────────────────────────────────

  

внеш.память: M.ASM MASM.EXE M.OBJ

Основная идея перевода с ЯА на машинный язык проста. Надо:

- заменить мнемонические названия команд на соответствующие цифровые коды операций (КОПы);

- заменить имена переменных и меток на соответствующие адреса;

- перевести данные в двоичное машинное представление.

Если, к примеру, имя B обозначает ячейку с адресом 0001, а операция сложения слова из памяти с непосредственным операндом имеет код 81 06 (в ПК коды многих операций занимают два байта), тогда по символьной команде ADD B,260 ассемблер должен построить следующую машинную команду:

81 06 0001 0104

Как осуществляется такой перевод?

Перевод чисел из 10-й системы счисления в 2-ю осуществляется по хорошо известным алгоритмам.

Замена мнемокодов на цифровые КОПы осуществляется с помощью заранее составленной таблицы, в которой для каждого мнемокода (ADD, MOV, JMP и т.п.) указано, на какой цифровой КОП надо заменять этот мнемокод. Выделив из символьной команды мнемокод, ассемблер отыскивает в этой таблице строчку с данным мнемокодом и берет из нее нужный КОП, который и подставляет в формируемую машинную команду.

Имя переменной (или метка) должно заменяться на его смещение, т.е. на адрес имени, отсчитанный от начала того сегмента, в котором описано это имя. Для подсчета смещений ассемблер в своей работе использует специальный счетчик размещения (СР), в котором всегда находится смещение первой свободной, еще не занятой ячейки текущего сегмента, т.е. ячейки, куда должна быть помещена очередная машинная команда. При появлении в программе на ЯА нового сегмента СР обнуляется, а затем увеличивается по мере просмотра предложений этого сегмента.

Рассмотрим такой пример:

имя адрес СР

S SEGMENT 0

A DB ? A <-> 0 1

B DW ? B <-> 1 3

C DD ? C <-> 3 7

...

При появлении директивы SEGMENT отсчет смещений должен начаться от 0, поэтому СР получает значение 0. Далее идет директива DB, описывающая переменную A. Эта переменная размещается с самого начала сегмента, т.е. имеет смещение 0, поэтому имени A ставится в соответствие адрес 0, т.е. текущее значение СР. Переменная A занимает 1 байт, поэтому СР увеличивается на 1 и имеет значение 1; это значит, что первая свободная ячейка в сегменте имеет адрес 1. С этого места размещается переменная B, поэтому имени B ставится в соответствие адрес 1. Так как на B отводится 2 байта, то СР увеличивается на 2 и теперь имеет значение 3. Именно этот адрес будет поставлен в соответствие имени C из следующей директивы. После этого СР увеличивается на 4, и т.д.

Вот так ассемблер с помощью СР следит за тем, какие ячейки уже заняты, а какие свободны, и с помощью этого СР определяет, какой адрес какому имени соответствует. Эти соответствия запоминаются ассемблером и затем используются для замены имен на адреса.

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

Проблема ссылок вперед. Два прохода ассемблера.

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

Рассмотрим следующий пример:

ADD B,260

...

B ...

...

Встретив команду ADD, ассемблер еще не знает, где описано имя B, и потому не знает его адреса, не знает, на что надо заменять имя B в этой команде. Что делать? Для решения проблемы со ссылками вперед ассемблер просматривает текст программы дважды. При первом просмотре ассемблер ничего не транслирует, ничего не переводит на машинный язык, а только собирает сведения обо всех именах, используемых в программе: каких они типов, каковы их адреса и т.д. И только при втором просмотре текста ассемблер, уже зная все необходимое об именах, осуществляет перевод символьных команд на машинный язык.

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

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

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

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

К заранее составленным таблицам относятся таблица директив и таблица мнемокодов.

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

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

ASSUME - адрес процедуры обработки ASSUME

DB - адрес процедуры обработки DB

...

Эта таблица используется двояко. Прежде всего она нужна для того, чтобы отличать команды от директив: когда ассемблер обрабатывает очередное предложение программы на ЯА, то он выделяет из него название и определяет по этой таблице, имеется ли такое названием в таблице или нет. Если нет, то ассемблер считает данное предложение командой, а если да - то директивой. В последнем случае ассемблер по адресу из таблицы передает управление на ту из своих процедур, что занимается обработкой данной директивы.

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

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

Отметим, что в ПК один и тот же мнемокод в зависимости от типов операндов может заменяться на разные КОПы, поэтому эта таблица представляет собой не просто список пар "мнемокод - КОП", а имеет более сложную структуру, примерно такую:

мнемокод тип op1 тип op2 КОП размер команды

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

ADD m16 i16 81 06 6

ADD r16 r16 ... 2

...

NEG r8 - ... 2

...

Эта таблица используется следующим образом. Когда ассемблеру встречается команда, например ADD B,260, то он выделяет из нее мнемокод (ADD) и определяет типы операндов (m16 и i16), после чего отыскивает в таблице строчку с таким мнемокодом и такими типами и берет из нее указанный КОП, который и подставляет в формируемую машинную команду.

Отметим, что эта таблица используется также для проверки правильности записи мнемокодов и для проверки правильности типов операндов. Например, если в предложении встретилось название ADS, то, не найдя такого имени в таблице, ассемблер зафиксирует ошибку. Аналогично будет зафиксирована ошибка в команде ADD B,B, поскольку в таблице нет строки с мнемокодом ADD и типами операндов m16 и m16.

Рассмотрим попутно, как решается проблема с модифицируемыми адресами, например в команде ADD B[BX],260. В машинных командах ПК информация о том, по каким регистрам-модификаторам происходит модификация операнда-адреса, указывается в последних трех разрядах второго байта КОПа (в поле m):

3

┌───────────┐ ┌───────────┐

│ │ │ | m │

└───────────┘ └───────────┘

└──────── КОП ───────────┘

Например, m=000b означает, что адрес должен модифицироваться по двум регистрам BX и SI, m=110b - адрес не модифицируется, m=111b - адрес модифицируется по регистру BX и т.д.. Так вот, определив типы операндов команды без учета модификаторов и выбрав из таблицы мнемокодов соответствующий КОП, ассемблер затем просто слегка корректирует этот КОП, настраивая его на нужные модификаторы: в нашем примере с B[BX] код 81 06 (здесь m=110b) надо заменить на 81 07 (m=111b). Поэтому в самой таблице не надо хранить КОПы для всех сочетаний модификаторов, а достаточно хранить только один, так сказать, базовый КОП, отталкиваясь от которого уже просто получить окончательный КОП, учитывающий указанные модификаторы.

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

Теперь рассмотрим таблицы, которые ассемблер строит в процессе своей работы и в которых собираются сведения о той программе, которую ассемблер сейчас транслирует. Вначале эти таблицы пусты, а затем по мере просмотра текста программы ассемблер на 1-м проходе заносит в них информацию о тех или иных объектах программы. Это - таблица имен, таблица сегментов и таблица распределения сегментных регистров.

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

В ней записывается информация о метках, именах переменных, именах констант и т.п. Таблица имеет примерно такую структуру (все числа 16-ричные):

имя тип значение сегмент

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

X WORD 7048 S2

P FAR 001F S3

K NUMBER 3 -

...

В каждой строчке собрана информация об одном имени, указанном в первой колонке.

В поле "тип" указывается класс объекта, обозначенного этим именем, и, если надо, его размер. Типы BYTE, WORD и DWORD указывают, что это имя переменной соответствующего размера. Типы NEAR и FAR указывают на метку или имя процедуры. Тип NUMBER указывает на имя числовой константы. Используются и другие типы (например, для структур и записей), но мы их не будем рассматривать.

В поле "значение" указывается величина, на которую ассемблер будет заменять имя, когда оно встретится в качестве операнда какой-то команды или директивы. Для меток и имен переменных здесь указываются их адреса (смещения), а для констант - их значения.

В поле "сегмент" указывается имя того сегмента программы, в котором было описано имя из первой колонки (для констант это поле пусто). Эта информация нужна для определения того, по какому сегментному регистру должно сегментироваться данное имя.

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

В эту таблицу ассемблер заносит имена всех сегментов программы и некоторые сведения о них. Примерный вид таблицы:

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

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

S1 0 80 STACK

S2 80 2405 DATA

S3 2490 F27 -

...

Характеристики

Тип файла
Документ
Размер
224 Kb
Тип материала
Высшее учебное заведение

Тип файла документ

Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.

Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.

Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6305
Авторов
на СтудИзбе
313
Средний доход
с одного платного файла
Обучение Подробнее