Система команд. Эволюция системы команд процессоров фирмы Intel. Стековые команды, страница 2

е)  Декремент

DECsrc;src¬ (src) - 1

Эта команда не изменяет флажка ZF.

ж)  Изменение знака

NEG src ;             src  ¬ 0 - (src)

з)  Команды сравнения

CMP dst, src ;         (dst) - (src)

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

и)  Умножение беззнаковое

MUL src; axt : ac:= (ac) * (src)

ac – аккумулятор;

axt – расширение аккумулятора.

Если сомножители байты: AX ßAL * (src). AHявляется расширением AL .

Если сомножители слова: DX:AX ßAX * (src). DXявляется расширением AX .

к)  Деление беззнаковое

DIV src ;

src – делитель; делимое находится в и axt. частное:                            остаток:

если делитель – байт, то частное AL ßAX / (src);

остаток  AHßAX / (src).

если делитель – слово, то частное AXßDX.AX / (src);

остаток  DXßDX.AX / (src).

Логические операции и сдвиги

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

а)  AND dst, src  ;  dst:= (dst) & (src)

б)  OR dst, src     ;  dst:= (dst) Ú (src)

в)  XOR dst, src  ;  dst:= (dst) Å (src)

г)  TEST dst, src ;  dst:= (dst) Ù (src)

д)  NOT src         ;  dst:= Ø(src)

По результату определяются флаги ZF, SF, PF.

Сдвиги

Логические сдвиги. Выдвигаемый бит теряется, в освободившийся разряд заносится «0».

Арифметические сдвиги

SAL - АС влево

АС влево совпадает с ЛС влево

SAR AC вправо.

Знаковый разряд не меняется, а копируется.

Циклические. Выдвигаемый байт передается в освободившийся.

RCL - циклический сдвиг влево через перенос.

RCR - циклический сдвиг вправо через перенос.

ROL - циклический сдвиг влево. Выдвигаемый бит фиксируется в CF.

ROR - циклический сдвиг вправо. Выдвигаемый бит фиксируется в CF.

Сдвиг может быть на 1 бит или несколько – количество указывается в регистре CL.

Команды передачи управления

При выполнении линейных фрагментов программ команды выполняются в естественном порядке, то есть одна за другой.

При появлении команды передачи управления естественный порядок нарушается и выполняется команда, которая находится в другом месте программной памяти. Сегментная организация памяти определяет наличие двух разновидностей команд передачи управления. Передача управления внутри текущего сегмента кода называется внутрисегментной – при этом изменяется только регистр EIP/IP и адрес перехода задает смещение внутри сегмента. Такая передача называется близкой и имеет тип NEAR. Передача управления за пределы текущего сегмента кода называется межсегментной – при этом необходимо модифицировать содержимое регистров CS и EIP/IP. Такая передача называется далекой и имеет тип FAR.

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

Рассмотрим только внутрисегментные безусловные переходы.

а)   JMP <метка> ; прямой внутрисегментный переход.

15                    8

7                       0

КОП

dispL

dispL – смещение – целое со знаком в диапазоне  -128..+127.

Адрес перехода определяется следующим образом:

IP = (IP) + dispL

адрес, следующий  за JMP команды.

б)  JMPreg/mem ; косвенный внутрисегментный переход.

Адрес перехода содержится в регистре или ячейке памяти. Он просто загружается в IP.

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

Jcc <метка>;

сс – код условия, который кодируется в коде операции.

Все команды условного перехода производят передачу управления в пределах текущего сегмента кода. Команды условного перехода проверяют любые отношения между знаковыми («больше-меньше») и беззнаковыми («выше-ниже») числами, а также состояние всех арифметических флажков, кроме AF..

При их выполнении проверяется некоторое условие, закодированное состояниями флажков:

  • если условие не выполняется, то выполняется следующая по порядку команда;
  • если условие выполняется, то осуществляется переход.

Формат:  

15                    8

7                       0

КОП

dispL

Команда JCXZ позволяет проверять содержимое СХ перед циклом.

Команды управления циклом

а)  Loop <метка>  - повторить цикл.

§  декремент счетчика циклов – CX;

§  если CX ≠ 0, то управление передается в начало цикла (IP) = (IP) + disp;

§  если CX = 0, то выполняется следующая после цикла команда.

б)  LoopE / LoopZ - передача управление в начало цикла, если CX ≠ 0 и ZF = 1

в)  LoopNE / LoopNZ - передача управления при CX ≠ 0, ZF = 0.

Команды вызова подпрограмм

CALL <метка>;

Метка – метка той команды, с которой начинается выполнение подпрограммы.

Порядок выполнения команды:

§  включить адрес возврата в стек, т.е. адрес команды, находящийся после команды CALL;

§  загрузить начальный адрес подпрограммы в IP.

Подпрограмма содержит минимум одну команду RET – возврат из подпрограммы. Она загружает в CS:IP из стека адрес возврата.