Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АрхЭВМ часть 1.doc
Скачиваний:
24
Добавлен:
08.02.2015
Размер:
1.52 Mб
Скачать
    • Команды ia-32

Условные и безусловные переходы:

(31 команда)

JA

JAE

JB

JBE

JC

Jump если больше:

Jump если больше/равно:

Jump если меньше:

Jump if меньше/равно:

Jump если Carry:

CF=0 и ZF=0

CF=0

CF=1

CF=1 или ZF=1

CF=1

JCXZ

JE

JECXZ

JG

JGE

JL

JLE

JNA

JNAE

Jump если CX=0

Jump если равно:

Jump если ECX=0

Jump если больше:

Jump если больше/равно:

Jump если меньше:

Jump если меньше/равно:

Jump если не больше:

Jump если не больше/равно:

CX=0

ZF=1

ECX=0

ZF=0 и SF>=OF

SF=OF

SF <=OF

ZF=1 и SF <=OF

CF=1 и ZF=1

CF=1

JNB

JNBE

JNC

JNE

JNG

JNGE

JNL

JNLE

JNO

JNP

Jump если не меньше:

Jump если не меньше/равно:

Jump если не Carry:

Jump если не равно:

Jump если не больше:

Jump если не больше/равно:

Jump если не меньше:

Jump если не меньше/равно:

Jump если не переполнение:

Jump если нечетный:

CF=0

CF=0 и ZF>=0

CF=0

ZF=0

ZF=1 или SF <> OF

SF <=OF

SF=OF

ZF=0 и SF>=OF

OF=0

PF=0

JNS

JNZ

JO

JP

JS

JZ

JMP

Jump если не знак:

Jump если не ноль:

Jump если переполнение:

Jump если четный:

Jump если знак:

Jump если ноль:

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

SF=0

ZF=0

OF=1

PF=1

SF=1

ZF=1

Циклы:

(5 команд)

LOOP/LOOPE/LOOPNE/LOOPNZ/LOOPZ <адрес>- петли со счетчиком СХ.Уменьшают СХ на единицу, затем совершают переход на адрес, указанный в качестве аргумента. Когда ЕСХ=0, переход не осуществляется, и программа исполняется дальше. Переменные (-E, -NE, -NZ, -Z) осуществляют переход только если СХ=0, и выполнены условия флаг Z процессора.

LOOP

LOOPE

LOOPNE

LOOPNZ

LOOPZ

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

Цикл если равно

Цикл если не равно

Цикл если не равно 0

Цикл если равно 0

CX!=0 или Z=1

CX!=0 или Z=0

CX!=0 или Z=0

CX!=0 или Z=1

Повтор строковых команд:

(5 команд)

REP/REPE/REPZ/REPNE/REPNZ <команда> - повторяет команду, данную в качестве аргумента до тех пор, пока СХ не будет равен 0, или пока флаг Z процессора не будет 1, 1, 0, 0 соответственно. Команда должна быть строковой операцией, например, CMPS, INS, LODS, MOVS, OUTS, SCAS, или STOS.

REP

REPE

REPNE

REPNZ

REPZ

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

Повторить если равно

Повторить если не равно

Повторить если не равно 0

Повторить если равно 0

CX!=0 или Z=1

CX!=0 или Z=0

CX!=0 или Z=0

CX!=0 или Z=1

Возврат из CALL:

(3 команды)

RET/RETF/RETN - процедура возврата из CALL. Передает управление на адрес возврата, находящийся в стеке. Цифровой параметр этих функций указывает число байт или слов (в зависимости от кода: 16-ти или 32-х битный), которое "выбрасывается" из стека после возврата. RETF - это "дальний возврат", а RETN - "ближний возврат". Разница в том, что первый использует CS:IP для возврата, а второй только IP.

Операции сравнения:

(5 команд)

CMP <назначение>, <источник> - сравнивает "назначение" и "источник", в результате меняется состояние флагов процессора. Назначение может быть регистром или адресом памяти, источник - регистром, адресом памяти или числом.

CMPS

CMPSB

CMPSW

CMPSD

Сравнивает строки

Сравнить строковый байт

Сравнить слов

Сравнить двойное слово

Меняется состояние флагов процессора

TEST <назначение>, <источник> - логическое побитовое сравнение. В результате меняется состояние флагов процессора. Назначение может быть регистром или адресом памяти, источник - регистр или число.

Математические операции:

(18 команд)

ADC

ADC <назначение>, <источник> - сложение с установкой флага Carry. Хранит результат в

назначении. Используется для сложения двух регистров (ADC edx,eax), регистра с

регистром/адресом памяти/числом (ADC edx, eax/[...]/09h), адреса памяти с

регистром/адресом памяти/числом (ADC [.....], eax/[.....]/09h).

ADD

ADD <назначение>, <источник> - сложение источника с назначением. Результат сохраняется в

назначении . Используется для сложения двух регистров (ADC edx,eax), регистра с

регистром/адресом памяти/числом (ADC edx, eax/[...]/09h), адреса памяти с

регистром/адресом памяти/числом (ADC [.....], eax/[.....]/09h).

DEC

DEC <назначение> - уменьшает на 1 значение регистра или адреса памяти.

DIV/IDIV

DIV/IDIV <источник> - делит АХ на источник , если источник - байт, DX:AX на источник , если источник - слово, и EDX:EAX на источник , если источник - двойное слово. Значение хранится в AL, AX или EAХ. Источником может быть регистр или значение памяти.

IMUL

IMUL <назначение>, <источник> - умножение. Если определен только источник , то AL умножается на источник , если источник - байт; АХ умножается на источник , если источник - слово; или ЕАХ умножается на источник , если источник - двойное слово. Результат записывается в AX, DX:AX, или EDX:EAX соответственно. Источник может быть регистром или значением памяти. Если определены оба аргумента, то назначение умножается на источник , результат записывается в назначение . Назначение может быть

регистром или значением памяти, а источник должен быть числом.

INC

INC <аргумент> - увеличивает аргумент на 1; аргументом может быть регистр или значение

памяти.

MUL

MUL <источник> - умножение. AL умножается на источник , если источник - байт, АХ

умножается на источник , если источник - слово, или ЕАХ умножается на источник , если

источник - двойное слово. Результат записывается в AX, DX:AX, или EDX:EAX

соответственно. Источник может быть регистром или значением памяти.

RCL/ROL

RCL/ROL- <назначение>, <источник> - побитовое вращение числа в назначении влево на число, указанное в источнике . Результат: верхний бит сдвигается в самый низ, второй верхний бит становится первым (самым верхним) - ROL, или самый верхний бит переносится в флаг CF, значение флага переносится в самый низ регистра, второй верхний бит становится первым (самым верхним). Назначением может быть значение памяти или регистра, источник - число.

RCR/ROR

RCR/ROR - <назначение>, <источник> - побитовое вращение числа в назначении вправо на число, указанное в источнике . Результат: верхний бит сдвигается ниже , самый нижний бит становится первым (самым верхним) - ROR, или самый нижний бит переносится в флаг CF, значение флага переносится в вершину регистра, второй нижний бит становится последним. Назначением может быть значение памяти или регистра, источник - число.

SAL/SHL

SAL/SHL <назначение>, <источник> - побитовый сдвиг назначения влево на число, указанное в источнике . Например, 10111100 после сдвига будет 01111000. Назначение - регистр или значение памяти, источник - число или регистр CL. Сдвиг числа на единицу влево равнозначно его умножению на два.

SAR/SHR

SAR/SHR <назначение>, <источник> - побитовый сдвиг назначения вправо на число, указанное в источнике . Например, 10111100 после сдвига будет 01011110. Назначение - регистр или значение памяти, источник - число или регистр CL. Сдвиг числа на единицу влево равнозначно его делению на два.

SUB

SUB <назначение>, <источник> - вычитание. Вычитает источник из назначения , результат записывается в назначение. Назначение - регистр или значение памяти, источник - регистр, значение памяти или число.

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

(5 команд)

Таблица логических значения

Операция

источник

назначение

результат

AND

1

1

0

0

1

0

1

0

1

0

0

0

OR

1

1

0

0

1

0

1

0

1

1

1

0

XOR

1

1

0

0

1

0

1

0

0

1

1

0

NOT

0

1

N/A

N/A

1

0

NEG

NEG <источник> - источник вычитается из 0 и заменяется. Например, двоичное значение

01001001 преобразуется в 10110110, а HEX значение 13 преобразуется в ED.

NOT

NOT <источник> - "переворачивает" каждый бит источника так, что 0 становится 1, а 1 - 0.

Например, значение 01001001 преобразуется в 10110110.

AND

AND <назначение>, <источник> - Логическое "И": сравнивает побитно источник и назначение, и записывает результат в назначении; если оба бита равны 1, то пишется "1", иначе пишется

"0". Источник - значение регистра или памяти, назначение - значение регстра, памяти или число.

OR

OR <назначение>, источник - логическое "ИЛИ": сравнивает побитно низначение и источник,

результат пишется в назначение. Если оба бита равны ")", то пишется ")", иначе записывается "1".

XOR

XOR <назначение>, <источник> - логическое "ИСКЛЮЧАЮЩЕЕ ИЛИ": сравнивает побитно назначение и источник, результат записывается в назначение. Если биты одинаковы (два "0" или две "1"), записывается "0", иначе пишется "1". Если источник и назначение одинаковы, в результате получается "0". Назначение - значение памяти или регистр, источник - значение памяти, регистр или число.

Операции с памятью:

(44 команды)

IN

IN <назначение>, <источник> - ввод из порта: перенос байта, слова или двойного слова из порта,

определенного в источнике, в регистр, указанный в назначении. Назначение - AL, AX или EAX, источник - любой однобайтный номер порта, или DX с двубайтным номером порта.

INS

INSB

INSW

INSD

INS/INSB/INSW/INSD <назначение>, <источник> - ввод из порта в троковую переменную: ввод

информации из порта, определенного в источнике, в место, определенное ES:DI. Значение назначения игнорируется, источником должен быть регистр DX. После переноса DI увеличивается/уменьшается (в зависимости от флага направления) на число перенесенных байт. INSB/INSW/INSD работают без аргументов, и переносят информацию определенного размера (байт, слово или двойное слово) из порта, определенного DX в место, определенное ES:DI.

LEA

LEA <назначение>, <источник> - загрузить адрес: вычисляет адрес (оффсет) источника, и заносит его в назначение. Назначение - регистр, источник - значение памяти или символьное имя.

LODS

LODSB

LODSW

LODSD

LODS/LODSB/LODSW/LODSD <источник> - загрузить строковые данные: записывает байт, слово или двойное слово из ES:SI в Al, AX или ЕАХ.

После записи SI увеличивается/уменьшается (в зависимости от флага направления) на число перенесенных байт. Значение источника игнорируется. LODSB/LODSW/LODSD работают без аргументов.

MOV

MOV <назначение>, <источник> - перенос данных: копирует значение источника в назначение. Если назначение - значение регистра, источник может быть регистром. значением памяти или числом. Если назначение - значение памяти, то источник может быть только регистром или числом.

MOVS

MOVSB

MOVSW

MOVSD

MOVS/MOVSB/MOVSW/MOVSD <назначение>, <источник> - перенос строковых данных: копирует байт/слово/двойное слово из DS:ESI в ES:EDI, независимо от аргументов. После переноса SI и DI увеличиваются,уменьшаются (в зависимости от флага неправления) на число перенесенных байт. MOVSB/MOVSW/MOVSD работают без аргументов.

MOVSCX

MOVSX <назначение>, <источник> - перенос со знаком-расширителем: считывает байт или слово в источнике, и копирует его в слово или двойное слово, определенное назначением

со знаком-расширителем. Назначение - регистр, источник - значение памяти или регистр.

MOVZX

MOVZX <назначение>, <источник> - перенос с расширителем-нулем: считывает байт или слово в источнике, и копирует его в слово или двойное слово, определенное назначением со знаком-нулем. Назначение - регистр, источник - значение памяти или регистр.

OUT

OUT <назначение>, <источник> - вывод в порт: перенос данных из источника в порт, определенный назначением. Источник - AL, AX, EAX. Назначение - любой однобайтовый номер порта или DX с двубайтовым номером порта.

OUTS

OUTSB

OUTSW

OUTSD

OUTS/OUTSB/OUTSW/OUTSD <назначение>, <источник>: вывод строки в порт: перенос данных из DS:ESI в порт, определенный значением регистра DX. Аргументы игнорируются. после переноса SI увеличивается/уменьшается (в зависимости от флага направления) на число перенесенных байт. OUTSB/OUTSW/OUTSD работают без аргументов, переносят байт, слово или двойное слово.

POP

POP <назначение> - извлечение из стека: переносит значение из вершины стека (слово или двойное слово) в назначение. Указатель стека SP увеличивается на 2 (слово) или 4 (двойное слово). Назначение - регистр или значение памяти.

POPA

POPAD

POPAW

POPA/POPAD/POPAW - извлечение из стека всех регистров: запись значений из стека во все основные регистры. POPA и POPAW равнозначны POP DI,SI,BP,BX,DX,CX,AX. POPAD разнозначно POP EDI,ESI,EBP,EBX,EDX,ECX,EAX.

POPF

POPFD

POPFW

POPF/POPFD/POPFW - извлечь в регистр флагов: извлекает из стека верхнее слово (POPF/POPFW) или двойное слово (POPFD) в регстр флагов процессора.

PUSH

PUSH <источник> - запись в стек: уменьшает значение стека на 2 (слово) или 4 (двойное слово) для создания места в стеке, и копирует в это место значение источника. Т.е. команда записывает число в вершину стека. Источник - регистр, значение памяти или число.

PUSHA

PUSHAD

PUSHAW

PUSHA/PUSHAD/PUSHAW запись в стек всех регистров: записывает 16-битные (PUSHA/PUSHAW) или 32-битные (PUSHAD) регистры в вершину стека; PUSHA и PUSHAW эквивалентны PUSH AX, CX, DX, BX, SP, BP, SI, DI , а PUSHAD равнозначно PUSH EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI.

PUSHF

PUSHFD

PUSHFW

PUSHF/PUSHFD/PUSHFW запись регистра флагов: запись FLAGS (PUSHF/PUSHFW) или EFLAGS (PUSHFD) в вершину стека.

SCAS

SCASB

SCASW

SCASD

SCAS/SCASB/SCASW/SCASD <источник> - сравнение строк: сравнение байта, слова или двойного слова в ES:DI с AL, AX или ЕАХ независимо от аргумента.

STOS

STOSB

STOSW

STOSD

STOS/STOSB/STOSW/STOSD <источник> - сохранение строковых данных: перенос содержимого AL, Ax или ЕАХ в адрес памяти, определенный в ES:DI. Аргумент игнорируется. После переноса DI увеличивается/уменьшается (в зависимости от флага направления) на число перенесенных байт.

XCHG

XCHG <назначение>, <источник> - обмен: обмен содержимого ячейки памяти или регистра с регистром. Меняет местами значения источника и назначения. Если назначение - регистр, то источник - регистр или значение памяти. Если назначение - значение памяти, то источник - регистр.

Операции с флагами процессора:

(8 команд)

CLC

CLD

CLI

LAHF

SAHF

STC

STD

STI

установка CF=0

установка DF=0

установка IF=0

загрузка регистра AH из регистра флагов: устанавливает биты 7, 6, 4, 2 и 0 по

значениям флагов SF ZF AF PF CF.

запись регистра AH в регистр флагов: устанавливает флаги SF ZF AF PF CF по битам 7, 6, 4, 2 и 0 регистра AH.

установка CF=1

установка DF=1

установка IF=1

Работа с BCD числами.

(3 команды)

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

AAA

Корректирует неупакованный результат сложения двух одноразрядных неупакованных BCD-чисел, находящихся в регистрах AH и AL.

AAM

Корректирует результат умножения двух неупакованных BCD-чисел и преобразует двоичного числа меньшего 63h (9910) в его неупакованный BCD-эквивалент.

AAS

Корректирует результат вычитания двух неупакованных одноразрядных BCD-чисел.