Регистровые операнды


Вероятно регистровые операнды являются наиболее часто используемыми в инструкциях операндами. Регистры могут использоваться в качестве источника (исходный операнд) или приемника (целевой операнд) и при некоторых обстоятельствах могут даже содержать адрес, на который нужно выполнить переход. С регистрами можно делать много того, чего нельзя делать с константами, метками или переменными в памяти. С другой стороны, имеются некоторые инструкции, в которых можно использовать только регистровые операнды.

Приведем некоторые примеры регистровых операндов:

mov al,ax

push dl

xchg al,dl

ror dx,cl

in al,dx

inc sl

Регистровые операнды могут использоваться вместе с другими операндами:

mov al,1

add [BaseCount],cx

cmp si,[bx]

Использование регистровых операндов не требует обширных пояснений. Чтобы использовать регистр в качестве операнда, вы задаете имя этого регистра и использующую регистр инструкцию. Если имеется два операнда и регистровым операндом является самый правый операнд, то он будет исходным регистром (источником), а если самым левым операндом то это целевой регистр (приемник). Если в инструкции требуется два источника, то может присутствовать еще один исходный регистр. Например, во фрагменте программы:

mov cx,1

mov dx,2

sub dx,cx

регистр CX устанавливается в значение 1, DX в значение 2, а затем из регистра DX вычитается CX и результат (1) снова записывается в регистр DX. В инструкции SUB CX является правым операндом, поэтому это исходный регистр (источник). DX самый левый операнд, поэтому он одновременно является вторым источником и приемником. Кстати, действие данной инструкции SUB (вычитание) выражается словами, как «вычесть CX из DX». Использование метода преобразования в код языка Си для облегчения запоминания инструкций позволяет преобразовать данную инструкцию SUB к виду:

dx = cx;

а на Паскале это будет выглядеть, как:

dx := dx cx;

Операндыконстанты

Регистры прекрасно подходят для хранения значений переменных, но часто в операндах требуется использовать постоянное значение. Например, предположим, вы хотите в цикле уменьшать значение регистра SI на 4, повторяя цикл, пока значение SI не станет равным 0. Можно использовать следующие операции:

CountByFourLoop:

dec si

dec si

dec si

dec si

jnz CountByFourLoop

Однако намного проще использовать инструкции:

CountByFourLoop:

sub si,1

jnz CountByFourLoop

В качестве постоянных операндов (операндовконстант) можно использовать также символы, поскольку символ представляет собой определенное значение. Например, так как символ A имеет десятичное значение 65, то следующие две инструкции эквивалентны:

sub al,’A’

sub al,65

Постоянные значения можно задавать в двоичном, восьмеричном или шестнадцатиричном представлении, а также в десятичном виде. Указанные формы представления чисел мы обсудим позднее в разделе «Биты, байты и основания».

Операндыконстанты никогда не могут при использовании двух операндов располагаться слева, так как невозможно использовать константу в качестве операндаприемника (это противоречит определению константы, как неизменяемой величины). Операндыконстанты, однако, могут прекрасно использоваться в том месте, где имеет смысл использование значения в качестве исходного операнда. Процессор 8086 накладывает на использование констант некоторые ограничения. Например, вы не можете занести значениеконстанту в стек (это ограничение касается только процессоров 8086/8088). Чтобы занести в стек значение 5, вы должны выполнить две инструкции:

.

.

.

mov ax,5

push ax

.

.

.

Нужно изучить каждый отдельный случай, когда использование констант не допускается. К счастью, таких инструкций немного, и Турбо Ассемблер, конечно, даст вам знать, если вы пытаетесь использовать константу некорректно.

Загрузка...