Вероятно регистровые операнды являются наиболее часто используемыми в инструкциях операндами. Регистры могут использоваться в качестве источника (исходный операнд) или приемника (целевой операнд) и при некоторых обстоятельствах могут даже содержать адрес, на который нужно выполнить переход. С регистрами можно делать много того, чего нельзя делать с константами, метками или переменными в памяти. С другой стороны, имеются некоторые инструкции, в которых можно использовать только регистровые операнды.
Приведем некоторые примеры регистровых операндов:
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
.
.
.
Нужно изучить каждый отдельный случай, когда использование констант не допускается. К счастью, таких инструкций немного, и Турбо Ассемблер, конечно, даст вам знать, если вы пытаетесь использовать константу некорректно.
