Основные команды ассемблера Пересылки данныхАрифметическиеЛогические Передачи управления Обработки цепочек Управления работой ЦП
Команды пересылки данных Общего назначения Работы с адресами Работы со стеком Преобразования данных MovLeaPuchXlat XchgLssPop LdsPucha LesPopa LfsPuchf LgsPopf
Инструкция MOV I8,16,32 R8,16,32 M8,16,32 Sr MOVI8,16,32 M8,16,32R8,16,32 Sr R16 Sr M16
Инструкция обмена данными R8,16,32 XCHGM8,16,32 R8,16,32
Инструкция обмена данными R8,16,32 XCHGM8,16,32 R8,16,32 Инструкции загрузки адреса LEAR16M8,16,32 LSS LDSR16M32 LES
Инструкции работы со стеком I16,32 R16,32 pushpopM16,32 SR
Инструкция перекодировки xlat 16-е число … BX AL … Таблица перекодировки Tpdb ABCDEF Adb14
Инструкция перекодировки xlat … 67 BX AL … Таблица перекодировки Leabx,Tp Moval,A
Инструкция перекодировки xlat 14 Адрес таблицы перекодировки … 67 BX AL … Таблица перекодировки Xlat es:Tp
Инструкция перекодировки xlat E 14 Адрес таблицы перекодировки … 67 BX AL … Таблица перекодировки
Арифметические команды Преобразования типов Двоичной арифметики Десятичной арифметики Прочие CbwAddImulAaaCmp CwdAdcMulDaaSetcc CwdeIncIdivAas CdqSubDivDas MovsxSbbNegAam MovzxDecAad
Преобразование Байта в слово ah al Слова в двойное слово –Cwd: ax dx –Cwde: ax eax Двойного слова в учетверенное –Cdq:eax edx ******* ******* cbw Пересылка
Преобразование Байта в слово ah al Слова в двойное слово –Cwd: ax dx –Cwde: ax eax Двойного слова в учетверенное –Cdq:eax edx ******* ******* cbw R8 R16 M8 с учетом знака movsx movsx, movzx R8,16 без учета знака movzx R32 M8,16 Пересылка
Двоичная арифметика Inc – увеличение на 1 *) Dec – уменьшение на 1 *) Neg – смена знака *) Не изменяет флага cf. inc dec neg R8,16,32 M8,16,32
Сложение, вычитание сравнение Add i8,16,32 Adc r8,16,32 Sub m8,16,32 Sbb i8,16,32 m8,16,32 Cmp r8,16,32
Пример cfah al Mov ax, Add al, Adc ah, Adc ah,
Умножение, деление mul div imul idiv R8,16,32 M8,16,32 Второй сомножитель или делитель Тип операнда Первый сомножитель РезультатДелимое Результат ЧастноеОстаток 8alax alah 16axdx:ax axdx 32eaxedx:eax eaxedx Делитель 0 или частное велико – исключительная ситуация
Десятичная арифметика ИмяСодержание Для неупакованных BCD чисел в регистре al AaaASCII-коррекция после сложения AasASCII-коррекция после вычитания AamASCII-коррекция после умножения AadASCII-коррекция перед делением Для упакованных BCD чисел в регистре al DaaДесятичная коррекция после сложения DasДесятичная коррекция после вычитания
AAA и AAS: примеры mov ax,8 add al,5 aaa mov ax,18 add al,9 aaa mov ax,18 sub al,9 aas dal > 9, af = af = cf = af = af = cf = faf = af = cf = 1
AAM и AAD: примеры mov al,9 mov bl,9 mul bl aam mov al,99 aam mov ax,0703h aad mov bl,9 div bl mov ax,99 aad sub al,10h ** 09 **
DAA и DAS: примеры mov ax,44h add al,37h daa Mov ax,57h sub al,19h das Mov ax,88h add al,12h daa Mov ax,88h sub al,99h das Bal l > 9, af= af = Eaf = Aal l > af = cf = EFaf = cf = af = cf =1
КомандаУсловиеКомандаУсловие seta/setnbecf=0 и zf=0setle/setngzf=1 или sfof setae/setnbcf=0setnccf=0 setb/setnaecf=1setne/setnzzf=0 setbe/setcf=1 или zf=1setnoof=0 setccf=1setnp/setpopf=0 sete/setzzf=1setnssf=0 setg/setnlezf=0 или sf=ofsetoof=1 setge/setnlsf=ofsetp/setpepf=1 setl/setngesfofsetssf=1 R8 M8 SETcc
Логические команды ЛогическиеОбработки битСдвига AndBsfSar OrBsrSal XorBtShl NotBtcShr TestBtrShld BtsShrd Rcl Rcr Rol Ror
Побитовые булевские операции i8,16,32 And r8,16,32 Or m8,16,32 Xor i8,16,32 Test m8,16,32 r8,16,32 устанавливает флаг zf без формирования результата and Not r8,16,32 m8,16,32
Операции с битами R16,32 Bsf / BsrR16,32 M16,32 R16,32 Bt/Btc/Bts/Btr M16,32i8
Примеры Adw0000h Bdw0110h ….386 bsfax,A bsfax,B bsr ax,B bt b,ax btc b,ax btr b,4 bts b,1 zf=1 ax=4, zf=0 ax=8, zf=0 cf=1 cf=1, b=0010h cf=1, b=0000h cf=0, b=0002h
Операции сдвига R8,16,32I3,4,5 sal/sar shl/shr rol/ror rcl/rcr M8,16,32cl R16,32I4,5 shld/shrdR16,32 M16,32cl
sal,shlcf ****…*** 0 shr0 ****…*** cf sar****…*** cf rolcf ****…*** ror****…*** cf rclcf ****…*** rcr****…*** cf
Команды передачи управления Безусловная Взаимодействия с процедурами УсловныеЦиклы JmpCallJl=JngeJcJncLoop RetJle=JngJpJnpLoope Jg=JnleJzJnzLoopz IntJge=JnlJsJnsLoopne IretJb=JnaeJoJnoLoopnz Jbe=Jna Ja=JnbeJcxz Jae=JnbJecxz «выше» - «ниже» - для чисел без знака «больше» - «меньше» - для чисел со знаком
Операторы перехода по условию Jxx Loop Short Loopz/Loope Loopnz/Loopne cx 0 cx 0 & zf = 1 cx 0 & zf = 0 loop cx=… jcxz cx=0
Инструкции передачи управления Short Метка Far ptr Jmp R16,32 Call Word ptr M16,32 Dword ptr i4 Ret При передаче управления вперед Идентификатор – имя переменной, а не метка
Инструкции работы с прерываниями Int i8 – вызов процедуры обслуживания прерывания с номером, заданным операндом команды: pushfcli puch csjmp … push ip Iret – возврат из программы обработки прерывания в прерванную программу: pop ippopf pop csjmp …
Команды работы с цепочками ПересылкаСравнениеСканированиеЗагрузкаСохранение MovsCmpsScasLodsStos MovsbCmpsbScasbLodsbStosb MovswCmpswScaswLodswStosw MovsdCmpsdScasdLodsdStosd RepRepzRepe RepnzRepne
ИсточникПриемникРезультат CmpsDs:siEs:di Cf, zf, si,di 1 LodsDs:siEax/ax/al Ds:[si] al, si 1 ПриемникИсточникРезультат MovsEs:diDs:si [si] [di], si,di 1 ScasEs:diEax/ax/al Zf, di 1 StosEs:diEax/ax/al al [di], di 1 Movs Cmpssourcedest Scas Lods Stos dest source dest source
.model small.stack 256.data adb' ','$ bdb' ','$'.code mainproc assume mov mov ds,ax mov es,ax mov ah,9 lea dx,b int 21h lea si,a lea di,b mov cx,10 rep movsb mov ah,9 lea dx,b int 21h.exit 0 mainendp endmain Результат:
Команды управления ЦП Флаг переноса Флаг направления Флаг прерываний Регистр флагов StcStdStiLahf ClcCldCliSahf Cmc
Загрузка регистра флагов LAHF – в регистр AHSAHF – из регистра AH AH FLAGSsfzfafpfcf AL