Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1 / МУ_ЭВМ+ПУ_ч1 / 6-МУ_ЭВМ+ПУ-лог+сдвиг

.docx
Скачиваний:
22
Добавлен:
28.05.2015
Размер:
42.13 Кб
Скачать

Лабораторная работа 6

ЛОГИЧЕСКИЕ КОМАНДЫ И КОМАНДЫ СДВИГА

    1. Цель работы

Изучение логических команд и команд сдвига: действия с отдельными битами – тестирование, установка и сбрасывание, инвертирование.

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

6.2.1 Особенности логических команд

Логические команды:

  • реализуют поразрядные операции: i-й разряд результата зависит только от i-ых разрядов операндов, при этом действие выполняется сразу над всеми разрядами операндов одновременно;

  • меняют все флаги условий, но интерес вызывает только флаг нуля ZF, (принимает значение 1, если получился нулевой результат, и равен 0 в противном случае). Что касается других флагов, то они, предназначенные для работы с числами, в логических операциях малоинформативны.

Операнды должны иметь одинаковый размер.

Краткие сведения о логических командах приведены в таблицах 6.1 и 6.2.

Таблица 6.1 – Логические команды

Синтаксис

Логика работы

AND op1, op2

op1 = op1 and op2

TEST op1, op2

op1 and op2

OR op1, op2

op1 = op1 or op2

XOR op1, op2

op1 = op1 xor op2

NOT op

op = not op

Таблица 6.2 – Таблица истинности

X

Y

X and Y

конъюнкция

X xor Y

исключающее ИЛИ

X or Y

дизъюнкция

not X

отрицание

1

1

1

0

1

0

1

0

0

1

1

0

0

1

0

1

1

1

0

0

0

0

0

1

Описа-
ние

=1, если оба =1

=1, если оба разные

=1, если хоть один =1

Команда TEST - аналог команды AND, но результат никуда не записывается, выполняется только установка флагов (наиболее информативен флаг ZF).

      1. Применение логических команд

Приводимые ниже положения иллюстрируются примерами, в которых фигурируют регистры AL и BL, имеющие следующие начальные значения:

AL = 00001101b

BL = 00001100b

Второй операнд в командах (op2) – маска (шаблон).

  1. Установка бит в 1 - команда OR (устанавливаемые биты в маске =1, остальные =0).

ПРИМЕР

Установить бит номер нуль в 1.

OR AL, 00000001b ; AL = 1101b

OR BL, 00000001b ; BL = 1101b

  1. Сброс бит в 0 – команда AND (сбрасываемые биты в маске =0, остальные =1).

ПРИМЕР

Сбросить биты номер нуль, два и три.

AND AL, 11110010b ; AL= 00000000b

  1. Инвертирование бит – команда XOR (инвертируемые биты в маске =1, остальные =0).

ПРИМЕР

Инвертировать бит номер нуль.

XOR AL, 0000 0001b ; AL:= 1100b

XOR BL, 0000 0001b ; BL:= 1101b

  1. Проверка состояния бит – команда TEST (интересующие биты в маске =1, остальные =0).

ПРИМЕР

Протестировать состояние бита номер нуль регистра AL.

TEST AL, 00000001b

Результат операции – 00000001b (выполняется поразрядное умножение - and, но сам результат никуда не записывается, изменяется флаг нуля ZF).

Маска (шаблон) подобрана так, что все не интересующие нас биты в результате будут нулевыми (умножаются на нуль - 00000001b). Бит номер нуль в результате будет таким, каков он в регистре AL (он умножается на 1 - 00000001b).

Таким образом, весь результат фактически зависит от величины интересующего нас бита:

если бит =0, то результат =0 → ZF=1

если бит =1, то результат ≠0 → ZF=0

Программе доступен только флаг ZF. Именно его величина используется, если проверка бита необходима в дальнейшем для организации условного перехода.

  1. Обнуление регистров - команда XOR

ПРИМЕР

Очистить регистр AL.

XOR АL, АL ; АL:=0

По сравнению с другими приемами - MOV АL, 0 или SUB AL, AL - выполняется быстрее.

    1. Команды сдвига

6.3.1 Команды сдвига перемещают (сдвигают) биты в поле операнда op (приемника) влево (L) или вправо (R) на число разрядов, указанных в счетчике:

<мнемокод> op, <счетчик>

Операнд op может быть регистром или памятью, а <счетчик> – либо непосредственным операндом, либо регистром CL.

6.3.2 Команды по принципу действия различаются на линейные и циклические.

Линейные – это логический (беззнаковые числа) и арифметический (знаковые числа) сдвиги, выполняемые по алгоритму: выдвигаемый бит попадает в СF, при этом значение предыдущего сдвинутого бита теряется, а бит, вводимый с другого конца, равен 0.

Логический сдвиг влево (shift left): SHL op, <счетчик>

Логический сдвиг вправо (shift right): SHR op, <счетчик>

Условно действия этих команд можно изобразить так, как показано на рисунке 6.1 (слева - для SHL, справа - для SHR).

CF op op CF

0

0

Рисунок 6.1 – Схема действия команд логического сдвига

Замечание: команды сдвигают в памяти переменные, большие байта, так, как если бы они было записаны в "неперевернутом" виде.

ПРИМЕР

Х DW 1FFh ; 00000001 11111111b (X: 11111111b, X+1: 00000001b)

SHL X, 1 ; 00000011 11111110b (X: 11111110b, X+1: 00000011b)

Арифметический сдвиг влево (shift arithmetic left): SAL op, <счетчик>

Арифметический сдвиг вправо (shift arithmetic rigth ): SAR op, <счетчик>

Команда SAL аналогична SHL.

SAR сохраняет знак, восстанавливая его после сдвига каждого очередного бита (рисунок 6.2).

оp CF

Рисунок 6.2 – Схема действия команды SAR

6.4 Быстрое умножение и деление на степень двойки

Наглядное представление об изменении числа 1 при последовательных сдвигах его влево дает таблица 6.2.

Таблица 6.2 – Результаты последовательных сдвигов числа 1

Число в двоичной системе счисления

Соответствующее число в десятичной системе счисления

Получено сдвигом двоичного числа 1 влево на … позиций

1

1= 20

0

10

2=21

1

100

4=22

2

1000

8=23

3

10….0

k нулей

2k

k

Линейные команды применяются для быстрого умножения и деления операнда оp на число, представляющее собой степень двойки 2k:

  1. умножение беззнаковых и знаковых чисел на 2k – сдвиг (SHL или SAL соответственно) на k позиций влево

ПРИМЕР Содержимое регистра AL (AL=3) умножить на 4 (4=22)

mov al, 3 ; al = 3=0000 0011b

shl al, 2 ; al = 0000 1100b = 12

  1. получение неполного частного при делении на 2k беззнаковых и знаковых чисел - сдвиг (SHR или SAR соответственно) операнда на k позиций вправо

ПРИМЕР Определить неполное частное от деления содержимого регистра AL (AL=17) на 4 (17 : 4 = 4 (1 в остатке))

mov al, 17 ; al = 17 = 11h = 0001 0001b

shr al, 2 ; al = 0000 0100b = 4

  1. получение остатка от деления беззнаковых чисел на 2k – выделить в делимом (операнде) k правых битов.

ПРИМЕР Определить остаток от деления содержимого регистра AL (AL=17) на 4.

mov al, 17 ; al = 17 = 11h = 0001 0001b → 01b = 1

ПРИМЕР Определить, является ли содержимое регистра BX четным числом.

Если правый бит регистра BX равен нулю (это остаток от деления на 2), то число четное.

6.5 Особенность циклических сдвигов: "уходящий" бит не теряется, а возвращается в операнд с другого конца и одновременно заносится во флаг CF.

Циклический сдвиг влево (rotate left): ROL op, <счетчик>

Циклический сдвиг вправо (rotate right): ROR op, <счетчик>

Схема действия этих команд изображена на рисунке 6.3 (слева - для ROL , справа - для ROR ).

CF op op CF

Рисунок 6.3 – Схема действия команд циклического сдвига

ПРИМЕР

MOV CL, 11000011b

ROL CL, 1 ; CF=1, CL=10000111b

MOV BH, 11100010b

ROR BH, 1 ; BH=01110001b, CF=0

Команды часто используются для перестановки частей содержимого ячейки или регистра.

ПРИМЕР

Поменять местами правую и левую половины регистра AL.

Задание можно выполнить циклическим сдвигом байта на 4 разряда влево (или вправо):

MOV AL, 17h ; AL=00010111b – начальное значение регистра

MOV CL, 4

ROL AL, CL ; AL=01110001b=71h

Циклический сдвиг влево через перенос (rotate lefh through carry):

RCL op, <счетчик>

Циклический сдвиг вправо через перенос (rotate rigth through carry):

RCR op, <счетчик>

По команде RCL все биты первого операнда сдвигаются на одну позицию влево, причем самый левый бит попадает во флаг CF, а прежнее значение этого флага заносится в самый правый разряд операнда (на рисунке 6.4 слева); в команде RCR все аналогично, только осуществляется сдвиг вправо (на рисунке 6.4 справа):

CF op op CF

Рисунок 6.4 – Схема действия команд циклического сдвига

ПРИМЕР

Пусть начальное значение CF=0, а регистр BL содержит 11110000b.

RCL BL, 1 ; CF=1, BL=11100000b

RCL BL, 1 ; CF=1, BL=11000001b

Рассматриваемые команды обычно используются при переносе битов из одного регистра (или переменной) в другой.

ПРИМЕР

Сдвинуть на 3 разряда влево значения регистров AL и DH, приписав справа к AL три левых бита регистра DH:

MOV СХ, 3 ; счетчик количества сдвигаемых бит

L: SHL DH, 1 ; в СF бит номер 7 (левый) из DH

RCL AL, 1 ; бит из СF  в бит номер 0 (правый) AL

DEC CX ; CX := CX – 1

CMP CX, 0 ; CX = 0? (все биты перемещены?)

JNE L ; если не все  на L

50