Команды манипулирования битами
Команды пересылки данных
Сведения об основных командах пересылки данных были приведены в предыдущей лекции. Сведения о других командах этой группы приведены в таблице 2.
Мнемокод
| Формат
| Команды общего назначения
MOV
|
MOV приемник, источник
| PUSH
| PUSH источник
| POP
| POP приемник
| XCHG
| XCHG приемник, источник
| XLAT
| XLAT таблица_источник
| Команды ввода-вывода
IN
|
IN аккумулятор, порт
| OUT
| OUT порт аккумулятор
| Команды пересылки адреса
LEA
|
LEA регистр (16), память (16)
| LDS
| LDS регистр (16), память (32)
| LES
| LES регистр (16), память (32)
| Команды пересылки флагов
LAHF
|
LAHF
| SAHF
| SAHF
| PUSHF
| PUSHF
| POPF
| POPF
| Никакие из этих команд, кроме SAHF и POPF значения флагов не изменяют.
Команды ввода-вывода будем подробнее рассматривать далее.
Относительно команд пересылки адреса следует отметить, что в отличие от MOV они пересылают не значения, а адрес операнда. Эту операцию выполняет LEA. По этой команде в приемник, каковым является 16-разрядный регистр, переносится исполнительный (эффективный) адрес данных (иначе говоря, в регистр загружается смещение адреса памяти относительно начала сегмента данных).
Для загрузки полного адреса ячейки памяти существуют команды LDS и LES. При их выполнении смещение искомого адреса пересылается в указанный командой 16-разрядный РОН, а сегментная составляющая адреса (которая потом смещается на 4 разряда при определении физического адреса) помещается в 1-ой команде в регистр данных DS, а во 2-ой команде – в дополнительный регистр данных ES.
Команды PUSH и POP помещают или извлекают указанные в них данные на вершину стека (более подробно их будем рассматривать на конкретных примерах программ).
Вопросы для проверки усвоения команд пересылки данных.
1. Заполните таблицу, считая все команды независимыми. Переменная BYTE определена как DB 05 и описана первой в сегменте данных. Отметьте некорректные инструкции.
Команда
| Содержимое операнда до выполнения команды
| Результат выполнения
| MOV CX,25H
| CX=0000H
| CX=
| MOV CL,0
| CX=FFFFH
| CX=
| MOV AX,BYTE
| AX=1234H
| AX=
| MOV DL,BYTE
| DX=0120H
| DX=
| LEA BX,BYTE
| BX=3456H
| BX=
| XCHG AH,AL
| AX=1234Y
| AX=
| XCHG CX,CX
| CX=1234H
| CX=
| 2. Чем существенно различаются в исполнении 2 инструкции, записанные одной строкой (обратитесь к теме “Режимы адресации”)? Какой смысл имеют в этих инструкциях квадратные скобки?
A) MOV DX,AC24H MOV DX,[AC24H]
B) MOV BX,WORDA MOV BX,[WORDA]
C) MOV BX,OFFSET WORDA LEA BX,WORDA
3. Укажите, как одной командой поменять содержимое слова WORD и регистра АХ.
4. Укажите команду, загружающую в регистр SI смещение элемента данных с именем RATE.
5. В сегменте данных описан вектор TABL DB 12,15,16,10,8,2,5,0. Напишите команды занесения значения четвертого байта (значение 10) в регистр AL
а) с использованием прямой адресации;
б) с использованием косвенной адресации;
в) с использованием прямой адресации с индексированием.
6. Используя описание вектора из пункта 5, заполните пустые места в таблице.
Команда
| Комментарий или результат выполнения
| LEA BX,TABL
| Инициализируем ВХ
| MOV DI,4
| и DI
| MOV CL,[BX]
| CL=
| MOV DL,[BX+3]
| DL=
| MOV AL,[BX+DI]
| AL=
| MOV CH,2[BX+DI]
| CH=
|
Команды манипулирования битами
Команды этой группы сведены в таблицу 3.
Мнемокод
| Формат
| Логические команды
AND
|
AND приемник, источник
| OR
| OR приемник, источник
| ХOR
| ХOR приемник, источник
| NOT
| NOT приемник
| TEST
| TEST приемник, источник
| Команды сдвига
SAL, SHL
|
SAL, SHL приемник, источник
| SAR
| SAR приемник, источник
| SHR
| SHR приемник, источник
| Команды циклического сдвига
ROL
|
ROL приемник, источник
| ROR
| ROR приемник, источник
| RCL
| RCL приемник, источник
| RCR
| RCR приемник, источник
|
Логические команды выполняют побитовые операции по приведенным ниже правилам:
Бит источника
| Бит приемника
| AND
| OR
| XOR
| NOT
| TEST
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Логические операции, кроме NOT, устанавливают флаги SF (знака), ZF (нуля) и PF(четности), флаг переноса устанавливается в 0. Все команды, за исключением TEST, сохраняют результат логической операции в приемнике. Команда TEST выполняет такую же операцию, что и AND. Различие только в том, что результат операции TEST не сохраняется в приемнике, а используется для следующей команды перехода по нулю.
Логические команды хороши тем, что выполняются быстро, быстрее “коротких” команд сложения и вычитания, однако студенты редко ими пользуются в своих программах. Приведу некоторые полезные приемы применения этих команд.
Часто встречающийся в программах прием – использование логической команды “исключающее или” (XOR) для обнуления регистра:
XOR AX,AX.
Поскольку логические команды устанавливают флаги, их можно применять для проверки значений регистров. Например,
OR DX,DX ;проверить значение в регистре.
Следует отметить, что эта команда не изменит значения в регистре DX, но при этом, если в регистре хранится нулевое значение, будет установлен в 1 флаг ZF, если старший 15-ый бит в регистре единичный (что свидетельствует об отрицательном значении при представлении его как числа со знаком), то будет установлен в 1 флаг знака SF).
При проверки четности или нечетности значения в регистре, можно воспользоваться командой
AND DX,1H ;выделить младший бит,
учитывая, что двоичное представление четных чисел имеет нулевой последний бит. Следует отметить, что при использовании команды AND значение в регистре будет этой командой изменено. Если необходимо оставить значение в регистре DX без изменений, то следует воспользоваться командой TEST, например, таким образом:
TEST DX,00000001B ;проверить младший бит.
В разделе “команды передачи управления” приводится более подробный фрагмент программы с использованием логических команд.
В командах сдвига источник должен содержать значение счетчика сдвигов. Естественно, это значение должно быть целым числом без знака, да к тому же и лежать в разумных пределах (в последних публикациях указывается ограничение, равное 31. Правда, говорится, что оно может быть и большим, до 255, но команды сдвига воспринимают из этого значения- источника только младшие 5 двоичных разрядов). Среди команд сдвига 2 выполняют арифметический сдвиг, а 2 –логический. Отличие в том, что при арифметическом сдвиге в качестве операндов выступают числа со знаком и это надо учитывать в программе. Рассмотрим эти команды подробнее.
Сдвиг влево логический SHL приемник, источник –каждый бит приемника сдвигается влево на указанное число двоичных разрядов. Освобождаемые позиции в младших разрядах заполняются нулями. Если представить эту операцию как серию сдвигов на 1 позицию, то старший разряд перед последним сдвигом попадает во флаг CF.
0
Сдвиг вправо логический SHR приемник, источник –каждый бит приемника сдвигается вправо на указанное число двоичных разрядов. Освобождаемые позиции в старших разрядах заполняются нулями. Если представить эту операцию как серию сдвигов на 1 позицию, то младший разряд перед последним сдвигом попадает во флаг CF.
0
Сдвиг влево арифметический SАL приемник, источник –каждый бит приемника сдвигается влево на указанное число двоичных разрядов. Освобождаемые позиции в младших разрядах заполняются нулями. Знак операция не сохраняет, но устанавливает в 1 флаг CF, если изменяется знаковый разряд очередным сдвигаемым битом, поэтому на приведенной ниже иллюстрации команды связь с флагом обозначена прерывистой линией.
0
Сдвиг вправо арифметический SАR приемник, источник –каждый бит приемника сдвигается влево на указанное число двоичных разрядов. Команда сохраняет знак операнда-приемника, восстанавливая его после сдвига каждого очередного бита.
Все описанные команды позволяют умножать (при сдвиге влево) или делить (при сдвиге вправо) значение источника на степени числа 2. При этом скорость выполнения команд сдвига намного больше, чем скорость операций умножения или деления.
Циклический сдвиг ROL и ROR отличается от логического тем, что выдавливаемые за пределы разрядной сетки биты операнда-приемника записываются в него же на освобождаемые справа или слева позиции. Последний выдавливаемый справа или слева разряд записывается во флаг CF.
Команды циклического сдвига RCL и RCR отличаются от предыдущих тем, что выдавливаемые биты становятся значением флага CF и только на следующем выполнении этих команд (при условии, что они выполняются в цикле) бит из флага CF заносится в младший или старший биты операнда-приемника.
Занесение бита после предыдущего сдвига
Можно использовать команды циклических и обычных сдвигов для умножения и деления чисел в формате двойного слова на степени двойки. Рассмотрим 32-битовое число, в котором старшие 16 бит хранятся в DX, а младшие – в AX и виде DX:AX. Инструкции для умножения этого числа таковы:
SHL AX,1 ;сдвигаем все биты налево, а старший – в CF
RCL DX,1 ;помещаем бит из CF в DX, предварительно сдвинув все биты регистра влево.
Для деления на 2 такого числа нужно применить команды:
SAR DX,1 ;сдвигаем биты направо, а младший – в CF
RCR AX,1 ;все биты АХ сдвигаем направо, а на освободившееся место записываем выдвинутый на предыдущем шаге бит из DX.
Вопросы для проверки усвоения команд пересылки данных.
1. Для команды с двумя операндами укажите, какой операнд является источником, а какой приемником?
2. Укажите символьные инструкции (команды ассемблера), выполняющие следующие действия: сдвиг СХ на 2 бита вправо; сдвиг АХ на 2 бита влево; помещение значения 426 в СХ; сравнение BYTE1 и 25Н.
3. Полагая, что DL содержит 011110001В, а элемент данных BOOL содержит 11100011В, определите результат в DL каждой отдельно взятой инструкции:
а) AND DL,BOOL b) OR DL,BOOL
c) XOR DL,BOOL d) AND DL,00000000B
e) XOR DL,11111111B f) NOT DL
Какими инструкциями будет установлен в 1 флаг ZF?
4. Полагая, что DX содержит значение 10111001 10111001В, определите, какое значение будет содержать DX после выполнения следующих отдельно взятых инструкций:
a) SHL DL,1 b) SHL DX,2 c) SHR DX,1
d) SAR DX,2 e) SAL DH,3 f) ROR DX,3
g) ROR DL,3
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|