Команда не влияет на арифметические флаги
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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!