ер7_б

advertisement
Семейство микропроцессоров 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
Download