Сдвиги, переходы.ppt
- Количество слайдов: 31
БИТОВЫЕ ОПЕРАЦИИ. ПЕРЕХОДЫ.
Логические команды Отрицание: 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
Переходы
Безусловный переход Переходы бывают условными и безусловными. Если переход делается тогда, когда выполнено некоторое условие - переход называется условным, а если он делается независимо от каких-либо условий, то это безусловный переход. В ПК команды перехода не меняют флаги. Безусловный переход (jump): JMP op Операнд тем или иным способом указывает адрес перехода, т. е. адрес команды, которая должна быть выполнена следующей.
Безусловный переход. Оператор SHORT Прямой переход В качестве ор указывается метка той команды, на которую надо передать управление: JMP <метка> Пример: JMP L ; следующей будет выполняться команда с меткой L. . . L: MOV АХ, 0 Оператор SHORT JMP L JMP SHORT L. . . L: … ; длинный переход (3 байта) ; короткий переход (2 байта)
Безусловный переход Косвенный переход В этом случае в команде перехода указывается не сам адрес перехода, а то место, где находится этот адрес (регистр общего назначения или слово памяти): JMP r 16 или JMP m 16 A DW L … JMP А MOV DХ, А JMP DX … L: . . . ; goto [А] = goto L ; DX = L ; goto [DX] = goto L
Команды сравнения и условного перехода Условный переход реализуется в два шага: сначала сравниваются некоторые величины, в результате чего формируются флаги (ZF, SF и т. д. ), а затем выполняется условный переход в зависимости от значений флагов. сравнение (compare): CMP op 1, op 2 условный переход: Jхх <метка>, где операнд указывает метку команды программы, на которую надо сделать переход в случае выполнения некоторого условия. Мнемокод начинается буквой J (от jump), за которой следует одна или несколько букв, в сокращенном виде описывающих это условие.
Команды сравнения и условного перехода Команды условного перехода делятся на три группы. В первую группу входят команды, которые ставятся после команды сравнения. В их мнемокодах с помощью определенных букв описывается тот исход сравнения, при котором надо делать переход. Это такие буквы: Е - equal (равно) N - not (не, отрицание) G - greater (больше) - для чисел со знаком L - less (меньше) - для чисел со знаком А - above (выше, больше) - для чисел без знака В - below (ниже, меньше) - для чисел без знака
Команды сравнения и условного перехода Мнемокод JE JNE JL/JNGE Условие для перехода Состояние флагов для перехода после СМР ор1, ор2 для любых чисел: op 1=op 2 ZF=1 op 1<>op 2 ZF=0 для чисел со знаком: op 1<op 2 SF<>OF JLE/JNG op 1<=op 2 SF<>OF или ZF=1 JG/JNLE op 1>op 2 SF=OF и ZF=0 JGE/JNL op 1>=op 2 SF=OF
Команды сравнения и условного перехода Мнемокод JB/JNAE JBE/JNA JA/JNBE JAE/JNB Условие для перехода Состояние флагов после СМР ор1, ор2 для перехода для чисел без знака: op 1<op 2 op 1<=op 2 op 1>=op 2 CF=1 или ZF=1 CF=0 и ZF=0 CF=0
Команды сравнения и условного перехода Пример. Пусть X, Y и Z - переменные размером в слово. Требуется записать в Z максимальное из чисел X и Y. Решение этой задачи различно для чисел со знаком и для чисел без знака, т. к. приходится использовать разные команды условного перехода: ; числа со знаком знака MOV АХ, Х CMP AX, Y ; х=у? JGE М ; х>=у → М MOV АХ, Y M: MOV Z, AX ; числа без MOV AХ, Х CMP AX, Y JAE М MOV АХ, Y M: MOV Z, AX
Команды сравнения и условного перехода Во вторую группу команд условного перехода входят те, которые ставятся после команд, отличных от команды сравнения, и которые реагируют на значение определенного флага. В мнемокодах этих команд указывается первая буква проверяемого флага, если переход должен быть выполнен при значении 1 у флага, либо эта буква указывается с буквой N (not), если переход надо сделать при нулевом значении флага.
Команды сравнения и условного перехода Мнемокод Условие перехода JZ ZF=1 JNZ ZF=0 JS SF=1 JNS SF=0 JC CF=1 JNC CF=0 JO OF=l JNO OF=0 JP PF=1 JNP PF=0
Команды сравнения и условного перехода Пример. Пусть А, В и С - беззнаковые байтовые переменные. Вычислить С=А*А+В. Если ответ превосходит размер байта, тогда надо передать управление на метку ERROR. MOV AL, A MUL AL JC ERROR ADD AL, B JC ERROR MOV C, AL ; А*А>255 (CF=1)→ ERROR ; пeренос (CF=1)→ ERROR
Команды сравнения и условного перехода В третью группу входит команда условного перехода, проверяющая значение регистра СХ: JCXZ <метка> Действие команды JCXZ (jump if CX is zero) можно описать так: if CX=0 then goto <метка>
Сдвиги, переходы.ppt