| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
.
.
в регистре 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
.
.
.
Сдвиги и циклические сдвиги
-----------------------------------------------------------------
В процессорах 8086 имеется множество способов, с помощью ко-
торых можно сдвигать биты регистра или переменной в памяти влево
или вправо. Простейшим из них является логический сдвиг.
Инструкция SHL (сдвиг влево, синоним - SAL) перемещает каж-
дый бит операнда-приемника на один разряд влево, по направлению к
самому значащему биту. На Рис. 5.8 показано, как значение
100010110b (96h или 150 в десятичном представлении), записанное в
AL, сдвигается влево с помощью инструкции SHL AL,1. В результате
получается значение 00101100b (24Ch или 44 в десятичном виде),
которое записывается обратно в регистр AL. Флаг переноса устанав-
ливается в значение 1.
AL
----------------------------------------------------------
| ----- ----- ----- ----- ----- ----- ----- ----- |
---| | 1 |<-| 0 |<-| 0 |<-| 1 |<-| 0 |<-| 1 |<-| 1 |<-| 0 | |<--
| | ----- ----- ----- ----- ----- ----- ----- ----- | |
| ---------------------------------------------------------- |
| Бит 7 6 5 4 3 2 1 0 |
| ----- |
---->| | 0 -----------
-----
Флаг переноса
Рис. 5.8 Пример выполнения сдвига влево.
Самый значащий (старший) бит вовсе сдвигается из операнда и
попадает во флаг переноса, а в наименее значащий бит заносится 0.
Для чего используется сдвиг влево? Чаще всего это делается
для выполнения с помощью операции SHL умножения на степень числа
2, так как каждая инструкция SHL умножает операнд на 2. Например,
с помощью следующих инструкций DX умножается на 16:
.
.
.
shl dx,1 ; DX * 2
shl dx,1 ; DX * 4
shl dx,1 ; DX * 8
shl dx,1 ; DX * 16
.
.
.
Умножение с помощью сдвига выполняется гораздо быстрее, чем
с помощью операции MUL.
Как вы могли заметить, в предыдущем примере в инструкции SHL
используется второй операнд - значение 1. Этот операнд указывает,
что содержимое DX нужно сдвинуть на 1 бит. К сожалению, процессор
8086 не поддерживает использования в качестве константы сдвига
других, отличных от 1 постоянных значений - 2, 3 и т.д. Однако, в
качестве счетчика сдвигов допускается использование регистра CL.
Например, инструкции:
.
.
.
mov cl,4
shl dx,cl
.
.
.
умножают содержимое регистра DX на 16 (как и в предыдущем приме-
ре).
Если есть сдвиг влево, то логично было бы предположить, что
|
adfun.ru
|
|
|
|