7.5.2.5. Выбор операнда

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

 

 

 

HotLog

Заказчику web дизайна и программирования - каталог сайтов, обзор дизайн студий