Скачать презентацию Система команд Система команд IA-32 Скачать презентацию Система команд Система команд IA-32

Лекция 04 Команды языка Ассемблера.ppt

  • Количество слайдов: 52

Система команд Система команд

Система команд IA-32 • • • Команды общего назначения Команды сопроцессора x 87 FPU Система команд IA-32 • • • Команды общего назначения Команды сопроцессора x 87 FPU Команды x 87 FPU и SIMD управления состоянием Команды MMX расширения Команды XMM расширения (SSE, SSE 2, SSE 3, SSE 4) AESNI и PCLMULQDQ Команды Advanced Vector Extensions (AVX) расширения Системные команды IA-32 e режим: команды 64 -битного режима Команды VMX расширения Команды SMX расширения

Команды общего назначения • • • Команды пересылки данных Команды двоичной арифметики Команды десятичной Команды общего назначения • • • Команды пересылки данных Команды двоичной арифметики Команды десятичной арифметики Логические команды Команды сдвига и вращения Битовые команды Команды управления командным потоком Цепочечные команды Команды для работы с регистром флагов Команды для работы с сегментными регистрами Системные команды Обособленные команды (вне групп)

Команды пересылки данных Общего назначения Работы с адресами Работы со стеком Преобразования данных Mov Команды пересылки данных Общего назначения Работы с адресами Работы со стеком Преобразования данных Mov Lea Push Xlat Xchg Lss Pop Lds Pusha Les Popa Lfs Pushf Lgs Popf

Команда MOV I 8, 16, 32 R 8, 16, 32 M 8, 16, 32 Команда MOV I 8, 16, 32 R 8, 16, 32 M 8, 16, 32 Sr MOV I 8, 16, 32 M 8, 16, 32 R 8, 16, 32 Sr R 16 Sr M 16

Команда обмена данными R 8, 16, 32 XCHG M 8, 16, 32 R 8, Команда обмена данными R 8, 16, 32 XCHG M 8, 16, 32 R 8, 16, 32

Команда обмена данными R 8, 16, 32 XCHG M 8, 16, 32 R 8, Команда обмена данными R 8, 16, 32 XCHG M 8, 16, 32 R 8, 16, 32 Команда загрузки адреса LEA R 16 M 8, 16, 32 R 16 M 32 LSS LDS LES

Команды работы со стеком I 16, 32 R 16, 32 push pop M 16, Команды работы со стеком I 16, 32 R 16, 32 push pop M 16, 32 SR SR

Использование стека • Используется для: Хранения адреса возврата из вызванной программы Передачи параметров между Использование стека • Используется для: Хранения адреса возврата из вызванной программы Передачи параметров между программами Временного хранения данных • Единица данных – слово • Регистры, связанные со стеком: ss, sp, bp SS[k] SP[n] … k k+2 k+4 k+6 k+n-4 k+n-2 k+n PUSH POP NOP 1 2 bx ax ; =2 ; =1

Использование стека • Используется для: Хранения адреса возврата из вызванной программы Передачи параметров между Использование стека • Используется для: Хранения адреса возврата из вызванной программы Передачи параметров между программами Временного хранения данных • Единица данных – слово • Регистры, связанные со стеком: ss, sp, bp SS[k] SP[n-2] … k k+2 k+4 k+6 1 k+n-4 k+n-2 k+n PUSH POP NOP 1 2 bx ax

Использование стека • Используется для: Хранения адреса возврата из вызванной программы Передачи параметров между Использование стека • Используется для: Хранения адреса возврата из вызванной программы Передачи параметров между программами Временного хранения данных • Единица данных – слово • Регистры, связанные со стеком: ss, sp, bp SS[k] SP[n-4] … 2 k k+2 k+4 k+6 1 k+n-4 k+n-2 k+n PUSH POP NOP 1 2 bx ax

Использование стека • Используется для: Хранения адреса возврата из вызванной программы Передачи параметров между Использование стека • Используется для: Хранения адреса возврата из вызванной программы Передачи параметров между программами Временного хранения данных • Единица данных – слово • Регистры, связанные со стеком: ss, sp, bp SS[k] SP[n-2] … k k+2 k+4 k+6 1 k+n-4 k+n-2 k+n PUSH POP NOP 1 2 bx ax ; bx=2

Использование стека • Используется для: Хранения адреса возврата из вызванной программы Передачи параметров между Использование стека • Используется для: Хранения адреса возврата из вызванной программы Передачи параметров между программами Временного хранения данных • Единица данных – слово • Регистры, связанные со стеком: ss, sp, bp SS[k] SP[n] … k k+2 k+4 k+6 k+n-4 k+n-2 k+n PUSH POP NOP 1 2 bx ax ; bx=2 ; ax=1

Команды работы со стеком SS[k] SP[n] PUSHA Команды работы со стеком SS[k] SP[n] PUSHA

Команды работы со стеком SS[k] SP[n-16] PUSHA POPA di si bp sp bx dx Команды работы со стеком SS[k] SP[n-16] PUSHA POPA di si bp sp bx dx cx ax

Команды работы со стеком SS[k] SP[n] PUSHA POPA PUSHF Команды работы со стеком SS[k] SP[n] PUSHA POPA PUSHF

Команды работы со стеком SP[n-2] Flags SS[k] PUSHA POPA PUSHF POPF Команды работы со стеком SP[n-2] Flags SS[k] PUSHA POPA PUSHF POPF

Команды работы со стеком SS[k] SP[n] PUSHA POPA PUSHF POPF PUSHAD POPAD Последние две Команды работы со стеком SS[k] SP[n] PUSHA POPA PUSHF POPF PUSHAD POPAD Последние две команды работают с 32 разрядными регистрами

Команда перекодировки xlat Таблица перекодировки 0 1 2 3 4 BX AL … Tp Команда перекодировки xlat Таблица перекодировки 0 1 2 3 4 BX AL … Tp A db db ‘ 0123456789 ABCDEF’ 14 16 -е число … 12 13 14 15

Команда перекодировки xlat Таблица перекодировки BX AL Lea Mov bx, Tp al, A 48 Команда перекодировки xlat Таблица перекодировки BX AL Lea Mov bx, Tp al, A 48 49 50 51 52 … 67 68 69 70 14 0 1 2 3 4 … 12 13 14 15

Команда перекодировки xlat Таблица перекодировки BX Адрес таблицы перекодировки AL Xlat es: Tp 14 Команда перекодировки xlat Таблица перекодировки BX Адрес таблицы перекодировки AL Xlat es: Tp 14 48 49 50 51 52 … 67 68 69 70 14 0 1 2 3 4 … 12 13 14 15

Команда перекодировки xlat Таблица перекодировки BX Адрес таблицы перекодировки AL ‘E’ 48 49 50 Команда перекодировки xlat Таблица перекодировки BX Адрес таблицы перекодировки AL ‘E’ 48 49 50 51 52 … 67 68 69 70 14 0 1 2 3 4 … 12 13 14 15

Арифметические команды Преобразования типов Двоичной арифметики Десятичной арифметики Cbw Cwde Cdq Movsx Movzx Add Арифметические команды Преобразования типов Двоичной арифметики Десятичной арифметики Cbw Cwde Cdq Movsx Movzx Add Imul Adc Mul Inc Idiv Sub Div Sbb Neg Dec Aaa Daa Aas Das Aam Aad Прочие Cmp Setcc

Преобразование v Байта в слово ah al 1111 1******* 0000 0******* Пересылка v Слова Преобразование v Байта в слово ah al 1111 1******* 0000 0******* Пересылка v Слова в двойное слово cbw – Cwd: ax dx – Cwde: ax eax v Двойного слова в учетверенное – Cdq: eax edx

Преобразование v Байта в слово ah al 1111 1******* v Слова в двойное слово Преобразование v Байта в слово ah al 1111 1******* v Слова в двойное слово cbw 0000 0******* – Cwd: ax dx – Cwde: ax eax v Двойного слова в учетверенное – Cdq: Пересылка eax edx R 8 R 16 M 8 с учетом знака movsx R 8, 16 без учета знака movzx movsx, movzx R 32 M 8, 16

Двоичная арифметика Inc – увеличение на 1*) Dec – уменьшение на 1*) Neg – Двоичная арифметика Inc – увеличение на 1*) Dec – уменьшение на 1*) Neg – смена знака inc dec *) Не изменяет флага cf. neg R 8, 16, 32 M 8, 16, 32

Сложение, вычитание, сравнение Add Adc i 8, 16, 32 r 8, 16, 32 Sub Сложение, вычитание, сравнение Add Adc i 8, 16, 32 r 8, 16, 32 Sub m 8, 16, 32 Sbb i 8, 16, 32 m 8, 16, 32 Cmp r 8, 16, 32

Пример cf Mov ax, 128 ah al 0000 10000000 Add al, 128 1 00000000 Пример cf Mov ax, 128 ah al 0000 10000000 Add al, 128 1 00000000 Adc ah, 128 0 10000001 0000 Adc ah, 128 1 00000000

Умножение, деление mul div R 8, 16, 32 imul Второй сомножитель или делитель M Умножение, деление mul div R 8, 16, 32 imul Второй сомножитель или делитель M 8, 16, 32 idiv Тип операнда Первый Результат Делимое сомножитель Результат Частное Остаток 8 al ax ax al ah 16 ax dx: ax ax dx 32 eax edx: eax Делитель 0 или частное велико – исключительная ситуация

Десятичная арифметика Имя Содержание Для неупакованных BCD чисел в регистре al Aaa ASCII-коррекция после Десятичная арифметика Имя Содержание Для неупакованных BCD чисел в регистре al Aaa ASCII-коррекция после сложения Aas ASCII-коррекция после вычитания Aam ASCII-коррекция после умножения Aad ASCII-коррекция перед делением Для упакованных BCD чисел в регистре al Daa Десятичная коррекция после сложения Das Десятичная коррекция после вычитания

AAA и AAS: примеры • mov ax, 8 add al, 5 aaa 00 08 AAA и AAS: примеры • mov ax, 8 add al, 5 aaa 00 08 00 05 00 0 d 01 03 al > 9, af = 0 af = cf = 1 • mov ax, ’ 18’ add al, ’ 9’ aaa 31 38 00 39 31 71 32 07 af = 1 af = cf = 1 31 38 00 09 31 2 f 30 09 af = 1 af = cf = 1 • mov ax, ’ 18’ sub al, 9 aas

AAM и AAD: примеры • mov al, 9 mov bl, 9 mul bl aam AAM и AAD: примеры • mov al, 9 mov bl, 9 mul bl aam • mov al, 99 aam • mov ax, 0703 h aad mov bl, 9 div bl • mov ax, ’ 99’ aad sub al, 10 h ** 09 00 51 08 01 00 63 09 09 07 03 00 49 00 09 01 08 39 39 00 73 00 10 00 63

DAA и DAS: примеры • mov ax, 44 h add al, 37 h daa DAA и DAS: примеры • mov ax, 44 h add al, 37 h daa • Mov ax, 57 h sub al, 19 h das • Mov ax, 88 h add al, 12 h daa • Mov ax, 88 h sub al, 99 h das 00 44 00 37 00 7 B 00 81 00 57 00 19 00 3 E 00 38 00 88 00 12 00 9 A 00 00 00 88 00 99 00 EF 00 89 all > 9, af=0 af = 1 all > 9 af = cf =1

Команды установки байта по условию SETccc операнд Команды проверяют условие, заданное модификатором ссc в Команды установки байта по условию SETccc операнд Команды проверяют условие, заданное модификатором ссc в коде операции (фактически, состояние флагов) и устанавливают операнд логическим значением 1 или 0 в зависимости от истинности условия. Команды Setccc можно использовать после любой команды, изменяющей флаги, при необходимости анализа результата изменения. Если проанализировать условия для команд Jccc, то обнаружится их полное соответствие с условиями, обрабатываемыми командами Jccc.

SETccc Команда seta/setnbe setae/setnb setb/setnae setbe/set setc sete/setz setg/setnle setge/setnl setl/setnge Условие cf=0 и SETccc Команда seta/setnbe setae/setnb setb/setnae setbe/set setc sete/setz setg/setnle setge/setnl setl/setnge Условие cf=0 и zf=0 cf=1 или zf=1 cf=1 zf=0 или sf=of sf≠of R 8 M 8 Команда setle/setng setnc setne/setnz setno setnp/setpo setns seto setp/setpe sets Условие zf=1 или sf≠of cf=0 zf=0 of=0 pf=0 sf=0 of=1 pf=1 sf=1

Логические команды Логические And Or Xor Not Test Обработки бит Bsf Bsr Bt Btc Логические команды Логические And Or Xor Not Test Обработки бит Bsf Bsr Bt Btc Btr Bts Сдвига Sar Sal Shr Shld Shrd Rcl Rcr Rol Ror

Побитовые логические команды Not r 8, 16, 32 m 8, 16, 32 i 8, Побитовые логические команды Not r 8, 16, 32 m 8, 16, 32 i 8, 16, 32 And r 8, 16, 32 Or m 8, 16, 32 Xor i 8, 16, 32 üTest m 8, 16, 32 üустанавливает флаг zf без формирования результата and r 8, 16, 32

Команды работы с битами R 16, 32 Bsf / Bsr R 16, 32 M Команды работы с битами R 16, 32 Bsf / Bsr R 16, 32 M 16, 32 i 8 Bt/Btc/Bts/Btr

Команды работы с битами включены в состав команд начиная с процессора 80386 Bsf результат, Команды работы с битами включены в состав команд начиная с процессора 80386 Bsf результат, источник Сканирует источник (регистр или переменную), начиная с самого младшего бита, и записывает в приемник (регистр) номер первого встретившегося бита, равного 1. Bsr приемник, источник Сканирует источник (регистр или переменную), начиная с самого старшего бита, и записывает в приемник (регистр) номер первого встретившегося бита, равного 1, считая от нуля. Если весь источник равен нулю, значение приемника не определено и флаг ZF устанавливается в 1, иначе ZF всегда сбрасывается.

Команды работы с битами Bt база, смещение Считывает в флаг CF значение бита из Команды работы с битами Bt база, смещение Считывает в флаг CF значение бита из битовой строки, определенной первым операндом – битовой базой (регистр или переменная), со смещением, указанным во втором операнде – битовом смещении (число или регистр). Bts база, смещение Btr база, смещение Btc база, смещение Эти три команды соответственно устанавливают (Bts), сбрасывают в 0 (Btr) и инвертируют (Btc) значение бита, который находится в битовой строке с началом, определенным в базе (регистре или переменной), и смещением, указанным во втором операнде (число от 0 до 31 или регистр). Если битовая база – регистр, то смещение не может превышать 15 или 31 в зависимости от разрядности этого регистра. Если битовая база – переменная в памяти, то смещение может принимать значение от -2↑ 32 до 2↑ 32 -1 (при условии, что оно указано в регистре).

Примеры • A dw 0000 h B dw 0110 h …. 386 bsf ax, Примеры • A dw 0000 h B dw 0110 h …. 386 bsf ax, A bsf ax, 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, b=0010 h cf=1, b=0000 h cf=0, b=0002 h

Команды сдвига R 8, 16, 32 I 3, 4, 5 M 8, 16, 32 Команды сдвига R 8, 16, 32 I 3, 4, 5 M 8, 16, 32 cl sal/sar shl/shr rol/ror rcl/rcr R 16, 32 shld/shrd I 4, 5 R 16, 32 M 16, 32 cl

sal, shl cf ****…*** 0 shr 0 ****…*** cf sar ****…*** cf rol ror sal, shl cf ****…*** 0 shr 0 ****…*** cf sar ****…*** cf rol ror rcl rcr cf ****…*** cf

Команды передачи управления Взаимодействия Безусловная с процедурами Jmp Call Ret Int Iret Условные Jl=Jnge Команды передачи управления Взаимодействия Безусловная с процедурами Jmp Call Ret Int Iret Условные Jl=Jnge Jle=Jng Jg=Jnle Jge=Jnl Jb=Jnae Jbe=Jna Ja=Jnbe Jae=Jnb Циклы Jc Jnc Loop Jp Jnp Loope Jz Jnz Loopz Js Jns Loopne Jo Jno Loopnz Jcxz Jecxz a «выше» - b «ниже» - для чисел без знака g «больше» - l «меньше» - для чисел со знаком

Команды перехода по условию cx=… Jccc jcxz cx ≠ 0 Loop Short Loopz/Loope Loopnz/Loopne Команды перехода по условию cx=… Jccc jcxz cx ≠ 0 Loop Short Loopz/Loope Loopnz/Loopne cx ≠ 0 & zf = 1 cx ≠ 0 & zf = 0 loop cx=0

Команды передачи управления При передаче управления вперед short Метка far ptr Jmp R 16, Команды передачи управления При передаче управления вперед short Метка far ptr Jmp R 16, 32 Call word ptr Идентификатор – имя переменной, а не метка M 16, 32 Ret i 4 dword ptr

Команды работы с прерываниями • Int i 8 – вызов процедуры обслуживания прерывания с Команды работы с прерываниями • Int i 8 – вызов процедуры обслуживания прерывания с номером, заданным операндом команды: pushf cli push cs jmp … push ip • Iret – возврат из программы обработки прерывания в прерванную программу: pop ip popf pop cs jmp …

Команды работы с цепочками Пересылка Сравнение Сканирование Загрузка Сохранение Movs Cmps Scas Lods Stos Команды работы с цепочками Пересылка Сравнение Сканирование Загрузка Сохранение Movs Cmps Scas Lods Stos Movsb Cmpsb Scasb Lodsb Stosb Movsw Cmpsw Scasw Lodsw Stosw Movsd Cmpsd Scasd Lodsd Stosd Префиксы повторения Repz Repe Repnz Repne

Movs dest source Источник Приемник source Stos dest Lods source Cmps Scas dest Результат Movs dest source Источник Приемник source Stos dest Lods source Cmps Scas dest Результат Cmps Ds: si Es: di Cf, Zf, si, di 1 Lods Ds: si Eax/ax/al Ds: [si] al, si 1 Приемник Источник Результат Movs Es: di Ds: si [si] [di], si, di 1 Scas Es: di Eax/ax/al Zf, di 1 Stos Es: di Eax/ax/al al [di], di 1

. model small. stack 256. data a db '1234567890', '$' b db '0987654321', '$'. . model small. stack 256. data a db '1234567890', '$' b db '0987654321', '$'. code main proc assume es: @data mov ax, @data mov ds, ax mov es, ax mov ah, 9 lea dx, b int 21 h mov si, offset a mov di, offset b mov cx, 10 rep movsb mov ah, 9 lea dx, b int 21 h. exit 0 main endp end main Результат: 09876543211234567890

Команды управления ЦП Флаг переноса Флаг направления прерываний Регистр флагов Stc Std Sti Lahf Команды управления ЦП Флаг переноса Флаг направления прерываний Регистр флагов Stc Std Sti Lahf Clc Cld Cli Sahf Cmc

Загрузка регистра флагов • LAHF – в регистр AH • SAHF – из регистра Загрузка регистра флагов • LAHF – в регистр AH • SAHF – из регистра AH A H F L A G S A L sf zf af pf cf