8-, 16– или 32-разрядное целое число со знаком, представляющее собой, полностью или частично (с учетом вышеприведенных рассуждений), значение эффективного адреса операнда.
6. Поле непосредственного операнда. Необязательное поле, представляющее собой 8-, 16– или 32-разрядный непосредственный операнд. Наличие этого поля, конечно, отражается на значении байта modr/m.
2. Способы задания операндов
В ходе предыдущего изложения мы касались вопроса о том, где располагаются операнды, с которыми работает машинная команда, и как это отражается на содержимом ее полей. Рассмотрим этот вопрос более систематизировано и в полном объеме.
Операнд задается неявно на микропрограммном уровне. В этом случае команда явно не содержит операндов. Алгоритм выполнения команды использует некоторые объекты по умолчанию (регистры, флаги в eflags и т. д.).
Операнд задается в самой команде (непосредственный операнд). Операнд находится в коде команды, то есть является ее частью. Для хранения такого операнда в команде выделяется поле длиной до 32 бит. Непосредственный операнд может быть только вторым операндом (источником). Операнд-получатель может находиться либо в памяти, либо в регистре. Например, mov ax,0ffffh пересылает в регистр ах шестнадцатеричную константу ffff. Команда add sum,2 складывает содержимое поля по адресу sum с целым числом 2 и записывает результат по месту первого операнда, то есть в память.
Операнд находится в одном из регистров. Регистровые операнды указываются именами регистров. В качестве регистров могут использоваться:
- 32-разрядные регистры ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, ESP, EBP;
- 16-разрядные регистры АХ, ВХ, СХ, DX, SI, DI, SP, ВР;
- 8-разрядные регистры АН, AL, BH, BL, CH, CL, DH, DL;
- сегментные регистры CS, DS, SS, ES, FS, GS.
Например, команда add ax,bx складывает содержимое регистров ах и bх и записывает результат в bх. Команда dec si уменьшает содержимое si на 1.
Операнд располагается в памяти. Это наиболее сложный и в то же время наиболее гибкий способ задания операндов. Он позволяет реализовать следующие два основных вида адресации:
- прямую адресацию;
- косвенную адресацию.
В свою очередь, косвенная адресация имеет следующие разновидности:
косвенная базовая адресация; другое ее название — регистровая косвенная адресация;
косвенная базовая адресация со смещением;
косвенная индексная адресация со смещением;
косвенная базовая индексная адресация;
косвенная базовая индексная адресация со смещением.
Операндом является порт ввода-вывода. Помимо адресного пространства оперативной памяти микропроцессор поддерживает адресное пространство ввода-вывода, которое используется для доступа к устройствам ввода-вывода. Объем адресного пространства ввода-вывода составляет 64 Кбайт. Для любого устройства компьютера в этом пространстве выделяются адреса. Конкретное значение адреса в пределах этого пространства называется портом ввода-вывода. Физически порту ввода-вывода соответствует аппаратный регистр (не путать с регистром микропроцессора), доступ к которому осуществляется с помощью специальных команд ассемблера in и out. Например:
in al ,60h ; ввести байт из порта 60h
Регистры, адресуемые с помощью порта ввода-вывода, могут иметь разрядность 8, 16 или 32 бит, но для конкретного порта разрядность регистра фиксирована. Команды in и out работают с фиксированной номенклатурой объектов. В качестве источника информации или получателя применяются так называемые регистры-аккумуляторы еах, ах, al. Выбор регистра определяется разрядностью порта. Номер порта может задаваться непосредственным операндом в командах in и out или значением в регистре dx. Последний способ позволяет динамически определить номер порта в программе. Например:
mov dx,20h ;записать номер порта 20п в регистр dx
mov al ,20h ;записать значение 20h в регистр al
out dx ,al ;вывести значение 20h в порт 20Н
Операнд находится в стеке.
Команды могут совсем не иметь операндов, иметь один или два операнда. Большинство команд требует двух операндов, один из которых является операндом-источником, а второй — операндом назначения. Важно то, что один операнд может располагаться в регистре или памяти, а второй операнд обязательно должен находиться в регистре или непосредственно в команде. Непосредственный операнд может быть только операндом-источником.
В двухоперандной машинной команде возможны следующие сочетания операндов:
регистр–регистр;
регистр–память;
память–регистр;
непосредственный операнд–регистр;
непосредственный операнд–память.
Для данного правила есть исключения, которые касаются:
– команд работы с цепочками, которые могут перемещать данные из памяти в память;
– команд работы со стеком, которые могут переносить данные из памяти в стек, также находящийся в памяти;
– команд типа умножения, которые, кроме операнда, указанного в команде, используют еще и второй, неявный операнд.
Из перечисленных сочетаний операндов наиболее часто употребляются регистр–память и память–регистр. Адрес операнда формируется как сумма двух составляющих – сдвинутого на 4 бита содержимого сегментного регистра и 16-битного эффективного адреса, который в общем случае вычисляется как сумма трех компонентов: базы, смещения и индекса.
Рассмотрим особенности основных видов адресации операндов в памяти.