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



 

XCHG (eXHanGe register/memory with register) – обмен данными.

Команда производит взаимный обмен значениями между операндом-источником и операндом-приемником.

Ассемблерная нотация команды: XCHG op1, op2.

В качестве операндов могут использоваться reg, mem. Оба операнда не могут быть операндами из памяти.

Значения флагов не меняются.

 

PUSH (PUSH operand onto stack) –загрузка операнда в стек.

Ассемблерная нотация команды: PUSH src.

Выполняет декремент указателя стека SP (Stack Pointer) на два и затем заносит слово операнда-источника в вершину стека, адресуемую SP (по адресу SS:SP).

 Операндом может быть регистр общего назначения, сегментный регистр, слово памяти. Команда часто используется для передачи (через стек) параметров вызываемой процедуре или для сохранения значений временных переменных.

Пример:

PUSH AX – поместить содержимое регистра АХ в стек.

Значения флагов не меняются.

 

POP –(POP operand from the stack) – восстановление операнда из стека.

Ассемблерная нотация команды: POP dst.

Команда восстанавливает в операнде-приемнике слово, хранящееся в вершине стека (т.е. значение по адресу SS:SP) и производит инкремент указателя стека (SP) на 2. В качестве операнда команды может использоваться регистр общего назначения, сегментный регистр, слово памяти. Т.к. стек работает со словами, но не с байтами, операнд должен быть 16-разрядным.

Значения флагов не меняются.

Все команды флажковых передач являются безадресными, т.к. используют неявную адресацию операндов.

 

PUSHF (PUSH Flags register onto stack) – запись в стек содержимого регистра флагов.

Действия, выполняемые командой:

SP-2®SP.

FLAGS®[SS : SP]

Команда PUSHF производит декремент указателя стека на 2 и копирует регистр FLAGS в новую вершину стека.

Значения флагов не меняются.

 

POPF (POP Flags register from the stack) – извлечение из стека в регистр флагов.

Действия, выполняемые командой:

[SS : SP] à FLAGS;

SP+2à SP.

Команда POPF извлекает слово из вершины стека и сохраняет его значение в регистре флагов, далее производится инкремент указателя стека (SP) на два.

Меняются значения всех флагов (OF, DF, IF, TF, SF, AF, ZF, PF, CF)

 

LAHF (Load Flags into AH register) – загрузка флагов в регистр AH.

Действие, выполняемое командой:

FLAGS (7:0) à AH.

Команда LAHF передает младший байт регистра флагов в регистр АН. При этом в регистр AH загружаются все арифметические флаги, кроме OF, который размещается в старшем байте регистра флагов.

SAHF (Store AH into Flags) – сохранить содержимое АН в регистре флагов.

Действие, выполняемое командой:

AH à FLAGS (7:0).

Команда SAHF записывает биты регистра АН в регистр флагов. При этом значения битов 0, 2, 4, 6, 7 регистра АН становятся соответственно значениями флагов: переноса (CF), четности(PF), дополнительного переноса (AF), нуля (ZF) и знака (SF).

 

8. Арифметические команды - назначение, синтаксис, примеры.

Классификация арифметических команд приведена на рис. 7.3.      

Рис. 7.3 - Классификация арифметических команд

7.2.1. Аддитивные команды

Аддитивные команды представляются в обобщенном виде:

CODE dst,src (CODE – код операции или мнемоническое обозначение команды),

dst : = r, mem;

src := r, mem, imm.

ADD (ADD integers) – сложение целых чисел.

Команда ADD прибавляет операнд-источник к операнду-приемнику и помещает результат на место операнда-приемника.

Действия, выполняемые командой: dst + src ® dst.

SUB (SUBtract integers) – вычитание целых чисел.

Команда SUB вычитает операнд-источник из операнда-приемника и помещает результат на место операнда-приемника.

Действия, выполняемые командой: dst - src ® dst.

ADC (ADd integers with Carry) – сложение целых чисел с переносом.

Команда ADC складывает операнд-источник, операнд-приемник и значение флага переноса (CF). Результат заносится в операнд-приемник.

Действия, выполняемые командой: dst + src + CF ® dst.

Команда ADC обычно используется для организации сложения длинных чисел по частям (байтам или словам).

SBB (SuBtract integers with Borrow) – вычитание целых чисел с заемом.

Команда SBB вычитает операнд-источник из операнда-приемника, затем вычитает из результата значение флага заема (CF). Результат заносится в операнд-приемник.

Действия, выполняемые командой: dst - src - CF ® dst.

Команда SBB обычно используется для организации вычитания длинных чисел по частям (байтам или словам).

CMP  (CoMPare two operands) - Сравнение двух операндов.

Команда CMP реализуется как вычитание операнда-источника из операнда-приёмника, но в отличии от команды SUB, результат вычитания не сохраняется в приёмнике, а лишь оказывает влияние на арифметические флаги.

Команда CMP обычно используется для организации условных переходов по различным арифметическим флагам.

 

Мультипликативные команды

Мультипликативные команды разделяются на два вида: беззнаковые и знаковые, что объясняется различием алгоритмов умножения и деления для беззнаковых и знаковых целых чисел.

Мультипликативные команды в ассемблерной нотации представляются в виде: CODE src.

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

В командах умножения (MUL / IMUL) результат операции представляется в удвоенном формате по сравнению с форматом операнда в соответствии с табл. 7.1.

Таблица 7.1.

Множимое (dst) Множитель (src) Произведение
AL src 8 AX
AX src 16 DX.AX

 

MUL(unsigned integer MULtiply of AL register or AX register) – беззнаковое умножение целых чисел.

IMUL (signed integer MULtiply) – знаковое умножение целых чисел.

Обе команды производят умножение содержимого аккумулятора (множимого) на операнд-источник (множитель). Если операнд-источник имеет размер 8 бит, в качестве аккумулятора берется регистр AL, и результат помещается в AX. При размере операнда-источника в 16 бит в качестве аккумулятора используется AХ, и результат помещается в пару регистров DX.AX (в DX – старшие разряды произведения, в AX – младшие).

 

В командах деления (DIV / IDIV) первый операнд (делимое) представляется в удвоенном формате по сравнению со вторым операндом (делителем). Делимое является аккумуляторным операндом. Результат целочисленного деления представляется в виде частного, которое замещает младшую половину делимого, и остатка, который замещает старшую половину делимого. Представление операнда-приемника (делимого) и результата операции в регистрах в зависимости от формата операнда-источника (делителя) приведено в таблице 7.2.

Таблица 7.2.

Делимое (dst) Делитель (src) Частное Остаток
AX src 8 AL AH
DX.AX src 16 AX DX

 

DIV (unsigned integer DIVide) – беззнаковое деление целых чисел.

IDIV (signed integer DIVide) – знаковое деление целых чисел.

Обе команды производят деление неявно заданного операнда-приемника на указанный в команде операнд-источник. Если размер делителя 8 бит, в качестве делимого используется содержимое регистра АХ. При размере делителя 16 бит делимое находится в паре регистров DX.AX. Частное в первом случае помещается в AL, остаток – в AH, во втором случае частное помещается в AX, а остаток – в DX.

9. Команды сдвигов, команды переходов - назначение, синтаксис, примеры.

Классификация команд сдвигов приведена на рис.7.5.

 

Рис. 7.5 - Классификация команд сдвигов

 

В ассемблерной нотации команды сдвигов используются два операнда, первый из которых (ор) задает, собственно, сдвигаемый операнд, который может размещаться в регистре или в памяти (reg, mem), а второй (counter) определяет способ задания количества сдвигов. Если этот операнд равен единице, то выполняется так называемый однократный сдвиг (сдвиг на 1 разряд), если же в качестве второго операнда задается CL, то число разрядов, на которое осуществляется сдвиг, выбирается из регистра CL, в этом случае имеет место так называемый многократный сдвиг.

SAL/SAR/SHL/SHR (Shift instruction) – команды сдвига.

Отличие команд арифметического сдвига от команд логического сдвига проявляется только для сдвига вправо. При арифметическом сдвиге вправо (SAR) в освобождающийся старший разряд копируется его прежнее значение. Это позволяет сохранить знак операнда при его сдвиге вправо. В свою очередь, при выполнении команды логического сдвига вправо (SHR), в освобождающийся старший разряд заносится 0.

Арифметический и логический сдвиги влево реализуются одинаково, в связи с чем в машинной системе команд они имеют одинаковый код операции.

Команды арифметического и логического сдвигов, как правило, используются в ассемблерных программах для умножения или деления на степени двойки. Например, сдвиг вправо на два разряда осуществляет деление операнда на 4, а сдвиг влево на два разряда – умножение на 4. При этом арифметический сдвиг используется при знаковом представлении операнда, а логический – при беззнаковом. 

RCL/RCR/ROL/ROR – вращение (циклический сдвиг).

Команды циклического сдвига реализуют так называемое вращение (ротацию) операнда, при котором спадающие разряды сохраняются в освобождающихся.

Отличие двух модификаций команд циклического сдвига является возможность включения или исключения флага CF в кольцо (из кольца).

Для RCR и RCL предполагается, что предварительное значение флага CF (до выполнения команды) равно 0.

 

Различают два вида команд перехода:

безусловные;

условные.

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

Команда безусловного перехода JMP(JuMP if condition is met) передаёт управление другой ко­манде управления по заданному адресу перехода. В JMP могут использоваться все способы задания адреса перехода рассмотренные выше.

 

Условный переход.

Команды условного перехода характеризуются проверкой некоторого за­данного кодом операции условия и реализацией перехода по заданному адресу при выполнении условия или к следующей команде при его не выполнении.

Общий формат команды условного перехода имеет следующий вид:

 

                            Рис. 7.8 – Формат команды условного перехода

 

Условные переходы принято делить на:

знаковые;

беззнаковые;

по отдельным флагам;

по счётчику.

Отличие знаковых переходов от беззнаковых состоит в способе интер­претации данных, над которыми производится предшествующая переходу ко­манда, как знаковых, так и беззнаковых целых чисел. Как правило, этой коман­дой является команда сравнения СМР.

В аналогичных по смыслу знаковых и беззнаковых переходах анализируются разные арифметические флаги (см. таблицу 7.3). В знаковых переходах в мнемонике используются буквы G – Greater (больше), L – Less (меньше), а в беззнаковых переходах буквы A – Above (выше), B - Below (ниже).

В переходах по отдельным флагам можно использовать любой арифметический флаг, кроме AF, переход к которому отсутствует (JC - по переносу; JO - по переполнению).

 

Команды условных переходов.

Таблица 7.3.    


Дата добавления: 2018-04-04; просмотров: 505; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!