Арифметические команды

Установка байта при условии

Команды пресылки с расширением

Операции с регистр флагов

Команды загрузки исполнит адресов и указател

Команды предачи данных

MOV dst,src преслать src в dst

Возможные операнды:

Reg, reg; reg, mem; mem, reg; reg, data; mem, data

(data-непосредст операнд); sreg, reg; sreg, mem;

reg, sreg; mem, sreg (sreg-сегментн рег, кроме сегм рег кода-CS) –на рег флагов не влияют

XCHG dst,src –обменять dst и src (reg, mem; reg,reg)

Стековые команды

PUSH src – включить опреанд в стек

POP dst – извлеч оперенд из стека

Над 8 битн операнд не выполн

Reg 16/32; mem16/32; sreg (в коман POP кроме CS)

С .286 проц PUSH data

PUSHA – сохран в стеке все РОН

POPA – извлеч из стека все РОН

С .386 проц

PUSHAD – для всех общих регистр

POPAD

LEA reg,mem – вычисление эффективного адреса (в рег загруж смещен определ 2-ым операндом)

Array db 5 dup (2) ;под массив 5 элем

LEA si,Array (mov si, offset Array)

lea eax,[ebx+ecx*8] (иначе eax←ebx+ecx*8)

LDS reg,mem (загузить адрес использ DS)

LES, LSS, с .386 LFS, LGS

Пример:

1) data segment array dl 1,2,3,4,5 data ends

code segment …

mov ax,data mov ds,ax, mov si,offset array

2) exe-прогр

data segment

array dl 1,2,3,4,5 ADDR_ARRAY dd array

ADDR1 dw offset array ADDR1 dw segment array

 

PUSHF(16 б) – поместить flags из стека

POPF(16 б) – загруз flags в стек

PUSHFD(32 б) – поместить eflags из стека (.386)

POPFD(32 б) – загруз eflags в стек (.386)

LANF – загруз флаги сост в AH (ah←мл байт flags)

SANF – загруз флаги сост из AH (мл байт flags← ah)

STC - Установить флаг переноса (CF←1).

CLC – Сбросить флаг переноса (CF←0).

CMC - Инвертир флаг переноса (СF).

STD - Установить флаг направления (DF←1, так что при последующих строковых операциях регистры DI и SI будут уменьшаться.)

CLD - Сбросить флаг направления

 

22.Команды ввода/ вывода

IN al/ax, port/dx-Считать данные из порта

OUT port/dx, al/ax - Записать данные в порт

(port- адрес порта вв/выв в виде 8б беззначн числа (0..255); dx – рег содерж адрес порта

 

MOWSX reg16/reg32, reg8(16)/mem8(16) пересылка с расширением знака (.386)

MOWZX reg16/reg32, reg8(16)/mem8(16)пересылка с расширением нулями (.386)

Al =80h

movzx bx,al (0080h)

movsx cx,al (FF80h)

 

SETcc reg/mem8 - yстановка байта по условию (.386)

Если услов выполн то в приемник занос 1, иначе 0

Setns dl – ели нет знака (sf=0, dl←1)

Setc al – если перенос (cf=1, al←1)

BSWAP reg32 - Обмен байт внутри регистра (.486)

Обращает порядок байт в 32-бит регист 0-7↔24-31, 8-15↔16-23

mov eax,12345678h

bswap eax ; теперь в еах находится 78563412h

CMOVcc reg,reg/mem(8,16,32) yсловная пересылка данных (P6)

cmp ах,bх ; сравнить ах и bх

cmovl ax,bx ; если ах < bх, скопировать bх в ах

XLAT адрес

XLATB Трансляция в соответствии с таблицей

al←M{ES:(E)BX+AL}(омещает в AL байт из таблицы в памяти по адресу ES:BX (или ES:EBX) со смещен относительно начала таблицы, равным AL.)

table db 16dup(?)…

mov bx,offset table

mov ax, 01; код

xlat

 

 

Сложение:

ADD dst,src (dst←dst+src) 4 байта

(reg, reg; reg, mem; mem, reg; reg, data; mem, data)

Изменяет CF,AF,OF,PF,SF,CF

ADC dst,src (dst←dst+src+CF) сложить с переносом

INC reg/mem- увелич на 1(не влияет на CF)
inc al
inc byte str[si] (1б)
inc word ptr (2б)

inc dword ptr (4б)

Вычитание:

SUB dst,src (dst←dst-src)

SBB dst,src (dst←dst-src-CF)для многобайтов операции с займом

CMP dst,src (dst-src) – по результ вычитан устанавлив флаги но dst,src не меняются

NEG dst (reg/mem) (dst←0-dst) – смена знака

DEC dst(reg/mem) уменьш на 1 (dst←dst-1)

Умножение:

MUL reg/mem

IMUL reg/mem – умножение чисел со знаком

тип src второй операнд результат
байт al ah_al
слово ax dx:ax
двойное слово eax edx:eax

CF=OF=0 или CF=OF=1

с. 286 IMUL приемн, источник, непоср операнд

(reg16,reg/mem16, data)

с. 386 IMUL reg32,reg/mem32, data

dst ←src*data

с. 386 IMUL reg16,reg/mem16(reg32,reg/mem32)

dst ←dst*src (сохран только младш часть результ)

Деление:

DIV reg/mem

IDIV reg/mem-деление чисел со знаком

тип делит делимое результат
частн остат
байт ax al ah
слово dx_ax ax dx
двойное слово edx_eax eax edx
         

После выполн команды деления флаги не определены, и если частное не помещ в отведен формат то генерир прерывание 0 – ошибка деления

Для корректного выполн деления использ команда:

СWB – конвертир байта в слово (расшир байт в al до слова в ax)

СWD – конвертиров слова в двойное слово (слово в ax превр в двойное слово, мтадш полов остается в ax(биты 0-15), а старшая располаг в dx(биты 16-31)) –устанавтив все биты рег dx в значение = велич старш бита рег ax

CDQ-конвертир двоиного слова в учетвер – устанавтив все биты рег edx в значение = велич старш бита рег eax

CWDE-конвертир слова в двойное слово – ax расшир до eax

XADD dst,src (reg/mem,reg(8,16,32)) – обменять и сложить (dst↔src и dst←dst+src)(.486)

CMPXCHG dst,src (reg/mem,reg(8,16,32)) – сравнить и обменять между собой(.486)

acc (AL, АХ, ЕАХ)-аккомулятор

если acc=dst, то ZF←1 и dst←scr, иначе ZF←0 и acc←dst.

CMPXCHG8B dst (mem64) cравнить и обменять восемь байт (.586) acc=EDX:EAX (младшее двойное слово в ЕАХ, старшее – в EDX) src= ЕСХ:ЕВХ (восьмибайтная переменная в памяти). Если acc =src то dst ← ЕСХ:ЕВХ, иначе acc ←dst