Практическая работа 3 ЛОГИЧЕСКИЕ КОМАНДЫ И КОМАНДЫ СДВИГА
3.1 Цель работы
Изучение логических команд и команд сдвига: действия с отдельными битами – тестирование, установка и сбрасывание, инвертирование.
3.2 Логические операции
3.2.1 Особенности логических команд
Логические команды:
- реализуют поразрядные операции: i-й разряд результата зависит только от i-ых разрядов операндов, при этом действие выполняется сразу над всеми разрядами операндов одновременно;
- меняют все флаги условий, но интерес вызывает только флаг нуля ZF, (принимает значение 1, если получился нулевой результат, и равен 0 в противном случае). Что касается других флагов, то они, предназначенные для работы с числами, в логических операциях малоинформативны.
Операнды должны иметь одинаковый размер.
Краткие сведения о логических командах приведены в таблицах 3.1 и 3.2.
Таблица 3.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 |
Таблица 3.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).
3.2.2 Применение логических команд
Приводимые ниже положения иллюстрируются примерами, в которых фигурируют регистры AL и BL, имеющие следующие начальные значения:
AL = 00001101b
BL = 00001100b
Второй операнд в командах (op2) – маска (шаблон).
а) Установка бит в 1 - команда OR (устанавливаемые биты в маске =1, остальные =0).
ПРИМЕР
Установить бит номер нуль в 1.
OR AL, 00000001b ; AL = 1101b
OR BL, 00000001b ; BL = 1101b
б) Сброс бит в 0 – команда AND (сбрасываемые биты в маске =0, остальные =1).
ПРИМЕР
Сбросить биты номер нуль, один и три.
AND AL, 11110100b ; AL= 00000000b
в) Инвертирование бит – команда XOR (инвертируемые биты в маске =1, остальные =0).
ПРИМЕР
Инвертировать бит номер нуль.
XOR AL, 0000 0001b ; AL:= 1100b
XOR BL, 0000 0001b ; BL:= 1101b
г) Проверка состояния бит – команда TEST (интересующие биты в маске =1, остальные =0).
ПРИМЕР
Протестировать состояние бита номер нуль регистра AL.
TEST AL, 00000001b
Результат операции – 00000001b – никуда не записывается, но в соответствии с ним изменяется флаг: ZF=0 – косвенный результат операции. Вывод: так как ZF=0, то результат не нулевой, значит интересующий бит =1 (остальные биты результата гарантированно зануляются, так как сама операция – суть умножение, а соответствующие биты в маске заданы равными нулю).
ПРИМЕР
Протестировать состояние бита номер нуль регистра BL.
TEST BL, 00000001b ; так как ZF=1, значит результат нулевой,
; следовательно, интересующий бит =0
д) Обнуление регистров - команда XOR
ПРИМЕР
Очистить регистр AL.
XOR АL, АL ; АL:=0
По сравнению с другими приемами - MOV АL, 0 или SUB AL, AL - выполняется быстрее.
3.3 Условный оператор со сложным условием
Если условие сложное, то обычно выполняют проверку составляющих его простых условий, осуществляя после каждой проверки необходимые переходы.
ПРИМЕР
Если бит номер 1 байтовой переменной R равен 0 и бит номер 5 равен 1, перейти на метку DA, иначе на метку NET
Из формулировки задачи следует, что переход на метку DA осуществляется, когда выполняются и первое, и второе условие одновременно, другими словами, если хотя бы одно условие не выполняется, должен быть переход на метку NET.
test R, 10b ; проверка бита номер 1
jnz net ; если бит ≠ 0, переход на net
test R, 100000b ; проверка бита номер 5
jz net ; если бит = 0 ( т. е. ≠1), переход на net
; первый бит = 0 и пятый ≠ 0 ( =1)
da: ……
jmp fin
net: …….
fin: ……
ПРИМЕР
Если бит номер 1 байтовой переменной R равен 0 или бит номер 5 равен 1, перейти на метку DA, иначе на метку net.
Переход на метку DA осуществляется, когда выполняется хотя бы одно условие.
test R, 10b ; проверка бита номер 1
jz da ; если бит = 0, переход на da
; первый бит ≠ 0, необходимо проверить пятый
test R, 100000b ; проверка бита номер 5
jnz da ; если бит. ≠ 0 ( т. е. =1), переход на da
; ни один заданный бит не удовлетворяет заданному условию
; переход на net (следующая команда)
net: …….
jmp fin
da: ……
fin: ……
3.4 Команды сдвига
3.4.1 Команды сдвига перемещают (сдвигают) биты в поле операнда op (приемника) влево (L) или вправо (R) на число разрядов, указанных в счетчике:
<мнемокод> op, <счетчик>
Операнд op может быть регистром или памятью, а <счетчик> – либо непосредственным операндом, либо регистром CL.
3.4.2 Команды по принципу действия различаются на линейные и циклические.
Линейные – это логический (беззнаковые числа) и арифметический (знаковые числа) сдвиги, выполняемые по алгоритму: выдвигаемый бит попадает в СF, при этом значение предыдущего сдвинутого бита теряется, а бит, вводимый с другого конца, равен 0.
Логический сдвиг влево (shift left): SHL op, <счетчик>
Логический сдвиг вправо (shift right): SHR op, <счетчик>
Условно действия этих команд можно изобразить так, как показано на рисунке 3.1 (слева - для SHL, справа - для SHR).
CF op op CF
Рисунок 3.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 сохраняет знак, восстанавливая его после сдвига каждого очередного бита (рисунок 3.2).
оp CF
Рисунок 3.2 – Схема действия команды SAR
3.4.3 Линейные команды применяются для быстрого умножения и деления операнда оp на число, представляющее собой степень двойки 2k:
- умножение беззнаковых и знаковых чисел (SHL или SAL) – сдвиг на k позиций влево обеспечивает умножение операнда на 2k ;
- получение неполного частного при делении на 2k беззнаковых (SHR) и знаковых (SAR) чисел - сдвиг операнда на k позиций вправо;
- получение остатка от деления беззнаковых чисел на 2k – выделить в делимом (операнде) k правых битов.
3.4.4 Особенность циклических сдвигов: "уходящий" бит не теряется, а возвращается в операнд с другого конца и одновременно заносится во флаг CF.
Циклический сдвиг влево (rotate left): ROL op, <счетчик>
Циклический сдвиг вправо (rotate right): ROR op, <счетчик>
Схема действия этих команд изображена на рисунке 4.3 (слева - для ROL, справа - для ROR ).
CF op op CF
![]() |
![]() |
Рисунок 3.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, а прежнее значение этого флага заносится в самый правый разряд операнда (на рисунке 3.4 слева); в команде RCR все аналогично, только осуществляется сдвиг вправо (на рисунке 3.4 справа):
CF op op CF
![]() |
![]() |
Рисунок 3.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
3.5 Пример программы 1
3.5.1 Формулировка задачи
Если биты номер 2 и 3 ASCII-кода введенного с клавиатуры символа равны 1, инвертировать биты номер 0, 3 и 6 и вывести на дисплей символ, соответствующий измененному коду; иначе протестировать бит номер 5 кода введенного символа.
3.5.2 Постановка задачи
В начале работы предлагается ввести символ, имеющий ASCII-код.
После анализа бит номер 2 и 3 кода выполняется либо инвертирование бит номер 0, 3 и 6 и вывод символа, соответствующего измененному коду, либо тестирование бита номер 5 исходного кода и вывод соответствующего результата.
Предусмотреть в конце программы задержку для обозрения сообщения.
3.5.3 Тестирование программы
Для проверки правильности работы необходимо ввести следующие символы (таблица 3.3).
Таблица 3.3 – Символы для тестирования программы
Номер бита кода символа | Символ | Примечание | |||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
0 | 1 | 1 | 0 |
|
| 0 | 1 | m (англ) | Подлежит |
0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | $ | Результат инвертирования |
0 | 1 | 1 | 0 |
|
| 0 | 0 | 4 | Подлежит |
0 | 1 | 1 | 1 |
|
| 0 | 0 | х (англ) | Подлежит |
0 | 1 | 0 | 1 |
|
| 0 | 0 | Р (англ) | Подлежит |
3.5.4 Листинг программы
model small
.stack 100h
.data
priglash db 'Введите символ->','$'
vivs db 10, 13, 'Символ после изменения кода ->','$'
rez0 db 10, 13, 'Бит = 0','$'
rez1 db 10, 13, 'Бит = 1','$'
.code
start: ; точка входа в программу
mov ax, @data ; загрузка адреса сегмента данных
mov ds, ax
mov dx, offset priglash ; загрузка начального адреса строки в dx
mov ah, 9h ; вывод строки 'Введите символ'
int 21h
mov ah, 1h ; ввод символа
int 21h ; код символа - в al
mov bl, al ; копия кода символа - в bl
; если хотя бы одно условие не выполняется, переход на тестирование
; (см. подробно в п. 3.3)
test bl, 100b ; проверка бита номер 2
jz tst ; если =0, (случай «иначе»), переход на tst
test bl, 1000b ; проверка бита номер 3
jz tst ; если =0, (случай «иначе»), переход на tst
; инвертирование бит номер 0, 3 и 6
xor bl, 01001001b
mov dx, offset vivs ; вывод строки 'Символ после изменения кода' mov ah, 9h
int 21h
mov dl, bl ; вывод символа, код символа в dl
mov ah, 2h
int 21h
jmp fin
tst: test bl, 00100000b ; тестирование бита номер 5
jz r0 ; если бит =0, переход на метку r0
; бит ≠0, вывод сообщения rez1
mov dx, offset rez1 ; вывод строки 'Бит = 1'
mov ah, 9h
int 21h
jmp fin
r0: ; вывод сообщения rez0
mov dx, offset rez0 ; вывод строки 'Бит = 0'
mov ah, 9h
int 21h
fin: mov ah, 1 ; задержка для обозрения
int 21h
mov ax, 4C00h ; завершение работы
int 21h
end start
3.6 Задания для самостоятельной работы
3.6.1 Если первый или третий 3 бит кода введенного с клавиатуры символа равен 1, протестировать бит номер 6 символа D и вывести соответствующее сообщение; иначе установить 1 в четвертый бит кода символа и вывести на дисплей символ, соответствующий измененному коду.
3.6.2 Если седьмой бит кода введенного с клавиатуры символа равен 0, а второй бит равен 1, сбросить седьмой бит кода и вывести на дисплей символ, соответствующий измененному коду; иначе протестировать третий бит G и вывести соответствующее сообщение.
ЛОГИЧЕСКИЕ КОМАНДЫ И КОМАНДЫ СДВИГА. 26
Цель работы.. 26
Логические операции. 26
3.2.1 Особенности логических команд. 26
Применение логических команд. 27
Условный оператор со сложным условием.. 29
Команды сдвига. 30
Пример программы 1. 33
3.5.1 Формулировка задачи. 33
3.5.2 Постановка задачи. 34
Тестирование программы.. 34
3.5.4 Листинг программы.. 34
Задания для самостоятельной работы.. 36






