Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
19
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

250, Которое ассемблер транслирует в шест.00fa (см. На рисунке слева).

Поле FLDB определяет слово с десятичным значением 125, котоpое

транслируется в шест.007D. Действительные значения этих двух констант в

памяти - FA00 и 7D00 соответственно, что можно проверить c помощью

отладчика DEBUG.

Поле FLDC определяет слово с неизвестным значением, обозначенным

знаком вопроса (?).

Сегмент кода в данном примере имеет имя CODESG и отличается новыми

особенностями, связанными с сегментом данных. Во-первых, директива ASSUME

указывает на определение DATASG через регистр DS. Данной программе не

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

стандартизации. Во-вторых, после команд PUSH, SUB и PUSH, которые

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

сегмента данных:

0004 B8 ---- r mov ax,datasg

0007 8E D8 MOV DS,AX

Первая команда MOV загружает DATASG в регистр AX. Конечно, на самом

деле команда не может загрузить сегмент в регистр - она загружает лишь

адрес сегмента DATASG. Обратите внимание на машинный код слева:

B8 ---- R

Четыре дефиса говорят о том, что ассемблер не может определить aдрес

DATASG; он определяется лишь когда объектная программа будет скомпонована

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

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

и показывает это символом R; компоновщик должен будет подставить в это

место действительный адрес.

Вторая команда MOV пересылает содержимое регистра AX в регистр DS.

Таким образом, данная программа имеет директиву ASSUME, которая соотносит

регистр DS с сегментом данных, и команды, инициализирующие регистр DS

относительным адресом DATASG.

Могут возникнуть два вопроса по поводу этой программы. Во-первых,

почему не использовать одну команду для инициализации регистра DS,

например

MOV DS,DATASG ?

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

данных из памяти в регистр DS. Следовательно, для инициализации DS

необходимо кодировать две команды.

Во-вторых, почему программа инициализирует регистр DS, а регистры SS

и CS нет? Оказывается, регистры SS и CS инициализируются автоматически при

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

регистра DS и, если требуется ES, лежит полностью на самой программе.

Пока все эти требования могут показаться весьма туманными, но cейчас

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

аналогичную стандартную инициализацию стека и сегмента данных. Поэтому

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

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

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

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

В качестве упражнения, создайте с помощью вашего редактора программу,

приведенную на рис.4.3, выполните ее ассемблирование и компоновку. Затем с

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

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

ФАЙЛ ПЕРЕКРЕСТНЫХ ССЫЛОК

________________________________________________________________

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

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

на метки, идентификаторы и переменные в программе. Для получения данного

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

файл должен быть создан на диске B:

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

Далее необходимо преобразовать полученный CRF-файл в отсортиpованную

таблицу перекрестных ссылок. Для этого на ассемблерном диске имеется

соответствующая программа. После успешного ассемблирования введите команду

CREF. На экране появится два запроса:

Cref filename [.CRF]:

List filename [cross-ref.REF]:

На первый запрос введите имя CRF-файла, т.е. B:EXASM1. На второй

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

Такой выбор приведет к записи CRF в файл перекрестных ссылок по имени

EXASM1.REF на дисководе B.

Для распечатки файла перекрестных ссылок используйте команду DOS

PRINT. В приложении 4 приведен ряд режимов программы CREF.

__________________________________________________________________________

EXASM2 (EXE) Операции пересылки и сложения

Symbol Cross Reference (# is definition) Cref-1

BEGIN. . . . . . . . . . . . 18# 30 32

CODE . . . . . . . . . . . . 17

CODESG . . . . . . . . . . . 17# 19 31

DATA . . . . . . . . . . . . 11

DATASG . . . . . . . . . . . 11# 15 19 23

FLDA . . . . . . . . . . . . 12# 26

FLDB . . . . . . . . . . . . 13# 27

FLDC . . . . . . . . . . . . 14# 28

STACK. . . . . . . . . . . . 4

STACKSG. . . . . . . . . . . 4# 9 19