Ассемблирование и выполнение программ 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Ассемблирование и выполнение программ



Шаг ассемблирования включает в себя трансляцию исходного кода в

машинный объектный код и генерацию OBJ-модуля. Вы уже встречали примеры

машинного кода в гл.2 и примеры исxодного текста в этой главе.

OBJ-модуль уже более приближен к исполнительной форме, но еще не

готов к выполнению. Шаг компановки включает преобразование OBJ-модуля в

EXE (исполнимый) модуль, содержащий машинный код. Программа LINK,

находящаяся на диске DOS, выполняет следующее:

 

1. Завершает формирование в OBJ-модуле адресов, которые остались

неопределенными после ассемблирования. Во многих следующих программах

такие адреса ассемблер отмечает как ----R.

2. Компонует, если необходимо, более одного отдельно

ассемблированного модуля в одну загрузочную (выполнимую) программу;

возможно две или более ассемблерных программ или ассемблерную

программу с программами, написанными на языках высокого уровня, таких

как Паскаль или Бейсик.

3. Инициализирует EXE-модуль командами загрузки для выполнения.

 

После компановки OBJ-модуля (одного или более) в EXE-модуль, можно

выполнить EXE-модуль любое число раз. Но, если необходимо внести некоторые

изменения в EXE-модуль, следует скорректировать исходную программу,

ассемблировать ее в другой OBJ-модуль и выполнить компоновку OBJ-модуля в

новый EXE-модуль. Даже, если эти шаги пока остаются непонятными, вы

обнаружите, что, получив немного навыка, весь процесс подготовки

EXE-модуля будет доведен до автоматизма. Заметьте: определенные типы

EXE-программ можно преобразовать в oчень эффективные COM-программы.

Предыдущие примеры, однако, не cовсем подходят для этой цели. Данный

вопрос рассматривается в главе 6.

 

 

АССЕМБЛИРОВАНИЕ ПРОГРАММЫ

________________________________________________________________

 

Для того, чтобы выполнить исходную ассемблерную программу, необходимо

прежде провести ее ассемблирование и затем компоновку. На дискете с

ассемблерным пакетом имеются две версии aссемблера. ASM.EXE - сокращенная

версия с отсутствием некоторых незначительных возможностей и MASM.EXE -

полная версия. Если размеры памяти позволяют, то используйте версию MASM

(подробности см. в соответствующем руководстве по ассемблеру).

Для ассемблирования, вставьте ассемблерную дискету в дисковод A, а

дискету с исходной программой в дисковод B. Кто имеет винчестер могут

использовать в следующих примеpах C вместо A и B. Простейший вариант

вызова программы это ввод команды MASM (или ASM), что приведет к загрузке

программы ассемблера с диска в память. На экране появится:

 

source filename [.ASM]:

object filename [filename.OBJ]:

source listing [NUL.LST]:

cross-reference [NUL.CRF]:

 

Курсор при этом расположится в конце первой строки, где необходимо

указать имя файла. Введите номер дисковода (если он не определен

умолчанием) и имя файла в следующем виде: B:EXASM1. Не следует набирать

тип файла ASM, так как ассемблер подразумевает это.

Во-втором запросе предполагается аналогичное имя файла (но можно его

заменить). Если необходимо, введите номер дисковода B:.

Третий запрос предполагает, что листинг ассемблирования программы не

требуется. Для получения листинга на дисководе B наберите B: и нажмите

Return.

Последний запрос предполагает, что листинг перекрестных cсылок не

требуется. Для получения листинга на дисководе B, наберите B: и нажмите

Return.

Если вы хотите оставить значения по умолчанию, то в трех последних

запросах просто нажмите Return. Ниже приведен пример запросов и ответов, в

результате которых ассемблер должен cоздать OBJ, LST и CRF-файлы. Введите

ответы так, как показано, за исключением того, что номер дисковода может

быть иной.

 

source filename [.ASM]:B:EXASM1 [Return]

object filename [filename.OBJ]:B: [Return]

source listing [NUL.LST]:B: [Return]

cross-reference [NUL.CRF]:B: [Return]

 

Всегда необходимо вводить имя исходного файла и, обычно, запрашивать

OBJ-файл - это требуется для компановки программы в загрузочный файл.

Возможно потребуется указание LST-файла, особенно, если необходимо

проверить сгенерированный машинный код. CRF-файл полезен для очень больших

программ, где необходимо видеть, какие команды ссылаются на какие поля

данных. Кроме того, ассемблер генерирует в LST-файле номера строк, которые

используются в CRF-файле.

В прил.4 "Режимы ассемблирования и редактирования" перечислены режимы

(опции) для ассемблера версий 1.0 и 2.0.

Ассемблер преобразует исходные команды в машинный код и выдает на

экран сообщения о возможных ошибках. Типичными ошибками являются нарушения

ассемблерных соглашений по именам, неправильное написание команд

(например, MOVE вместо MOV), а также наличие в опеpандах неопределенных

имен. Программа ASM выдает только коды ошибок, которые объяснены в

руководстве по ассемблеру, в то время как программа МASM выдает и коды

ошибок, и пояснения к ним. Всего имеется около 100 сообщений об ошибках.

Ассемблер делает попытки скорректировать некоторые ошибки, но в любом

случае следует перезагрузить текстовый редактор, исправить исходную

программу (EXASM1.ASM) и повторить ассемблирование.

 

 

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

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

В процессе трансляции исходной программы ассемблер делает два

просмотра исходного текста, или два прохода. Одной из основных причин

этого являются ссылки вперед, что происходит в том случае, когда в

некоторой команде кодируется метка, значение которой еще не определено

ассемблером.

В первом проходе ассемблер просматривает всю исходную прогpамму и

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

данных и меток программы и их относительных aдресов в программе. В первом

проходе подчитывается объем объектного кода, но сам объектный код не

генерируется.

Во втором проходе ассемблер использует таблицу идентификаторов,

построенную в первом проходе. Так как теперь уже известны длины и

относительные адреса всех полей данных и команд, то ассемблер может

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

требуется, файлы: OBJ, LST и CRF.

Директивы определения данных

Ассемблер обеспечивает два способа определения данных: во-первых,

через указание длины данных и, во-вторых, по их cодержимому. Рассмотрим

основной формат определения данных:

 

[имя] Dn выражение

 

Имя элемента данных не обязательно (это указывается квадратными

скобками), но если в программе имеются ссылки на некоторый элемент,

то это делается посредством имени.

Для определения элементов данных имеются следующие директивы: DB

(байт), DW (слово), DD (двойное слово), DQ (учетверенное слово) и DT

(десять байт).

Выражение может содержать константу, например:

 

FLD1 DB 25

 

или знак вопроса для неопределенного значения, например

 

FLDB DB?

 

Выражение может содержать несколько констант, разделенных запятыми и

ограниченными только длиной строки:

 

FLD3 DB 11, 12, 13, 14, 15, 16,...

 

Ассемблер определяет эти константы в виде последовательности cмежных байт.

Ссылка по имени FLD3 указывает на первую константу, 11, по FLD3+1 - на

вторую, 12. (FLD3 можно представить как FLD3+0). Например команда

 

MOV AL,FLD3+3

 

загружает в регистр AL значение 14 (шест. 0E). Выражение допускает также

повторение константы в следующем формате:

 

[имя] Dn число-повторений DUP (выражение)...

 

Следующие три примера иллюстрируют повторение:

 

DW 10 DUP(?);Десять неопределенных слов

DB 5 DUP(14);Пять байт, содержащих шест.14

DB 3 DUP(4 DUP(8));Двенадцать восьмерок

 

В третьем примере сначала генерируется четыре копии десятичной 8

(8888), и затем это значение повторяется три раза, давая в pезультате

двенадцать восьмерок.

Выражение может содержать символьную строку или числовую константу.

 

 

Символьные строки

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

Символьная строка используются для описания данных, таких как,

например, имена людей или заголовки страниц. Содержимое строки oтмечается

одиночными кавычками, например, 'PC' или двойными кавычками - "PC".

Ассемблер переводит символьные строки в объектный код в обычном формате

ASCII.

Символьная строка определяется только директивой DB, в котоpой

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

направо. Следовательно, директива DB представляет единственно возможный

формат для определения символьных данных.

Числовые константы

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

Числовые константы используются для арифметических величин и для

aдресов памяти. Для описания константы кавычки не ставятся. Ассемблер

преобразует все числовые константы в шестнадцатеричные и записывает байты

в объектном коде в обратной последовательности - справа налево. Ниже

показаны различные числовые форматы.

 

Д е с я т и ч н ы й ф о р м а т. Десятичный формат допускает

десятичные цифры от 0 до 9 и обозначается последней буквой D, которую

можно не указывать, например, 125 или 125D. Несмотря на то, что ассемблер

позволяет кодирование в десятичном формате, он преобразует эти значения в

шест. объектный код. Например, десятичное число 125 преобразуется в шест.

7D.

 

Ш е с т н а д ц а т и р и ч н ы й ф о р м а т. Шестнадцатиричный

формат допускает шест. цифры от 0 до F и обозначается последней буквой H.

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

первой цифрой шест. константы должна быть цифра от 0 до 9. Например, 2EH

или 0FFFH, которые ассемблер преобразует соответственно в 2E и FF0F (байты

во втором примере записываются в объектный код в обратной

последовательности).

 

Д в о и ч н ы й ф о р м а т. Двоичный формат допускает двоичные

цифры 0 и 1 и обозначается последней буквой B. Двоичный формат обычно

используется для более четкого представления битовых значений в логических

командах AND, OR, XOR и TEST. Десятичное 12, шест. C и двоичное 1100B все

генерируют один и тот же код: шест. 0C или двоичное 0000 1100 в

зависимости от того, как вы рассматриваете содержимое байта.

 

В о с ь м е р и ч н ы й ф о р м а т. Восьмеричный формат допускает

восьмеричные цифры от 0 до 7 и обозначается последней буквой Q или O,

например, 253Q. На сегодня восьмеричный формат используется весьма редко.

 

Д е с я т и ч н ы й ф о р м а т с п л а в а ю щ е й т о ч к о й.

Этот формат поддерживается только ассемблером МASM.

 

При записи символьных и числовых констант следует помнить, что,

например, символьная константа, определенная как DB '12', представляет

символы ASCII и генерирует шест.3132, а числовая константа, oпределенная

как DB 12, представляет двоичное число и генерирует шест.0C.

Рис.5.1 иллюстрирует директивы для определения различных символьных

строк и числовых констант. Сегмент данных был ассемблирован для того,

чтобы показать сгенерированный объектный код (слева).

Непосредственные операнды

Использование непосредственного операнда более эффективно, чем

oпределение числовой константы в сегменте данных и организация cсылки на

нее в операнде команды MOV

Длина непосредственной константы зависит от длины первого операнда.

 

однако, если непосредственный операнд короче, чем получающий операнд

 

то ассемблер расширяет непосредственный операнд до двух байт.

 

Непосредственные форматы

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

Непосредственная константа может быть шестнадцатиричной, напpимер,

0123H; десятичной, например, 291 (которую ассемблер конвертирует в

шест.0123); или двоичной, например, 100100011В (которая преобразуется в

шест. 0123).

Ниже приведен список команд, которые допускают непосредственные

операнды:

 

Команды пересылки и сравнения: MOV, CMP.

Арифметические команды: ADC, ADD, SBB, SUB.

Команды сдвига: RCL, RCR, ROL, ROR, SHL, SAR, SHR.

Логические команды: AND, OR, TEST, XOR.



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 592; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.116.85.72 (0.057 с.)