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

Ваш аккаунт

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

Последние темы форума

Показать новые сообщения »

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

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

СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0


Оглавление

                          Умножение и деление
-----------------------------------------------------------------

     Процессор 8086 может выполнять отдельные типы операций умно-
жения и деления. Эта одна из сильных сторон процессора 8086, пос-
кольку во многих микропроцессорах вообще отсутствует  непосредст-
венная поддержка операций умножения и деления, а эти операции до-
вольно сложно выполнить программным путем.

     Инструкция MUL перемножает  8-  или  16-битовые  беззнаковые
сомножители,  создавая  16-  или 32-битовое произведение. Давайте
сначала рассмотрим умножение 8-битовых сомножителей.

     При 8-битовом (8-разрядном) умножении один из операндов дол-
жен  храниться  в регистре AL,  а другой может представлять собой
любой 8-битовый общий регистр или переменную памяти соответствую-
щего размера. Инструкция MUL всегда сохраняет 16-битовое произве-
дение в регистре AX. Например, во фрагменте программы:

           .
           .
           .
           mov   al,25
           mov   dh,40
           mul   dh
           .
           .
           .

AL умножается на DH, а результат (1000) помещается в регистр  AX.
Заметим,  что  в  инструкции  MUL требуется указывать только один
операнд, другой сомножитель всегда храниться в регистре AL (или в
регистре AX в случае перемножения 16-битовых сомножителей).

     Инструкция  перемножения  16-битовых  сомножителей  работает
аналогично.  Один из сомножителей должен храниться в регистре AX,
а другой может находиться в 16-разрядном общем регистре или в пе-
ременной  памяти. 32-битовое произведение инструкция MUL помещает
в этом случае в регистры DX:AX, при этом младшие (менее значащие)
16 битов произведения записываются в регистр AX, а старшие (более
значащие) 16 бит - в регистр DX. Например, инструкции:

           .
           .
           .
           mov   ax,1000
           mul   ax
           .
           .
           .

загружают в регистр AX значение 1000,  а  затем  возводят  его  в
квадрат, помещая результат (значение 1000000) в регистры DX:AX.

     В отличие от сложения и вычитания, в операции  умножения  не
учитывается, являются ли сомножители операндами со знаком или без
знака, поэтому имеется вторая инструкция умножения IMUL для умно-
жения  8-  и 16-битовых сомножителей со знаком. Если не принимать
во внимание, что перемножаются  значения  со  знаком,  инструкция
IMUL работает аналогично инструкции MUL. Например, при выполнении
инструкций:

           .
           .
           .
           mov   al,-2
           mov   ah,10
           imul  ah
           .
           .
           .

в регистре AX будет записано значение -20.

     Процессор 8086 позволяет вам с  определенными  ограничениями
разделить  32-битовое значение на 16-битовое, или 16-битовое зна-
чение  на   8-битовое.   Давайте   сначала   рассмотрим   деление
16-битового значения на 8-битовое.

     При беззнаковом делении 16-битового  значения  на  8-битовое
делимое  должно  быть  записано в регистре AX. 8-битовый делитель
может храниться в любом 8-битовом общем регистре или переменной в
памяти соответствующего размера. Инструкция DIV всегда записывает
8-битовое частное в регистр AL, а 8-битовый остаток - в AH.  Нап-
ример, в результате выполнения инструкций:

           .
           .
           .
           mov   ax,51
           mov   dl,10
           div   dl
           .
           .
           .

результат 5 (51/10) будет записан в регистр AL,  а остаток 1 (ос-
таток от деления 51/10) - в регистр AH.

     Заметим, что частное представляет собой 8-битовое  значение.
Это  означает,  что  результат  деления  16-битового  операнда на
8-битовый операнд должен превышать 255. Если частное слишком  ве-
лико,  то генерируется прерывание 0 (прерывания по делению на 0).
Инструкции:

           .
           .
           .
           mov   ax,0fffh
           mov   bl,1
           div   bl
           .
           .
           .

генерируют прерывание по делению на 0 (как можно ожидать,  преры-
вание  по  делению на 0 генерируется также, если 0 используется в
качестве делителя).

     При делении 32-битового операнда на 16-битовый операнд дели-
мое  должно  записываться  в регистрах DX:AX. 16-битовый делитель
может находиться в любом из 16-битовых регистров общего  назначе-
ния или в переменной в памяти соответствующего размера. Например,
в результате выполнения инструкций:

           .
           .
           .
           mov   ax,2
           mov   dx,1        ; загрузить в DX:AX 10002h
           mov   bx,10h
           div   bx
           .
           .
           .

частное 1000h (результат деления 10002h на 10h) будет записано  в
регистре AX, а 2 (остаток от деления) - в регистре DX.

     Как и при умножении, при делении имеет значение, используют-
ся операнды со знаком или без знака. Для деления беззнаковых опе-
рандов используется операция DIV, а для деления операндов со зна-
ком - IDIV. Например, операции:

           .
           .
           .
           .DATA
 TestDivisor     DW  100
           .
           .
           .
           .CODE
           .
           .
           .
           mov   ax,-667
           cwd               ; установить DX:AX в значение -667
           idiv   [TestDivisor]
           .
           .
           .

сохраняют значение -6 в регистре AX и значение -67 в регистре DX.



                            Изменение знака
-----------------------------------------------------------------

     Наконец, мы подошли к рассмотрению инструкции  NEG,  которая
позволяет вам изменить (инвертировать)  знак  содержимого  общего
регистра или переменной в памяти. Например, после выполнения инс-
трукций:

           .
           .
           .
           mov   ax,1      ; установить регистр AX в значение 1
           neg   ax        ; отрицание AX, он становится
                           ; равным -1
           mov   bx,ax     ; скопировать содержимое AX в BX
           neg   bx        ; отрицание BX, он становится равным 1
           .
           .
           .

в регистре AX будет содержаться значение -1, а в  регистре  BX  -
значение 1.



                          Логические операции
-----------------------------------------------------------------

     Турбо Ассемблер поддерживает полный набор инструкций для вы-
полнения  логических  операций,  включая  инструкции  AND (И), OR
(ИЛИ), XOR (исключающее ИЛИ) и NOT  (НЕ).  Эти  инструкции  могут
оказаться  очень  полезными  при работе с отдельными битами слова
или байта, а также для выполнения операций булевой алгебры.

     Результаты выполнения логических операций показаны в Таблице
5.1. Логическая инструкция выполняет поразрядные операции над би-
тами исходных операндов. Например, инструкция:

             adn   ax,dx

выполняет логическую операцию AND с битом 0 регистра AX и битом 0
регистра  DX,  затем  ту же операцию с битами 1, 2 и т.д. до бита
15.

  Выполнение логических инструкций процессора 8086 ADN, OR и XOR
                                                      Таблица 5.1
-----------------------------------------------------------------
| Исходный бит A | Исходный бит B | A AND B | A OR B | A XOR B  |
|---------------------------------------------------------------|
|        0       |       0        |    0    |    0   |    0     |
|        0       |       1        |    0    |    1   |    1     |
|        1       |       0        |    0    |    1   |    1     |
|        1       |       1        |    1    |    1   |    0     |
-----------------------------------------------------------------

     Инструкция AND комбинирует два  операнда  в  соответствии  с
правилами, показанными в Таблице 5.1, устанавливая каждый бит ре-
зультата (операнда-приемника) в 1 только в том случае,  если  оба
соответствующих  бита  операнда-источника равны 1. Инструкция AND
позволяет вам выделить отдельный бит или принудительно установить
его в значение 0. Например, инструкции:

           .
           .
           .
           mov   dx,3dah
           in    al,dx
           and   al,1
           .
           .
           .

выделяет бит 0 байта  состояния  цветного  графического  адаптера
(CGA). Эти инструкции оставляют регистр AL установленным в значе-
ние 1, если видеопамять адаптера CGA можно изменять,  не  вызывая
помех  на экране ("снег"), и устанавливают его в нулевое значение
в противном случае.

     Инструкция OR также комбинирует два операнда в  соответствии
с  правилами, приведенными в Таблице 5.1, устанавливая каждый бит
операнда-приемника в значение 1, если  любой  из  соответствующих
бит операнда-источника равен 1.  Инструкция OR позволяет вам при-
нудительно установить отдельные биты (или бит) в значение 1. Нап-
ример, инструкции:

           .
           .
           .
           mov   ax,40h
           mov   ds,ax
           mov   bx,10h
           or    WORD PTR [bx],0030h
           .
           .
           .

устанавливают биты 5 и 4 слова флагов аппаратуры базовой  системы
ввода-вывода  BIOS в значение 1. При этом BIOS будет поддерживать
монохромный дисплейный адаптер.

     Инструкция XOR также комбинирует два операнда в соответствии
с  правилами, приведенными в Таблице 5.1, устанавливая каждый бит
операнда-приемника в значение 1, только в том случае, один  соот-
ветствующих бит операнда-источника равен 0, и в значение 1 в про-
тивном случае.  Инструкция XOR позволяет вам "переключать" значе-
ния отдельных бит в байте. Например, инструкции:

           .
           .
           .
           mov   al,01010101b
           mov   al,11110000b
           .
           .
           .

устанавливают регистр AL в значение 10100101b или A5h. Когда  для
регистра  AL  выполняется  операция  XOR  со  значением 11110000b
(0F0h), биты со значением 1 в  0F0h  переключают  значения  соот-
ветствующих бит в регистре AL,  а биты со значением  0  оставляют
соответствующие биты AL неизмененными.

     Кстати, инструкция XOR дает удобный способ обнуления  содер-
жимого регистра. Например, следующая инструкция устанавливает со-
держимое регистра AX в значение 0:

          xor   ax,ax

     Наконец, инструкция NOT  просто  изменяет  значение  каждого
бита  операнда  на противоположное (как если бы над исходным опе-
рандом была выполнена операция XOR со значением 0FFh). Например:

           .
           .
           .
           mov   bl,10110001b
           not   bl                ; переключить BL в 01001110b
           xor   bl,0ffh           ; переключить BL обратно в
                                   ; значение 10110001b
           .
           .
           .



Оглавление

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

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
89K
05 марта 2013 года
Юра Мроць
0 / / 05.03.2013
+2 / -2
Мне нравитсяМне не нравится
5 марта 2013, 00:03:00
Спасибі, хороша стаття.

Знайшов помилку:
Заметим, что частное представляет собой 8-битовое значение.
Это означает, что результат деления 16-битового операнда на
8-битовый операнд "НЕ" должен превышать 255.

Пропущено "НЕ".
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог