- •Структура платформы .NET
- •Схема выполнения программы в .NET
- •Схема работы компиляторов .NET
- •Достоинства языка С++
- •Структура программы
- •Модификаторы памяти
- •Пространство имен
- •Константы
- •Описание идентификаторов
- •Операции С++
- •Правила преобразования типов
- •Функции
- •ПЕРЕГРУЗКА ФУНКЦИЙ
- •Неоднозначность перегрузки
- •Шаблоны функций
- •Явная спецификация типов
- •Оперативная память
- •В адресном пространстве каждого процесса содержится:
- •Виртуальная память может находиться в трех состояниях
- •Средства защиты памяти
- •Страничное преобразование
- •ПРИМЕР РАБОТЫ С УКАЗАТЕЛЯМИ
- •Еще один пример с указателями
- •Утечки памяти
- •Процесс сборки мусора
- •Сборка мусора. Поколения объектов
- •Особенности ОС Windows
- •Процесс и поток
- •Очереди сообщений
- •Структура сообщения
- •Cпособы создания интерактивных Win приложений в VS C++
- •Функция WinMain
- •Создание окна
- •Функция окна
- •Цикл обработки сообщения
- •Определение запущенной копии приложения
- •Пример приложения
- •Команды передачи данных
- •Арифметические команды:
- •Каркас программы
- •Стековый фрейм
- •Парадигмы программирования
- •Элементы объектной модели
- •Преимущества объектной модели
- •Ограничения доступа
- •Спецификатор памяти static
- •Спецификатор const
- •Указатель this
- •Дружественные функции
- •Основные свойства и правила использования спецификатора friend:
- •Наследование
- •Основные правила использования базовых и производных классов:
- •Наследование атрибутов компонентов базового класса:
- •Множественное наследование
- •Использование виртуального класса
- •Полиморфизм
- •ПРОЦЕСС
- •Структура процесса
- •Поток (thread)
- •Создание и работа с потоками
- •Создание потока
- •Завершение потока
- •Совместимость потоков и стандартной библиотеки
- •Синхронизация потоков ПРИМЕР1
- •Как можно приостановить работу потока?
- •ПРИМЕР 2
- •Объекты синхронизации
- •Мьютекс. ПРИМЕР3
- •Критические секции ПРИМЕР4
- •События. ПРИМЕР5
- •Семафоры. ПРИМЕР6
- •Структура описания технологической операции
- •Типы программ
- •Жизненный цикл программного обеспечения
- •Структура процессов ЖЦПО
- •Стратегии конструирования ПО
- •Водопадная модель ЖЦПО
- •Макетирование
- •Спиральная модель БОЭМА
- •Инкрементальная модель
- •Модель быстрой разработки приложений (RAD)
- •Схема процесса XP.
- •Эксплуатационные требования к программным продуктам
Каркас программы
.MODEL FLAT, STDCALL
.DATA
<инициализируемыеданные>
.DATA?
<неинициализиpуемыеданные>
.CONST
<константы>
.CODE
<метка>proc < код> <метка>endp
END
|
|
Интерфейс с языками высокого уровня |
|
||||
Возврат значений из процедур ассемблера |
|
|
|||||
|
Размер |
|
Регистр (регистровая пара), в котором возвращается значение |
|
|||
|
|
|
|
|
|
|
|
|
1 байт |
|
AL |
|
|
|
|
|
2 байта |
|
AX |
|
|
|
|
|
4 байта |
|
EAX |
|
|
|
|
|
более 4 байт |
|
процедура должна зарезервировать место для возвращаемого значения и |
|
|||
|
|
|
передать его адрес в регистровой паре EDX:EAX. |
|
|
||
|
|
|
|
|
|
|
|
|
Директивы передачи параметров |
|
|
|
|||
|
|
|
|
|
|
|
|
|
Директива |
|
|
Передача параметров |
Очистка стека |
Использование |
|
|
|
|
|
|
|
регистров |
|
|
|
|
|
|
|
|
|
|
fastcall (register) |
|
|
Слева направо |
Процедура |
еax,edx,ecx (pascal) |
|
|
|
|
|
|
|
еcx,edx (VC++) |
|
|
|
|
|
|
|
|
|
|
pascal |
|
|
Слева направо |
Процедура |
нет |
|
|
|
|
|
|
|
|
|
|
cdecl |
|
|
Справа налево |
Вызывающая |
нет |
|
|
|
|
|
|
программа |
|
|
|
|
|
|
|
|
|
|
|
stdcall |
|
|
Справа налево |
Процедура |
нет |
|
|
|
|
|
|
|
|
|
Вход в подпрограмму
Младшие адреса
|
ESP |
|
ESP+4 |
ESP+8 |
|
|
|
|
|
|
|
? |
Адрес |
Param1 |
Param2 |
||
|
возврата |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void _stdcall Myproc (int param1,int param2) int AddTwo (int,int)
Выход из подпрограммы
Младшие адреса
|
|
|
|
ESP |
ESP+4 |
? |
|
? |
|
Param1 |
Param2 |
|
|
|
|
|
|
|
stdcall |
ret 8 |
|
||
|
C |
ret |
|
stdcall
_имя@nn
_Myproc@8 Myproc(10,15);
push 15; Второй аргумент push 10 ; Первый аргумент call _Myproc@8
C
_AddTwo
int c=AddTwo(10,15);
push 15; Второй аргумент push 10 ; Первый аргумент call _AddTwo
add esp 8
Стековый фрейм
Для создания стековогофрейма программадолжна выполнить перечисленные нижедействия:
•поместить аргументы в стек;
•вызвать процедуру командой CALL, в результате чегоадрес возврата помещается в стек;
•в начале выполнения процедуры сохранить в стеке регистр ЕВР;
•загрузить в регистр EBP текущийуказатель стека из регистра ESP.
Пример вызова функции extern "C" int razn(inta, int b); void main()
{
inta,b,c; a=20; b=10; c=razn(a,b);
cout << c <<"\n";
.MODEL FLAT , C
.CODE
raznproc a:dword, b:dword ;push ebp
;mov ebp,esp
mov eax,word ptr[ebp+8] movebx,word ptr[ebp+12] subeax,ebx ;movesp,ebp
;pop ebp ret
raznendp end
}Структура стекового фрейма функции razn
Адрес в SP |
Содержимое |
|
|
|
|
|
|
0x0000FFE6 |
xxxx |
Предыдущее |
BP |
|
|
значение BP |
|
|
|
|
|
0x0000FFEA |
xxxx |
Адрес возврата в |
BP+4 |
|
|
main |
|
0x0000FFEE |
0014 |
Значение |
BP+8 |
|
|
переменной "a" |
|
|
|
|
|
0x0000FFF2 |
000A |
Значение |
BP+12 |
|
|
переменной "b" |
|
|
|
|
Пример вызовапроцедуры
extern "C" void sum(int a, int b, int & c); void main()
{
int a,b,c; a=10; b=20; sum(a,b,c);
cout << c <<"\n";
}
Содержимое BP регистра BP
Адрес возврата в BP+4 main
Значение BP+8 переменной "a"
Значение BP+12 переменной "b"
Адрес переменной BP+16 "с" в процедуре
main
.MODEL FLAT,C ;
.CODE
sumproca:dword, b:dword,cp:ptrdword push ebp
movebp,esp push eax pushebx push esi
moveax,dwordptr[ebp+8];
movebx,dwordptr[ebp+12]; add eax,ebx
movesi, dwordptr[ebp+16]; mov[esi],eax ;
popesi pop ebx pop eax movesp,ebp popebp ret
sum endp end
Вызов функции с локальными переменными
С=(А+B)+(B-A)* B*A
|
extern "C" int calc(inta, int b); |
.MODEL FLAT,C |
|
|||
|
.CODE |
|
|
|||
|
void main() |
|
|
|
|
|
|
|
|
calc proc |
a:dword, b:dword |
||
|
{int a,b,c; |
|
|
push ebp |
|
|
|
a=10; |
|
|
movebp,esp |
|
|
|
|
|
subesp,8 ; |
|
||
|
b=20; |
|
|
|
||
|
|
|
push ebx |
|
|
|
|
c = calc(a,b); |
|
|
moveax,dword ptr[ebp+8] ; a |
||
|
cout << c <<"\n"; |
|
|
movebx,dword ptr[ebp+12] ; b |
||
|
|
|
add eax,ebx |
|
||
} |
|
|
; a+b |
|||
|
|
movdword ptr[ebp-4],eax |
||||
|
Содержимое |
|
|
moveax,dword ptr[ebp+8] |
|
|
|
|
|
|
|||
|
|
|
subebx,eax |
|
||
|
|
|
|
|
||
|
|
|
|
movdword ptr[ebp-8],ebx ; b-a |
||
|
место для 2-ой локальной. |
BP-8 |
||||
|
переменной |
|
|
movebx,dword ptr[ebp+12] |
|
|
|
место для 1-ой локальной. |
BP-4 |
mulebx |
; a*b |
|
|
|
переменной |
|
|
mul dword ptr[ebp-8] ; a*b*(b-a) |
||
|
Содержимое регистра BP |
BP |
add eax,dword ptr[ebp-4] |
; ab(b-a)+(a+b) |
||
|
|
|
|
popebx |
|
|
|
Адрес возвратав main |
|
|
|
|
|
|
|
|
mov esp,ebp |
|
||
|
|
|
|
|
||
|
Значениепеременной "a" |
BP+8 |
popebp |
|
|
|
|
|
|
|
ret |
|
|
|
Значениепеременной "b" |
BP+12 |
|
|
||
|
calcendp |
|
|
|||
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
end |
|
|
Введение