Арифметические команды
Установка байта при условии
Команды пресылки с расширением
Операции с регистр флагов
Команды загрузки исполнит адресов и указател
Команды предачи данных
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