CodeNet / Языки программирования / Ассемблер / СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 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
.
.
.
Оставить комментарий
Комментарии
1.
+2 / -3


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

