Семейство микропроцессоров iAPx86 Модель Данные/Адрес Примечание i8086 16/20 4 МГц, 1 Мб i8088 8/20 Модификация i8086 i80186 16/20 Новые команды i80286 16/24 Защищенный режим i80386 32/32 Режим виртуального 8086 i80486 32/32 Внутренний сопроцессор Pentium 64/32 Повышена производительность … 1 Архитектура МП i80386 и выше 1. Регистры общего назначения: AL BL CL DL AH BH CH DH SI DI BP SP EAX EBX ECX EDX ESI EDI EBP ESP 2. Сегментные регистры: CS SS DS ES FS GS 3. Регистр указатель команд: IP Фл. р-р 4. Слово состояния программы: 5. Управляющие регистры: CR0..CR3 6. Регистры системных адресов: GDTR – регистр таблицы глобальных дескрипторов; IDTR – регистр таблицы дескрипторов прерываний; LDTR – регистр таблицы локальных дескрипторов; TR – регистр состояния задачи; 7. Отладочные регистры 8. Тестовые регистры EIP PSW 2 Режимы адресации Осуществляется поддержка 3-х основных режимов: 1) реальный режим – аналог i8086 с 16 разрядной базой и 16 разрядным смещением – доступно 1 Мб памяти; 2) защищенный режим – 32 разрядная адресация – доступно 64 Тб памяти; 3) виртуальный режим – эмуляция нескольких «одновременно» работающих i8086. Кроме этого поддерживается страничная организация памяти. 3 Схема адресации в защищенном режиме Эффективный адрес Индекс База Смещение x Страницы по 4 Кб Масштаб + Виртуальный адрес (46) Индекс сегмента (14) Эффективный адрес (32) Блок разбивки Блок сегментации Линейный на страницы адрес (32) Физический Селектор 2 0 адрес (32) (Сегментный регистр) Селектор Таблица локальных Селектор дескрипторов Селектор Таблица глобальных Селектор дескрипторов ОП 4 Схема адресации в защищенном режиме (2) Различают 3 адресных пространства: 1) логическое – виртуальный адрес – 46 бит – 246 = 64 Гб : а) индекс селектора 14 бит – 214 = 16 Кб; б) смещение 32 бита – 232 = 4 Гб; 2) линейное – линейный адрес – 32 бита; 3) физическое – физический адрес – 32 бита Дескрипторный регистр (64 бита) содержит: 1) базовый адрес сегмента – 32 бита; 2) границу сегмента – 20 бит – в байтах или страницах; 3) тип сегмента: чтение и исполнение, чтение и запись и т.п.; 4) признак присутствия в памяти; 5) признак размера операндов по умолчанию (16 или 32 бита); 6) уровень привилегий: 0 – системные, 1-2 – разделяемые, 3 – приложения; 7) и т. д. 5 Страничная организация памяти Линейное адресное пространство Физическое адресное пространство 4 Кбайта 4 Кбайта 4 Кбайта 4 Кбайта 4 Кбайта 4 Кбайта 4 Кбайта 4 Кбайта 4 Кбайта 4 Кбайта 4 Кбайта 6 Схема страничной адресации CR3 Каталог таблиц (1024 4-х байтовых поля) Адрес таблицы страниц Адрес таблицы страниц Адрес таблицы страниц Адрес таблицы страниц 1024*1024*4 Кб = 4 Гб Таблица страниц Адрес страницы Адрес страницы Адрес страницы 31 2221 1211 0 Индекс Индекс Смещение каталога страницы Линейный адрес Таблица страниц (1024 адреса) Адрес страницы Адрес страницы Адрес страницы 31 1211 Адрес страницы (страничный кадр) 0 Смещение Физический адрес 7 Машинные команды ассемблера Формат: CS: SS: DS: ES: FS: GS: база EAX EBX ECX EDX EBP ESP ESI EDI индекс + Примеры: inc word ptr[500] mov [ECX], EDX mov EAX,TABLE[ESI] mov EAX, TABLE[ESI*4] EAX EBX ECX EDX EBP ESI EDI масштаб * 1 2 4 8 смещение + DISP 8 Машинные команды ассемблера (2) 1. MOV, PUSH, POP, IN, OUT, ADD, ADC, SUB, SBB, LEA, MUL, IMUL, DIV, IDIV, NEG, CMP и т.д. – получили возможность работать с 4 байтами 2. Дополнительные команды: 1) PUSHA – POPA (186) (16) – поместить в стек все регистры; 2) PUSHAD – POPAD (386) (32) – то же; 3) MOVSX (386) – копирует источник и расширяет знаком; MOVZX (386) – копирует источник и расширяет нулями; 4) CDQ (386) – расширение EAX EDX:EAX; 5) CWDE (386) – расширение AX EAX; 6) IMUL <приемник>, <источник> (386); IMUL <приемник>, <источник1>, <источник2> (186); 7) MOVSD, LODSD, STOSD, CMPSD, SCASD; 8) LFS, LGS 9) … 9 Машинные команды ассемблера (3) Пример 1. .386 use16 mov EAX,A ; перед командой ассемблер вставит байт 66h add EAX,B ; перед командой ассемблер вставит байт 66h mov C,EAX ;перед командой ассемблер вставит байт 66h Пример 2. .386 use16 cycl: mov ECX, 0F000 0000h db 67h loop cycl 10 Конвенции о связи модулей Window's № Название Delphi Builder Порядок пар-ров Чистка стека Р-ры 1 Паскаль pascal _ _ pascal прямой п/п - 2 С cdecl _ _ cdecl обратный в/п - 3 Стандартная stdcall _ _ stdcall обратный п/п - 4 Регистровая register _ _ fastcall прямой п/п 5 Защищенная safecall - обратный п/п до 3-х 11 Конвенции о связи модулей WINDOW’s (2) Передача управления: а) тип вызова: near, модель FLAT, размер адреса возврата 32бита; б) стандартные вход и выход те же; в) особенности компоновки: Delphi C++ Builder Visual C++ Преобразует все строчные буквы имен в прописные Различает прописные и строчные буквы в именах Различает прописные и строчные буквы в именах Не изменяет внешних имен Помещает «_» перед внешними именами Помещает «_» перед внешними именами Внутреннее имя совпадает с внешним @<имя>$q<описание параметров> @<имя> @ <количество параметров * 4> Необходимо сохранять регистры: EBX, EBP, ESI, EDI. Можно не сохранять: EAX, EDX, ECX 12 Особенности Delphi Пример 1. Процедура суммирования двух целых чисел (Ex7_1). Описание в Delphi: Implementation {$l ASM1.obj} procedure ADD1 (A,B:integer, Var C:integer); <конвенция>;external; Вызов: ADD1(A,B,C); 13 Особенности Delphi (pascal) ADD1 ADD1 .386 .model .code public proc push mov mov add mov mov pop ret endp end flat ADD1 EBP EBP,ESP EAX,[EBP+16] EAX,[EBP+12] EDX,[EBP+8] [EDX],EAX EBP 12 EBP=ESP EBP +8 Aд.возврата &C +12 B +16 A 4 байта 14 Особенности Delphi (cdecl) ADD1 ADD1 .386 .model .code public proc push mov mov add mov mov pop ret endp end flat ADD1 EBP EBP,ESP EAX,[EBP+8] EAX,[EBP+12] EDX,[EBP+16] [EDX],EAX EBP EBP=ESP EBP +8 Aд.возврата A +12 B +16 &C 4 байта 15 Особенности Delphi ( safecall = stdcall + исключение при ошибке) ADD1 ADD1 .386 .model .code public proc push mov mov add mov mov pop ret endp end flat EBP=ESP ADD1 EBP EBP,ESP EAX,[EBP+8] EAX,[EBP+12] EDX,[EBP+16] [EDX],EAX EBP 12 EBP +8 Aд.возврата A +12 B +16 &C 4 байта 16 Особенности Delphi (register) ADD1 ADD1 .386 .model .code public proc add mov ret endp end flat 1-й параметр A в EAX; 2-й параметр B в EDX; 3-й параметр &C в ECX ADD1 Aд.возврата EDX,EAX [ECX],EDX 17 Особенности Delphi (2) Пример 2. Дисассемблер функции копирования строки: Function Dell(S:ShortString):ShortString; pascal;Begin Result:=S; End; push EBP пролог mov EBP,ESP add ESP,$FFFF FF00; память под строку EDP push ESI сохранение регистров ESP push EDI Копия mov ESI,[EBP+$C]; адрес исходной строки параметра lea EDI,[EBP-$0000 0100] ; строка-буфер 256 байт EBP=ESP xor ECX,ECX установка счетчика EBP mov CL,[ESI] +8 Aд.возврата inc ECX; учли байт длины +12 & результата rep movsb ; копирование строки-параметра & параметра mov EAX,[EBP+8] lea EDX,[EBP-$100] вызываем процедуру копирования call @PStrCpy pop EDI восстанавливаем регистры pop ESI mov ESP,EBP эпилог pop EBP 18 ret 8 Особенности Delphi (3) Пример 3. Увеличение элементов массива на 5 procedure Array_add(var a:arr);pascal;external; .386 EBP=ESP .model flat .code +8 public Array_add Array_add proc push ebp mov ebp,esp mov eax,[ebp+8] mov ecx,5 cycl: add byte ptr 0[eax],5 inc eax loop cycl pop ebp ret 4 Array_add endp end EBP Aд.возврата &A 19 Особенности C++ Builder (Ex7_2) Project1.cpp: USEOBJ (“asm1.obj”); Unit1.cpp: extern void <конвенция> add1(int a,int b,int *c); Вызов: add1(a,b,&c); 20 Особенности C++ Builder (cdecl) Примечание – Транслировать: tasm32 /mx asm1.asm .386 .model flat .code EBP=ESP EBP public @add1$qiipi @add1$qiipi proc +8 Aд.возврата A +12 push EBP B +16 mov EBP,ESP &C mov EAX,[EBP+8] 4 байта add EAX,[EBP+12] mov EDX,[EBP+16] mov [EDX],EAX pop EBP ret @add1$qiipi endp end 21 Особенности C++ Builder ( cdecl + «С») extern “C” void cdecl add1(int a,int b,int *c); .386 .model .code public _add1 proc push mov mov add mov mov pop ret _add1 endp end flat _add1 EBP EBP,ESP EAX,[EBP+8] EAX,[EBP+12] EDX,[EBP+16] [EDX],EAX EBP 22 Особенности Visual C++ (_ _stdcall) extern “C” void _ _stdcall add1(int a,int b,int *c); Транслировать: tasm32 /ml add1.asm – не различать строчные и прописные .386 .model flat .code public _add1 _add1 proc push EBP mov EBP,ESP mov EAX,[EBP+8] add EAX,[EBP+12] mov EDX,[EBP+16] mov [EDX],EAX pop EBP ret 12 _add1 endp end 23 Особенности Visual C++ (_ _fastcall) extern “C” void _ _fastcall add1(int a,int b,int *c); Транслировать: tasm32 /ml add1.asm – не различать строчные и прописные .386 .model flat .code public _add1@12 @add1@12 proc add EAX,EDX mov [ECX],EAX pop EBP ret @add1@12 endp end 24