Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО_Лекции_2011_01.docx
Скачиваний:
8
Добавлен:
31.07.2019
Размер:
521.09 Кб
Скачать

cmp x, y

Опкод

Значение(переход,если...)

Условие

JA

Jump if above (X > Y)

CF=0& ZF=0

JAE

Jump if above or equal (X >= Y)

CF=0

JB

Jump if below (X < Y)

CF=1

JBE

Jump if below or equal (X < Y)

CF=1orZF=1

JC

Jump if carry (cf=1)

CF=1

JCXZ

Jump if CX=0

регистр CX=0

JE (то же, что и JZ)

Jump if equal (X = Y)

ZF=1

JG

Jump if greater (signed) (X > Y)

ZF=0 & SF=OF

JGE

Jump if greater or equal (signed) (X >= Y)

SF=OF

JL

Jump if less (signed) (X < Y)

SF != OF

JLE

Jump if less or equal (signed) (X <= Y)

ZF=1 or SF!=OF

JMP

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

-

JNA

Jump if not above (X <= Y)

CF=1orZF=1

JNAE

Jump if not above or equal (X < Y)

CF=1

JNB

Jump if not below (X >= Y)

CF=0

JNBE

Jump if not below or equal (X > Y)

CF=1& ZF=0

JNC

Jump if not carry (cf=0)

CF=0

JNE

Jump if not equal (X != Y)

ZF=0

JNG

Jump if not greater (signed) (X <= Y)

ZF=1 or SF!=OF

JNGE

Jump if not greater or equal (signed) (X < Y)

SF!=OF

JNL

Jump if not less (signed) (X >= Y)

SF=OF

JNLE

Jump if not less or equal (signed) (X > Y)

ZF=0 & SF=OF

JNO

Jump if not overflow (signed) (of=0)

OF=0

JNP

Jump if no parity (pf=0)

PF=0

JNS

Jump if not signed (signed) (sf=0)

SF=0

JNZ

Jump if not zero (X != Y)

ZF=0

JO

Jump if overflow (signed) (of=1)

OF=1

JP

Jump if parity (pf=1)

PF=1

JP

Jump if parity (pf=1)

PF=1

JPE

Jump if parity even

PF=1

JPO

Jump if parity odd

PF=0

JS

Jump if signed (signed)

SF=1

JZ

Jump if zero (X = Y)

ZF=1

Все команды перехода имеют один операнд: смещение для перехода.

Организация циклов.

Иногда надо организовать цикл, т.е. совершить повторение количество раз, которое указано в регистре ECX. Следовательно, надо у теле цикла уменьшать значение ECX. Именно для этого предназначена команда loop. Он проверяет, равен ли регистр ECX нулю, если он не равен нулю, то значение регистра ECX уменьшается на 1 и совершается ближний прыжок на смещение указанное в операнде.

Mov ecx, 023h repeat:

; обязательно ближнее расстояние

Loop repeat Тело цикла выполнится 23h раза.

Команда loope делает то же самое, но перед прыжком проверяет, установлен ли флаг ZF, если он установлен, то прыжок совершается. Точно тоже самое делает команда loopz. Команды loopne и loopnz делают то же сомое что и loope, но прыгают, если флаг ZF сброшен.

Арифметические операции - ADD, SUB, MUL, DIV. Многие опкоды делают вычисления. Вы можете узнать многие из них по их названиям: add (addition - добавление), sub (substraction - вычитание), mul (multiply - умножение), div (divide - деление).

Опкод add имеет следующий синтаксис: add приемник, источник

Выполняет вычисление: приемник = приемник + источник.

Имеются также другие формы:

приемник

источник

пример

регистр

регистр

add ecx, edx

регистр

память

add ecx, dword ptr [104h] / add ecx, [edx]

регистр

значение

add eax, 102

память

значение

add dword ptr [401231h], 80

память

регистр

add dword ptr [401231h], edx

Эта команда очень проста. Она добавляет значение источника к значение приемника и помещает результат в приемник. Другие математические команды:

sub приемник, источник (приемник = приемник - источник) mul множимое, множитель (множимое = множимое * множитель) div делитель (eax = eax / делитель, edx = остаток)

Поскольку регистры могут содержать только целочисленные значения (то есть числа, не, с плавающей запятой), результат деления разбит на частное и остаток. Теперь, в зависимости от размера источника, частное сохраняется в eax, а остаток в edx:

размер источника

деление

частное в...

остаток в...

BYTE (8-bits)

ax / делитель

AL

AH

WORD (16-bits)

dx:ax* / делитель

AX

DX

DWORD (32-bits)

edx:eax* / делитель

EAX

EDX

* = Например: если dx = 2030h, а ax = 0040h, dx: ax = 20300040h. Dx:ax - значение dword, где dx представляет старшее word, а ax - младшее. Edx:eax - значение quadword (64 бита), где старшее dword в edx и младшее в eax.

Источник операции деления может быть:

  1. 8-бит регистр (al, ah, cl,...)

  2. 16-бит регистр (ax, dx, ...)

  3. 32-бит регистр (eax, edx, ecx...)

  4. 8-бит значение из памяти (byte ptr [xxxx])

  5. 16-бит значение из памяти (word ptr [xxxx])

  6. 6a 32-бит значение памяти (dword ptr [xxxx])

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

Логические операции с битами - OR, XOR, AND, NOT-Эти команды работают с приемником и источником, исключение команда 'NOT'. Каждый бит в приемнике сравнивается с тем же самым битом в источнике, и в зависимости от команды, 0 или 1 помещается в бит приемника:

команда

AND

OR

XOR

NOT

Бит источника

0

0

1

1

0

0

1

1

0

0

1

1

0

1

Бит приемника

0

1

0

1

0

1

0

1

0

1

0

1

X

X

Бит результата

0

0

0

1

0

1

1

1

0

1

1

0

1

0

AND (логическое И) устанавливает бит результата в 1, если оба бита, бит источника и бит приемника установлены в 1. OR (логическое ИЛИ) устанавливает бит результата в 1, если один из битов, бит источника или бит приемника установлен в 1.