Любая команда
либо не использует операндов вообще, либо использует некоторое число операндов.
Примером команды без операндов может служить команда NOP (нет операции). Если
же команда использует операнды, они могут находится в одном из ниже указанных
мест:
- В самой команде
(непосредственный операнд, константа).
- В регистре ( 32-разрядный
операнд в регистре EAX, EBX, ECX, EDX, ESI, EDI, ESP или EBP, 16-разрядный
операнд в регистре AX, BX, CX, DX, SI, DI, SP или BP, 8-разрядный операнд в
регистре AH, AL, BH, BL, CH, CL, DH или DL, в одном из сегментных регистров, в
регистре EFLAGS для операций с флагами). Использование 16-разрядных операндов
требует использования префикса размера 16-разрядного операнда (байта,
предшествующего команде и содержащего значение 67H).
* В памяти.
* В порте
ввода/вывода
Доступ ко всем операндам
осуществляется очень быстро. Регистровые и непосредственные операнды находятся
непосредственно в процессоре (последние занесены в процессор в результате
упреждающей выборки как часть интерпретируемой команды). Доступ к операндам,
находящимся в памяти осуществляется тоже довольно быстро, если они помещены в
кэш-память на микросхеме.
Часть команд, в
которых предусмотрено использование операндов, требует явного указания
операндов, другие - используют неявно заданные операнды. Некоторые команды
имеют как явные, так и неявные операнды. Примеру:
Команда с неявным
операндом: AAM
По определению,
операнд команды AAM (ASCII-коррекция после умножения) содержится в регистре AX.
Команда с явными
операндами: XCHG EAX, EBX
Операнды, для
которых выполняется обмен содержимым, закодированы непосредственно в команде,
вместе с кодом операции.
Команда с явным и
неявным операндом: PUSH COUNTER
Переменная
расположенная в памяти COUNTER (явный параметр) копируется в вершину стека
(неявный параметр).
Особенно важно,
что большинство команд имеют неявные операнды. Например, все арифметические
операции обновляют регистр EFLAGS.
Команды могут
явно ссылаться на один или два операнда. Команды с двумя операндами, такие как
MOV, ADD и XOR всегда перезаписывают один из двух операндов, помещая туда
результат операции. Это позволяет выделить два вида операндов: операнд-источник
(не изменяется при выполнении операции) и операнд назначения (приемник) (в
который записывается результат операции).
Для большинства
команд, один из двух операндов - либо операнд-источник, либо операнд
назначения, может располагается в регистре или памяти. Второй операнд должен
располагаться в регистре или непосредственно в команде (последнее только для
операнда-источника). Это позволяет разбить команды, работающие с двумя
операндами на следующие группы:
- Регистр -
регистр
- Регистр -
память
- Память -
регистр
-
Непосредственный операнд - регистр
-
Непосредственный операнд - память
Однако, некоторые
команды работы со строками и со стеком, перемещают данные из памяти в память.
Оба операнда некоторых команд обработки строк расположены в памяти и
указываются неявно. Операции занесения в стек и удаления из стека позволяют
переносить данные из операнда, расположенного в памяти в стек, также
расположенный в памяти.
Кроме того,
существует несколько операций, использующих три операнда, например, команды
IMUL, SHRD и SHLD. Два операнда из трех указываются явно, как в командах с
двумя операндами, а третий операнд берется из регистра ECX или указывается
непосредственно в команде. Другие команды с тремя операндами, такие как команды
обработки строк с префиксом повторения, берут все три операнда из регистров.