- •1. Обработка символьной информации
- •Команды префикса повторения.
- •Примеры программ, реализующих действия со строками.
- •Практическая часть.
- •Контрольные вопросы и задания.
- •Передача параметров в процедуру.
- •1. Передача через регистры: программа перед вызовом заносит входные параметры в некоторые регистры процессора, а после возврата выбирает из регистров значения результатов.
- •Модульная структура программ на языке Ассемблера.
- •Работа с командой прерываний int.
- •Практические задания.
- •Синтаксис:
- •Команды сдвига.
- •Команды логического сдвига shl и shr.
- •Команды арифметического сдвига sal и sar.
- •Команды циклического сдвига: rol и ror, rcl и rcr.
- •Использование логических и арифметических команд сдвига.
- •1. Команды логического сдвига. Используются для выполнения быстрого умножение и деление целых чисел на степени двойки, на 2 k.
- •Литература
Синтаксис:
NOT dst ; (dst) ← not (dst)
AND dst, src ; (dst) ← (dst) and (src)dst, src ; (dst) ← (dst) or (src)dst, src ; (dst) ← (dst) xor (src)dst, src ; (dst) test (src)
В этих командах допустимы следующие комбинации операндов:
dst |
src |
r8 |
i8, r8, m8 |
m8 |
i8, r8 |
r16 |
il6, rl6, ml6 |
m16 |
il6, rl6 |
В таблице 6.2. приведены значения регистра флагов, устанавливаемые логическими командами.
Cодержимое младшей части регистра AX поразрядно умножить на двоичное число 0010 1010b (2Аh)
MOV AL, 0001 1100b; AL = 0001 1100b (1Ch)AL, 0010 1010b; AL = 0000 1000b (08h)
Содержимое младшей части регистра AL логически сложить с содержимым его старшей части.
MOV AL, 1110 1100b; (ECh)AH, 1010 1010b; (AAh)AL, AH; AL = 1110 1110b (EEh) AH = 1010 1010b (AAh)
Над содержимым АL и числом 1Аh (0001 1010b) произвести операцию исключающее ИЛИ.
MOV AL, 1110 0111b; AL = 1110 0111b (E7h)
XOR AL, 1Ah; AL = 1111 1101b (FDh)BH, 1100bBH, 0011b; = 00000000b -> ZF=1BH, 1010b; = 00001000b -> ZF=0
Над содержимым младшей части регистра AХ выполнить операцию отрицания.
MOV AL, 0001 1100b; AL = 0001 1100b (1Сh)AL; AL = 1110 0011b (E3h)
Приемы использования логических операций.
С помощью логических команд можно производить выделение отдельных битов в операнде с целью их установки, сброса, инвертирования или просто проверки на определенное значение. Для организации подобной работы с битами операнд src обычно играет роль маски. С помощью установленных в 1 битов этой маски и определяются нужные для конкретной операции биты операнда dst. Рассмотрим на примерах основные приемы использования логических операции.
Установка определенных разрядов в 1.
Для установки определенных разрядов в 1 применяется команда OR dst, maska. В этой команде операнд maska должен содержать единичные биты на месте тех разрядов, которые должны быть установлены в 1 в операнде dst. Например, чтобы установит разряды 3 и 6 аккумулятора AL, нужно использовать маску x1xx1xxx и выполнить команду OR AL, x1xx1xxx b;
Сброс определенных разрядов в 0.
Для сброса определенных разрядов в 0 применяется команда AND dst, maska. В этой команде оператор maska должен содержать нулевые биты на месте тех разрядов, которые должны быть установлены в 0 в операторе dst. Например, чтобы очистить разряды 3 и 6 аккумулятора AL, нужно использовать маску x0xx0xxx и выполнить команду AND AL, x0xx0xxx b;.
Сравнение битов двух операндов.
Для выяснения того, какие биты в двух операндах различаются применяется команда XOR dst, maska. В этой команде операнд maska должен содержать единичные биты на месте тех разрядов, которые сравниваются, а остальные - нулевыми. Например, чтобы сравнить разряды 3 и 6 аккумулятора AL, нужно использовать маску 01001000 и выполнить команду XOR AL, 01001000 b;.
Инвертирования состояния заданных бит.
Для инвертирования состояния заданных бит в dst также применяется команда XOR dst, src.
Проверки состояния заданных бит.
Для проверки состояния заданных бит операнда применяется команда TEST dst, maska. При этом проверяемые биты операнда dst в операнде maska должны иметь единичное значение. Результатом команды является установка значения флага нуля ZF:
если ZF = 0, то в результате логического умножения получился нулевой результат, то есть один единичный бит маски, который не совпал с соответствующим единичным битом dst;
если ZF = 1, то в результате логического умножения получился ненулевой результат, то есть хотя бы один единичный бит маски совпал с соответствующим единичным битом dst.
Замечание. Для реакции на результат команды TEST целесообразно использовать команду перехода jnz - переход, если флаг нуля zf ненулевой, или команду с обратным действием - jz - переход, если флаг нуля zf = 0.