Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МАВЦ.464319.001ТУ 20140414 Семенов.doc
Скачиваний:
10
Добавлен:
01.07.2025
Размер:
2.98 Mб
Скачать

5.13 Основные сведения о листинге и его структуре

Листинг (распечатка) программы на ассемблере используется как при создании ассемблерных программ, так и в качестве источника информации для квалифици­рованных программистов при отладке и оптимизации программ, написанных на языках высокого уровня. Ни один другой компилятор и его листинг не дает про­граммисту такого количества полезной технической информации, как ассемблер. Ведь одна из основных целей использования языков высокого уровня — как раз желание избежать не очень существенных технических подробностей. Но если программист хочет разобраться с подробностями созданной программы, то боль­шинство отладчиков могут распечатать эквивалент созданной объектной програм­мы на языке ассемблера. Эти распечатки позволяют программисту оценить каче­ство программы и являются весьма полезными при ее оптимизации.

Листинг состоит из двух частей: из листинга программы и сводной информации о сегментах и идентификаторах программы.

Листинг программы имеет три столбца, в которых содержит команды исходной ассемблерной программы и соответствующие им объектные коды:

  • левый столбец содержит шестнадцатеричное значение смещения адреса коман­ды (счетчик команд — IP) от начала сегмента;

  • правый столбец содержит операторы и псевдооператоры ассемблера (команды и директивы программы);

  • в средней части размещены коды: для сегмента стека и сегмента данных — чис­ла, запоминаемые в соответствующих ячейках памяти; для сегмента команд это коды машинных команд МП, соответствующих операторам ассемблера.

Сводная информация о сегментах и идентификаторах дает подробную их характе­ристику.

В конце листинга приводятся сообщения об ошибках в программе.

При ассемблировании и редактировании связей могут быть получены еще два ли­стинга с дополнительной информацией:

  • листинг перекрестных ссылок указывает номер строки программы, в которой определен каждый идентификатор, и номер тех строк, в которых имеются на него ссылки (этот листинг можно получить, если на запрос ассемблера о Cross reference ввести имя файла prog (а не NuLCRF — по умолчанию), при этом в ос­новном листинге программы добавится столбец с номерами строк); а листинг распределения памяти содержит подробные сведения о сегментах всех блоков программы, объединяемых загрузчиком LINK (листинг содержится в фай­ле prog.map).

5.14 Особенности структуры машинных команд

Объектные коды, приведенные в среднем столбце листинга, — это, по существу, машинная исполняемая (.ЕХЕ или .СОМ) программа, записанная в шестнадцатеричных кодах.

Структура команды в исполняемой программе может существенно отличаться от породившей ее команды ассемблера. Например, стандартная двухадресная коман­да типа mov, add, sub, and и т. д. с адресацией типа т, г или г, т в исполняемой програм­ме может занимать 4 байт.

КОП

d

w

mod

reg

r/m

disp L

disp H

Первый байт (байт кода операции) содержит код операции (КОП) и два однобит­ных поля: d (направление) и w (слово). Поле d определяет направление передачи данных (записи результата) внутри команды. Если d=l, то передача в reg, если d=0, то передача из reg. Поле w определяет формат данных: слово (w=l) или байт (w=0).

Второй байт команды (байт способа адресации) имеет три поля: reg (адрес регист­ра, где находится один из операндов), mod (режим адресации) и г/т (регистр/па­мять). Если mod=ll, то второй из операндов находится тоже в регистре и поле г/m — адрес этого регистра. Если mod><ll, то второй из операндов находится в памяти, причем при mod=00: d1sp=0 — смещение отсутствует (нет полей dispL и dispH), при mod=01: disp=d1 spL — старший байт смещения отсутствует, при mod=10: di sp=d1 spH, dispL (есть оба байта смещения). Поля mod><ll и r/m (reg) определяют способ формиро­вания исполнительного адреса (Лисп), как показано в табл. 9.1.

Таблица 9.1. Способы формирования исполнительного адреса

r/m или reg

mod=00

mod=01

mod=10

mod=11 w=0

w=1

000

BX+SI

BX+SI+disp

BX+SI+disp

AL

AX

001

BX+DI

BX+DI+disp

BX+DI+disp

CL

CX

010

BP+SI

BP+SI+disp

BP+SI+disp

DL

DX

011

BP+DI

BP+DI+disp

BP+DI+disp

BL

BX

100

SI

Sl+disp

Sl+disp

AH

SP

101

DI

Dl+disp

Dl+disp

CH

BP

110

disp*

BP+disp

BP+disp

DH

SI

111

BX

BX+disp

BX+disp

BH

DI

Если mod=00 и r/m=110, то Aисп = dispH, dispL — исполнительный адрес находится в команде (прямая адресация).

Третий и четвертый байты команды рассматриваемой структуры содержат 16-би­товый код смещения поля памяти второго операнда (dispH — старший байт, dispL — младший байт).

Более подробно с объектными кодами команд ассемблера можно познакомиться в работах [10, 35].