Любая команда либо не использует операндов вообще, либо использует некоторое число операндов. Примером команды без операндов может служить команда 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 или указывается непосредственно в команде. Другие команды с тремя операндами, такие как команды обработки строк с префиксом повторения, берут все три операнда из регистров.