Ассемблер для IBM PC

Методическое пособие - Компьютеры, программирование

Другие методички по предмету Компьютеры, программирование

?егистра флагов, устанавливаемые логическими командами.

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.

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

Все команды сдвига имеют два операнда. Первый из них (байт или слово) рассматривается просто как набор битов, которые будут сдвигаться на несколько позиции влево или вправо. Второй же операнд рассматривается как целое без знака и определяет, на сколько разрядов надо сдвинуть первый операнд. Результат сдвига записывается на место первого операнда.

В микропроцессоре каждая команда сдвига имеет две разновидности, которые на языке ассемблера записываются следующим образом:

operand, 1; сдвиг operand на 1 разряд

=0)

Допустимые типы операнда орerand: r8, m8, r16, m16.

В первом варианте орerand сдвигается только на 1 разряд, а во втором варианте орerand можно сдвигать на любое число разрядов, причем это число должно находиться в байтовом регистре CL и оно всегда трактуется как неотрицательное.

Команды сдвига меняют все флаги, но, как правило, интерес представляет только флаг переноса CF.

Все команды сдвига можно разделить на команды логического сдвига (или просто сдвига), арифметического и циклического.

Команды логического сдвига SHL и SHR.

К логическим сдвигам относятся две команды:

SHL (Shift Logical Left) - логический сдвиг влево;

SHR (Shift Logical Right) - логический сдвиг вправо.

Синтаксис: SHL dst, countdst, count

В сдвиге участвуют все биты первого операнда dst. При этом бит, уходящий за пределы ячейки, заносится в флаг CF, а с другого конца в операнд добавляется 0. На рисунке 6.1 показан принцип работы этих команд.

 

Команды сдвига модифицирует флаги переполнения (OF), знака (SF), нуля (ZF), четности (PF) и переноса (CF) в зависимости от результата. Флаг переноса CF содержит значение последнего сдвинутого бита. В однобитных сдвигах флаг переполнения OF = 1, если операция изменила значение старшего бита операнда. При сдвиге на несколько бит состояние флага переполнения OF не определено.

Фрагменты использования логических сдвигов

 

SHLBL, 1; сдвигает регистр BL на 1 бит влево

SHLval_16, 1byte ptr[si], 1AL, CLAL, 01000111bAL, 1; AL = 10001110b, CF = 0AL, 01000111bAL, 1; AL = 00100011b, CF = 1DH, 00111000bCL, 3DH, CL; CF = 1, DH = 11000000b

 

Команды арифметичес