CodeNet / Языки программирования / Ассемблер / СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
Операнды-константы ----------------------------------------------------------------- Регистры прекрасно подходят для хранения значений перемен- ных, но часто в операндах требуется использовать постоянное зна- чение. Например, предположим, вы хотите в цикле уменьшать значе- ние регистра 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 . . . Нужно изучить каждый отдельный случай, когда использование констант не допускается. К счастью, таких инструкций немного, и Турбо Ассемблер, конечно, даст вам знать, если вы пытаетесь ис- пользовать константу некорректно. Выражения ----------------------------------------------------------------- Постоянные выражения можно использовать там же, где допуска- ется использование постоянных значений (констант). Турбо Ассем- блер поддерживает полное вычисление выражений, включая вложенные скобки, арифметические, логические операции и операции отношения, а также множество операций, предназначенных для таких целей, как выделение для меток сегмента и смещения и определение размера пе- ременных в памяти. Например, во фрагменте программы: . . . MemVar DB 0 NextVar DB ? . . . mov ax,SEG MemVar mov ds,ax mov bx,OFFSET MemVar + (3*2) - 5) mov BYTE PTR [bx],1 . . . операция SEG используется для загрузки постоянного значения сег- мента, в котором находится MemVar, и копирования этого значения из регистра AX в DS. Далее в этой программе используется сложное выражение, включающее в себя операции *, +, - и OFFSET, при вы- числении которого получается значение OFFSET MemVar+1, которое представляет собой ни что иное, как адрес NextVar. Наконец, для выбора байтовой операции при сохранении константы 1 в ячейке, на которую указывает регистр BX (что представляет собой NextVar), используется операция BYTE PTR. Относительно выражений стоит сделать важное замечание: при вычислении всех выражений должно получаться значение-константа. OFFSET MemVar - это значение-константа, представляющее собой сме- щение переменной MemVar в ее сегменте. Кроме того, в то время как сохраненное в переменной MemVar значение может изменяться, сама переменная MemVar, конечно, никуда не перемещается. Так как значения-константы точно известны, Турбо Ассемблер может вычислять состоящие из постоянных значений выражения так же, как он ассемблирует ваш исходный код. Для Турбо Ассемблера выражение OFFSET MemVar + 2 совершенно аналогично выражению 5 + 2. Поскольку все элементы выражения неизменяемы и определены во время ассемблирования, выражение можно свести к одному значе- нию-константе. В выражениях могут использоваться следующие операции: <>, (), LENGTH, MASK, SIZE, WIDTH . (селектор элемента структуры) HIGH, LOW : (переопределение сегмента) OFFSET, PTR, SEG, THIS, TYPE *, /, MOD, SHL, SHR +, - (бинарные) EQ, GE, GT, LE, LT, NE NOT AND OR, XOR LARGE, SHORT, SMALL, .TYPE Названия и обозначения некоторых операций говорят сами за себя. Эти операции выполняют в арифметических выражениях именно те действия, для которых они предназначены. Операции мы поясним в этой главе позднее, когда до них дойдет дело. Кроме того, ответы на вопросы, касающиеся отдельных операций, можно найти в Главе 2 "Справочного руководства". Операнды-метки ----------------------------------------------------------------- Во многих инструкциях в качестве операндов можно использо- вать метки. При указании их в соответствующих операциях метки мо- гут использоваться для получения постоянных значений (констант). Например: . . . MemWord DW 1 . . . mov al,SIZE MemWord . . . Здесь значение 2 (размер в байтах переменной в памяти MemWord) помещается в AL. В данном контексте метка может стано- виться частью выражения, как уже показано в предыдущем разделе. Метки могут также использоваться в качестве целевых операн- дов в операциях CALL и JMP. Например, во фрагменте программы: . . . cmp ax,100 ja IsAbove100 . . . IsAbove100: . . . инструкция JA используется для перехода по адресу, заданному опе- рандом IsAbove100, если значение AX превышает 100. Здесь метка используется в качестве константы, задавая адрес перехода. Наконец, метки можно использовать в качестве операндов почти также, как используются регистры, то есть как операнд-источник или операнд-приемник в инструкциях работы с данными. Программа: . . . TampVar DW ? . . . mov [TempVar],ax sub ax,[TempVar] . . . обнуляет содержимое регистра AX, так как первая инструкция запи- сывает содержащееся в регистре AX значение в переменную памяти TempVar, затем вторая инструкция вычитает из AX сохраненное в TempVar значение. Использование меток в качестве операндов представляет собой отдельную тему при описании моделей памяти. Этого мы коснемся позднее.