- •Программное управление — основа автоматизации вычислительного процесса
- •2 Состав машинных команд
- •3 Режимы работы компьютеров
- •3.1 Однопрограммные и многопрограммные режимы
- •I.Система прерываний программ в пк
- •3.2 Адресация регистров и ячеек памяти в пк
- •3.3 Относительная адресация
- •II.Стековая адресация
- •3.4 Элементы программирования на языке ассемблер
- •4 Основные компоненты языка ассемблер
- •4.1Алфавит языка
- •4.2 Константы (числа и строки)
- •4.3 Директивы (псевдооператоры)
- •4.4 Модификаторы
- •4.5 Адресация регистров и ячеек памяти в ассемблере
- •4.6 Непосредственная адресация
- •4.7 Прямая адресация регистров мпп
- •4.8 Адресация ячеек оп
- •Основные команды языка ассемблер
- •A.Команды пересылки данных
- •I.Команды сложения, вычитания и сравнения
- •1.Команды приращения
- •A.Команды умножения
- •I.Команды безусловной передачи данных
- •4.9 Команды перехода к подпрограмме и выхода из подпрограммы
- •4.10 Команда перехода к подпрограмме: call opr
- •4.11 Команда выхода из подпрограммы
- •4.12 Команды условной передачи управления
- •4.13 Команды условной передачи управления для беззнаковых данных
- •4.14 Команды условной передачи управления для знаковых данных
- •4.15 Команды условной передачи управления для прочих проверок
- •4.16 Команды управления циклами
- •4.17 Команды прерывания
- •4.18Основные директивы ассемблера
- •4.19 Директивы определения идентификаторов
- •4.20 Директивы определения данных
- •Директивы определения сегментов и процедур
- •4.21 Директивы управления трансляцией
- •5 Краткие сведения о программировании процедур работы с устройствами ввода-вывода
- •5.1 Программирование работы с дисплеем
- •5.2 Видеооперации с прерыванием 10н bios
- •5.3 Видеооперации с прерыванием 21н dos
- •5.4 Программирование работы с клавиатурой
- •5.5 Программирование работы с принтерами
- •5.6 Печатающие устройства параллельного типа
- •5.7 Печатающее устройство последовательного типа
- •5.8 Программирование работы с файлами
- •5.9 Прерывания, используемые при работе с файлами на дисках
- •5.10 Некоторые аспекты создания исполняемых программ
- •5.11 Процедуры формирования программы
- •5.12 Структура исходной программы на языке ассемблера для получения исполняемой программы .Ехе
- •5.13 Основные сведения о листинге и его структуре
- •5.14 Особенности структуры машинных команд
- •5.14 Последовательность работы пк при выполнении программы
- •6 Краткие сведения об отладчике программ debug
- •6.1 Основные команды отладчика debug
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].
