Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 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 значение.

     Использование меток в качестве операндов представляет  собой
отдельную  тему  при  описании  моделей памяти. Этого мы коснемся
позднее.




Оглавление

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог