
- •Для бакалавров, обучающихся по направлению 230400
- •2. Регистры
- •2.1. Регистр флагов
- •2.2. Регистры общего назначения
- •2.3. Индексные регистры
- •2.4. Регистры - указатели
- •2.5. Указатель инструкций
- •2.6. Сегментные регистры
- •3. Вывод символов на экран
- •Int 21h ; завершить программу
- •4. Метки
- •5. Операнды
- •5.1. Регистровые операнды
- •5.2. Постоянные операнды
- •6. Работа со стеком
- •7. Арифметические операции
- •8. Пример прикладной программы
- •9. Задания
- •10. Контрольные вопросы
5. Операнды
Мнемоники инструкций и директивы сообщают Ассемблеру, что нужно делать. С другой стороны, операнды указывают Ассемблеру, какие регистры, параметры, ячейки памяти и т.д. нужно связать с каждым вхождением инструкции или директивы. Инструкция MOV (перемещение данных) сама по себе ничего не означает. Чтобы указать Ассемблеру, откуда нужно извлечь перемещаемое значение и где его сохранить, необходимы операнды.
Для различных инструкций требуются 0, 1, 2 или более операндов. В действительности различными директивами может восприниматься любое число операндов, которое может уместиться на одной строке. Правильное число операндов зависит от конкретной инструкции или директивы. (В общем случае допускается три операнда.) Возможные операнды включают в себя регистры, константы, метки, переменные в памяти и текстовые строки. Когда процессор 8086 выполняет инструкцию:
mov ax,bx
инструкция MOV помещает содержимое BX в AX.
5.1. Регистровые операнды
Регистровые операнды являются наиболее часто используемыми в инструкциях операндами. Регистры могут использоваться в качестве источника (исходный операнд) или приемника (целевой операнд) и при некоторых обстоятельствах могут даже содержать адрес, на который нужно выполнить переход. С регистрами можно делать много того, чего нельзя делать с константами, метками или переменными в памяти. С другой стороны, имеются некоторые инструкции, в которых можно использовать только регистровые операнды.
Примеры регистровых операндов:
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".
5.2. Постоянные операнды
Регистры удобны для хранения значений переменных, но часто в операндах требуется использовать постоянное значение. Если необходимо в цикле уменьшать значение регистра 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
Постоянные значения можно задавать в двоичном, восьмеричном или шестнадцатиричном представлении, а также в десятичном виде.
Операнды-константы никогда не могут при использовании двух операндов располагаться слева, так как невозможно использовать константу в качестве операнда-приемника (это противоречит определению константы, как неизменяемой величины). Операнды-константы, однако, могут прекрасно использоваться в том месте, где имеет смысл использование значения в качестве исходного операнда. Чтобы занести в стек значение 5, вы должны выполнить две инструкции:
mov ax,5
push ax