- •Введение
- •1. Особенности персонального компьютера
- •1.1. Оперативная память
- •1.2. Регистры
- •1.3. Представление данных
- •1.4. Представление команд
- •2. Язык ассемблера. Начальные сведения
- •2.1. Лексемы
- •2.2. Предложения
- •2.3. Директивы определения данных
- •2.4. Директивы эквивалентности и присваивания
- •2.5. Выражения
- •3. Пересылки. Арифметические команды
- •3.1. Обозначения операторов команд
- •3.2. Команды пересылки
- •3.3. Команды сложения и вычитания
- •3.4. Команды умножения и деления
- •3.5. Изменение размера числа
- •3.6. Примеры
- •3.7. Лабораторная работа № 1
- •4. Переходы. Циклы
- •4.1. Безусловный переход
- •4.2. Команды сравнения и условного перехода
- •4.3. Команды управления циклом
- •4.4. Вспомогательные операции ввода-вывода
- •4.5. Массивы
- •4.6. Лабораторная работа № 2
- •5. Программные сегменты
- •5.1. Сегментирование адресов в пк
- •5.2. Программные сегменты
- •5.3. Начальная загрузка сегментных регистров
- •5.4. Структура программы
- •6. Стек
- •6.1. Стек и сегмент стека
- •6.2. Стековые команды
- •6.3. Приемы работы со стеком
- •7. Процедуры
- •7.1. Дальние переходы
- •7.2. Подпрограммы-процедуры
- •7.3. Передача параметров через регистры
- •7.4. Передача параметров через стек
- •7.5. Локальные данные процедур
- •7.6. Лабораторная работа № 3
- •8. Ввод и вывод данных
- •8.1. Реализация основных операций ввода-вывода
- •8.2. Операции ввода-вывода
- •8.3. Пример структуры программы
- •Заключение
- •Библиографический список
- •Оглавление
- •Учебное издание
- •394026 Воронеж, Московский просп., 14
1.4. Представление команд
Машинные команды ПК занимают от 1 до 6 байтов.
Код операции (КОП) занимает один или два первых байта команды. В ПК столь много различных операций, что для них не хватает 256 различных кодов, которые можно представить в одном байте. Поэтому некоторые операции объединяются в группу и им дается один и тот же КОП, во втором же байте этот код уточняется. Кроме того, во втором байте указываются типы операндов и способы их адресации. В остальных байтах команды указываются ее операнды.
Команды ПК могут иметь от 0 до 2 операндов. Размер операндов – байт или слово (редко – двойное слово). Операнд может быть указан в самой команде (это так называемый непосредственный операнд), либо может находиться в одном из регистров ПК и тогда в команде указывается этот регистр, либо может находиться в ячейке памяти и тогда в команде тем или иным способом указывается адрес этой ячейки. Некоторые команды требуют, чтобы их операнд находился в фиксированном месте (например, в регистре АХ), и тогда операнд явно не указывается в команде. Результат выполнения команды помещается в регистр или ячейку памяти, откуда берется один из операндов. Например, большинство команд с двумя операндами реализуют действие
op1 := op1 * op2
где op1 – регистр или ячейка памяти, а op2 – непосредственный операнд, регистр или ячейка памяти, а * – операция, заданная КОПом.
Форматы машинных команд в ПК достаточно разнообразны и «затейливы». Для примера будут рассмотрены лишь основные форматы команд с двумя операндами.
Формат «регистр – регистр» (2 байта) (рис. 14).
Рис. 14. Формат команды «регистр – регистр»
Команды этого формата описывают обычно действие regl:=regl*reg2 или reg2:=reg2*regl, где regl и reg2 - регистры общего назначения. Поле КОП первого байта указывает на операцию (*), которую надо выполнить. Бит w определяет размер операндов, а бит d указывает, в какой из двух регистров записывается результат:
Во втором байте два левых бита, фиксированы (для данного формата), а трехбитовые поля reg1 и reg2 указывают на регистры, участвующие в операции, согласно табл. 1.
Таблица 1
Соответствие значений полей reg1 и reg2 и имен регистров
reg w=1 w=0 |
reg w=1 w=0 |
000 AX AL 001 CX CL 010 DX DL 011 BX BL |
100 SP AH 101 BP CH 110 SI DH 111 DI BH |
Формат «регистр – память» (2-4 байта) (рис. 15).
Рис. 15. Формат команды «регистр – память»
Эти команды описывают операции reg:=reg*adr или adr:=adr*reg, где reg – регистр, a adr – адрес ячейки памяти. Бит w первого байта определяет размер операндов (см. выше), а бит d указывает, куда записывается результат: в регистр (d=1) или в ячейку памяти (d=0). Трехбитовое поле reg второго байта указывает операнд-регистр (см. выше), двухбитовое поле mod определяет, сколько байтов в команде занимает операнд-адрес (00 – 0 байтов, 01 – 1 байт, 10 – 2 байта), а трехбитовое поле mem указывает способ модификации этого адреса. В табл. 2 указаны правила вычисления исполнительного адреса в зависимости от значений полей mod и mem (а8 – адрес размером в байт, а16 – размером в слово, [r] – содержимое регистра r).
Таблица 2
Правила вычисления исполнительного адреса
Mem\mod |
00 |
01 |
10 |
000 001 010 011 100 101 110 111 |
[BX]+[SI] [BX]+[DI] [BP]+[SI] [BP]+[DI] [SI] [DI] a16 [BX] |
[BX]+[SI]+a8 [BX]+[DI]+a8 [BP]+[SI]+a8 [BP]+[DI]+a8 [SI]+a8 [DI]+a8 [BP]+a8 [BX]+a8 |
[BX]+[SI]+a16 [BX]+[DI]+a16 [BP]+[SI]+a16 [BP]+[DI]+a16 [SI]+a16 [DI]+a16 [BP]+a16 [BX]+a16 |
Замечания. Если в команде не задан адрес, то он считается нулевым. Если адрес задан в виде байта (а8), то он автоматически расширяется до слова (а16). Случай mod=00 и mem=110 указывает на отсутствие регистров-модификаторов, причем адрес должен иметь размер слова. Случай mod=11 соответствует формату «регистр-регистр».
Формат «регистр – непосредственный операнд» (3-4 байта) (рис. 16)
Рис. 16. Формат команды «регистр – непосредственный
операнд»
Команды этого формата описывают операции reg:=reg*im (im – непосредственный операнд). Бит w указывает на размер операндов, а поле reg – на регистр операнд (см. выше). Поле КОП в первом байте определяет лишь группу операций, в которую входит операция данной команды, уточняет же операцию поле КОП' из второго байта. Непосредственный операнд может занимать 1 или 2 байта (в зависимости от значения бита w), при этом операнд размером в слово записывается в команде в «перевернутом» виде. Ради экономии памяти в ПК предусмотрен случай, когда в операции над словами непосредственный операнд может быть задан байтом (на это указывает 1 в бите s при w=l), и тогда перед выполнением операции байт автоматически расширяется до слова.
Формат «память – непосредственный операнд» (3-6 байтов) (рис. 17).
Рис. 17. Формат команды «память – непосредственный
операнд»
Команды этого формата описывают операции типа adr:=adr*im. Смысл всех полей – тот же, что и в предыдущих форматах.
Уже из рассмотренных форматов команд видно, что записывать машинные команды ПК в цифровом виде - вещь достаточно громоздкая. Сложности возникают и при записи данных; например, знаковые числа приходится представлять в дополнительном коде, а затем еще и «переворачивать». Поэтому нужен какой-то иной, более удобный способ записи команд и данных. И таким способом является язык ассемблера.