Тема 2.6 Переходы и логические команды
Логические команды Отрицание: NOT op Допустимые типы операнда: r 8, m 8, r 16, m 16 Эта команда меняет значение каждого бита операнда на противоположное: 0 на 1 и 1 на 0; результат записывается на место операнда. Например: MOV AL, 1100 b NOT AL; AL=00001100 b; AL=11110011 b Логические команды Конъюнкция (логическое умножение): AND op 1, op 2 oр1 r 8 m 8 r 16 m 16 ор2 i 8, r 8, m 8 i 8, r 8 i 16, r 16, m 16 i 16, r 16 Команда производит поразрядное логическое умножение операндов и записывает результат на место первого операнда, i-й бит результата равен 1, если i-е биты обоих операндов равны 1, и равен 0, если хотя бы в одном операнде i-й бит нулевой. Логические команды MOV AL, 1100 b AND AL, 1010 b; AL= 00001100 b; AL= 00001000 b X Y X and Y X or Y X xor Y 1 1 0 1 0 0 1 1 0 0 0 Логические команды Проверка: TEST op 1, op 2 Аналог команды AND, но результат логического умножения никуда не записывается. Главное в команде TEST - установка флагов. Флаг нуля ZF равен 1, если в результате логического умножения получился нулевой ответ, и равен 0, если в ответе есть хотя бы одна двоичная 1. MOV ВH, 1100 b TEST ВН, 0011 b; =0000 b ZF=1 TEST BH, 1010 b; =00001000 b ZF=0 Логические команды Дизъюнкция (логическое сложение): OR op 1, op 2 Допустимые типы операндов - как в команде AND. Команда производит поразрядное логическое сложение и записывает результат на место первого операнда. I-й бит результата равен 1, если i-й бит хотя бы одного операнда равен 1, и равен 0, когда i-e биты обоих операндов нулевые. MOV CL, 1100 b OR CL, 1010 b; CL=00001110 b Логические команды Исключающее ИЛИ (e. Xclusive OR): XOR op 1, op 2 Допустимые типы операндов - как в команде AND. Результат записывается на место первого операнда, i-й бит результата равен 0, если i-e биты операндов совпадают, и равен 1, если эти биты различны. MOV CL, 1100 b XOR CL, 1010 b; CL=00000110 b Когда операнды команды XOR совпадают, результатом будет нулевое слово. XOR АХ, АХ; АХ: =0
Команды сдвига < мнемокод> ор, 1; сдвиг ор на 1 разряд < мнемокод> op, CL; сдвиг op на CL разрядов(CL 0) Допустимые типы операнда op: r 8, m 8, r 16, m 16. Команды сдвига меняют все флаги, интерес представляет только флаг переноса CF. Команды сдвига делятся на команды логического сдвига (просто сдвига), арифметического и циклического. Логические сдвиги В командах, называемых логическими сдвигами, в сдвиге участвуют все биты первого операнда. При этом бит, уходящий за пределы ячейки, заносится в флаг CF, а с другого конца в операнд добавляется 0. Логический сдвиг влево (shift left): SHL op, 1 Логический сдвиг вправо (shift right): SHR op, 1 Условно действия этих команд можно изобразить так (слева - для SHL, справа - для SHR): Логические сдвиги Примеры: MOV AL, 01000111 b SHL AL, 1; CF=0, AL=10001110 b MOV AL, 01000111 b SНR AL, 1; AL=00100011 b, СF=1 MOV DH, 00111000 b MOV CL, 3 SHL DH, CL; CF=1, DH=11000000 b Логические сдвиги Быстрое умножение и деление на степени 2 Сдвиг десятичного числа 175, на 3 цифры влево? Это приписывание трех нулей справа, т. е. умножение на 103: 175000. Аналогично, сдвиг двоичного числа на k разрядов влево - это приписывание справа k двоичных нулей, т. е. умножение на 2 k. Сдвиг числа 5 на 3 разряда влево получаем: 5 = 101 b 101000 b = 40 =5*23 Сдвиг числа -4 на 1 разряд влево получаем: доп(-4)= 11111100 b 11111000 b= 100 h-8 = доп(-8) Логические сдвиги В обшем случае умножение на 2 k реализуется так: ; ор: =ор*2^k (ор - число со знаком и без) MOV CL, k SHL op, CL Сдвиг на k разрядов вправо - это отбрасывание последних k разрядов, что соответствует получению неполного частного (операции div) от деления на 2 k. Сдвиг числа 18 на 3 разряда: 18= 10010 b = 2 = 18 div 23; ор: =ор div 2 k (op - число без знака) MOV CL, k SHR op, CL Арифметические сдвиги Арифметический сдвиг влево (shift arithmetic left): SAL op 1, op 2 Эта команда совпадает с командой SHL. Арифметический сдвиг вправо (shift arithmetic rigth): SAR op 1, op 2 Все биты первого операнда сдвигаются вправо, причем " уходящий" бит заносится в флаг CF, затем знаковый (самый левый) бит операнда восстанавливает свое исходное значение.
Арифметические сдвиги Примеры: MOV ВH, 10001110 b SAR ВН, 1; ВН=11000111 b, CF=0 MOV ВH, 00001110 b SAR ВН, 1; ВН=00000111 b, СF=0 IDIV округляет частное в сторону 0, а SAR округляет в сторону минус бесконечности. Например, при делении -1 на 2 (т. е. при частном 0. 5) команда IDIV выдаст ответ 0, а команда SAR ответ -1: Циклические сдвиги Особенность циклических сдвигов в том, что " уходящий" бит не теряется, а возвращается в операнд, но с другого конца. Циклический сдвиг влево (rotate left): ROL op, 1 Циклический сдвиг вправо (rotate right): ROR op, 1 В команде ROL все биты сдвигаются влево, причем самый левый бит возвращается в операнд с правого конца и одновременно заносится в флаг CF, а в команде ROR все аналогично, только сдвиг выполняется вправо: Циклические сдвиги Примеры: MOV CL, 11000011 b ROL CL, 1; CF=1, CL=10000111 b MOV BH, 11100010 b ROR BH, 1; BH=01110001 b, CF=0 Поменять местами правую и левую половины регистра AL можно циклическим сдвигом этого байта на 4 разряда влево (или вправо): MOV AL, 17 h; AL=00010111 b MOV CL, 4 ROL AL, CL; AL=01110001 b=71 h Циклические сдвиги Циклический сдвиг влево через перенос (rotate lefh through carry): RCL op, 1 Циклический сдвиг вправо через перенос (rotate right through carry): RCR op, 1 По команде RCL все биты первого операнда сдвигаются на одну позицию влево, причем самый левый бит попадает в флаг CF, а прежнее значение этого флага заносится в самый правый разряд операнда; в команде RCR все аналогично, только осуществляется сдвиг вправо: Циклические сдвиги Примеры: MOV BL, 11110000 b RCL BL, 1; пусть СF=0; CF=1, BL=11100000 b; СF=1, BL=11000001 b
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|