Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура компьютеров / 6_Ассемблер-IA-32.doc
Скачиваний:
62
Добавлен:
20.03.2015
Размер:
593.92 Кб
Скачать

6.3.2. Команды сравнения

Условный переход в программах часто осуществляется в соответствии с резуль­татом сравнения двух чисел. Команда Compare

CMP dst,src

выполняет операцию

[dst] - [src]

и на основе полученного результата устанавливает флаги кодов условий. При этом ни один из операндов не изменяется и первый операнд всегда сравнивается со вторым. Например, переход по условию «больше» выполняется в том случае, если операнд назначения dst больше исходного операнда src.

6.3.3. Безусловный переход

Команда безусловного перехода JMP всегда вызывает переход к команде по целе­вому адресу. В ней может быть задано короткое (1 байт) или длинное (4 байта) от­носительное смещение со знаком. Кроме того, как и в командах условного перехо­да, могут использоваться другие режимы адресации. Такая гибкость определения целевого адреса перехода может быть очень полезной. В каждой точке программы выполняется только одно из альтернативных вычислений. Предположим, что в спе­циальной таблице в памяти начиная с адреса JUMPTABLE хранятся 4-байтовые адреса первой команды каждой из подпрограмм, представляющих возможные ветви программы. Если последовательно пронумеровать эти ветви как 0, 1, 2... и загрузить индекс выполняемой подпрограммы в регистр ESI, то переход к вы­бранной ветви может быть выполнен посредством такой команды с использова­нием индексной адресации со смещением:

JMP [JUMPTABLE + ESI*4]

6.4. Логические команды, команды сдвига и циклического сдвига

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

В архитектуре IA-32 имеются команды, выполняющие логические операции И, ИЛИ и Исключающее ИЛИ (END, OR, XOR). Это поразрядные операции с двумя операндами и записью результата по адресу назначения. Предположим, что в регистре ЕАХ со­держится шестнадцатеричное значение 0000FFFF, а в регистре ЕВХ — значение 02FA62CA. Команда

AND EBX,EAX

очистит левую половину регистра ЕВХ, заполнив ее нулями, а правую его часть оставит без изменений. В результате в ЕВХ окажется значение 000062СА.

Кроме того, в архитектуре IA-32 имеется команда NOT, генерирующая логиче­ское дополнение всех битов операнда, то есть заменяющая все единицы нулями, а все нули единицами.

6.4.2. Операции сдвига и циклического сдвига

При помощи операции логического или арифметического сдвига операнд может быть смещен влево или вправо на заданное количество разрядов. Формат коман­ды сдвига таков:

КодОперации dst,count

где сдвигаемый операнд dst задается при помощи одного из стандартных адрес­ных режимов, а количество разрядов сдвига count представляется 8-разрядным значением, либо задаваемым непосредственно в команде, либо содержащимся в 8-разрядном регистре CL. Существует четыре команды сдвига:

- SHL — логический сдвиг влево;

- SHR — логический сдвиг вправо;

- SAL — арифметический сдвиг влево (то же, что SHL);

- SAR — арифметический сдвиг вправо.

При внимательном рассмотрении представления двоичного числа, понятно, что сдвиг числа на один разряд влево эквивалентен его умножению на 2, а сдвиг на один разряд вправо — его делению на 2. Конечно, при сдвиге влево может произойти переполнение, а при сдвиге вправо может по­теряться конец числа. Освобождающиеся в результате сдвига разряды устанавливаются в 0, а сдвигаемые за границу операнда разряды отмечаются с помощью флага перено­са С, а затем удаляются. Устанавливать флаг С особенно удобно при выполнении арифметических операций с большими числами, занимающими больше одного слова. На рис. 6.2, а показан пример сдвига содержимого регистра R0 влево на два разряда. Команда логического сдвига вправо работает точно так же (рис. 6.2,6).

Еще одно важное наблюдение заключается в том, что при сдвиге вправо в освободившемся разряде должен быть повторен знаковый бит. Этим арифметический сдвиг вправо отличается от логического, в котором осво­бождающиеся разряды всегда заполняются нулями. Пример арифметического сдвига вправо (SAR) приведен на рис. 6.2, в. Арифметический сдвиг влево ничем не отличается от логического.

а

б

в

Рис. 6.2. Команды логического и арифметического сдвига: логический сдвиг влево, SHL R0,2 (а); логический сдвиг вправо, SHR R0,2 (б); арифметический сдвиг вправо, SAR R0,2 (в)

Существует также четыре команды циклического сдвига:

ROL - циклический сдвиг влево;

ROR - циклический сдвиг вправо;

RCL - циклический сдвиг влево с установкой флага CF;

RCR - циклический сдвиг вправо с установкой флага CF.

Компьютер поддерживает две вер­сии циклического сдвига вправо и две версии циклического сдвига влево. В пер­вой версии разряды операнда просто циклически сдвигаются, а во второй в сдви­ге участвует еще и флаг CF. Примеры всех четырех операций циклического сдвига приведены на рис. 6.3.

Рис. 6.3. Команды циклического сдвига: влево без переноса, ROL R0,2 (a); влево с пере-носом, RLC R0,2 (б); вправо без переноса, ROR R0,2 (a); вправо с переносом, RRC R0,2 (г)

Соседние файлы в папке Архитектура компьютеров