1 Лекция 1. Введение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....10
1.1 Цель курса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....10
1.2 Несколько проблем программирования . . . . . . . . . . . . . . . ....10
1.3 Зачем нужен язык ассемблера . . . . . . . . . . . . . . . . . . . . ....14
1.4 История первых компьютеров . . . . . . . . . . . . . . . . . . . . ....14
1.5 Архитектура фон Неймана . . . . . . . . . . . . . . . . . . . . . . ....15
1.6 Другие варианты архитектур . . . . . . . . . . . . . . . . . . . . . ....17
1.7 Модельный цикл работы ЭВМ . . . . . . . . . . . . . . . . . . . . ....18
1.8 Ключевые понятия и термины . . . . . . . . . . . . . . . . . . . . ....19
2 Лекция 2. Машина, на которой работает пользовательская программа . . ....21
2.1 Машина, на которой работает пользовательская программа . . . . ....21
2.2 Порядок размещения байт в памяти . . . . . . . . . . . . . . . . . ....23
2.3 Команда сложения . . . . . . . . . . . . . . . . . . . . . . . . . . . ....25
2.4 Интерпретация конструкции с командой add с незаданным размером 25
2.5 Команда пересылки . . . . . . . . . . . . . . . . . . . . . . . . . . ....26
2.6 Типы адресации . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....26
2.7 IA-32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....27
2.8 Примеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....28
3 Лекция 3. Устройство ассемблерной программы . . . . . . . . . . . . . . ....31
3.1 Пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....31
3.2 Обратный путь . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....35
3.3 Устройство ассемблерной программы . . . . . . . . . . . . . . . . ....37
3.4 Пример заполнения секции .data . . . . . . . . . . . . . . . . . . . ....39
3.5 Секция .text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....39
3.6 Основные арифметические команды . . . . . . . . . . . . . . . . ....40
4 Лекция 4. Регистр EFLAGS. . . . . . . . . . . . . . . . . . . . . . . . . . ....43
4.1 Регистр EFLAGS . . . . . . . . . . . . . . . . . . . . . . . . . . . ....43
4.2 Арифметические FLAGи . . . . . . . . . . . . . . . . . . . . . . . ....44
4.3 Переполнение при сложении двух беззнаковых чисел . . . . . . . ....44
4.4 FLAG OF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....44
4.5 Изменение естественного порядка выполнения программы . . . . ....46
4.6 Коды . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....49
4.7 Варианты сравнения . . . . . . . . . . . . . . . . . . . . . . . . . ....50
4.8 Регистр EFLAGS и инструкции . . . . . . . . . . . . . . . . . . . ....51
4.9 Обратная задача . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....51
4.10 Просмотр содержимого исполняемого файла . . . . . . . . . . . . ....54
5 Лекция 5. Вызов функции . . . . . . . . . . . . . . . . . . . . . . . . . . . ....55
5.1 Вызов функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....55
5.2 Аппаратный стек AI-32 . . . . . . . . . . . . . . . . . . . . . . . . ....56
5.3 Команда push . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....56
5.4 Команда pop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....58
5.5 Языки программирования (ЯП), базирующиеся на стеке вызовов ....59
5.6 Порядок вызова функции . . . . . . . . . . . . . . . . . . . . . . . ....60
5.7 Стек фреймов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....62
5.8 Организация фрейма в IA-32/Linux . . . . . . . . . . . . . . . . . ....64
6 Лекция 6. Система команд. . . . . . . . . . . . . . . . . . . . . . . . . . . ....69
6.1 Группы команд . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....69
6.2 Команда LEA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....70
6.3 Косвенная адресация . . . . . . . . . . . . . . . . . . . . . . . . . ....71
6.4 Реализация стрелки Пирса . . . . . . . . . . . . . . . . . . . . . . ....72
6.5 Сдвиги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....74
6.6 Форматы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....76
6.7 Команды вращения . . . . . . . . . . . . . . . . . . . . . . . . . . ....77
6.8 Обратная задача . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....79
6.9 Сложение 64-разрядных чисел на 32 разрядных регистрах . . . . ....79
6.10 Умножение 64 разрядных чисел на 32 разрядных регистрах . . . ....80
7 Лекция 7. Как организована передача управления. . . . . . . . . . . . . . ....83
7.1 Сравнение беззнаковых чисел . . . . . . . . . . . . . . . . . . . . ....83
7.2 Сравнение знаковых чисел . . . . . . . . . . . . . . . . . . . . . . ....83
7.3 Сравнение: со знаком и без . . . . . . . . . . . . . . . . . . . . . . ....84
7.4 Реализация операндов с помощью известных команд . . . . . . . ....86
7.5 Условная передача данных . . . . . . . . . . . . . . . . . . . . . . ....89
7.6 Конвейер – совмещение разных действий в один момент времени ....90
7.7 Оператор do-while . . . . . . . . . . . . . . . . . . . . . . . . . . . ....93
7.8 Оператор while . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....93
7.9 Оператор for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....94
8 Лекция 8. Оператор управления switch . . . . . . . . . . . . . . . . . . . . ....99
8.1 Обратная задача . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....99
8.2 Оператор управления switch . . . . . . . . . . . . . . . . . . . . . ....100
8.3 Duff’s Device . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....104
8.4 Обратная задача . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....112
8.5 Указатели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....114
8.6 Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....115
9 Лекция 9. Многомерные массивы. . . . . . . . . . . . . . . . . . . . . . . ....116
9.1 Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....116
9.2 Две обратные задачи . . . . . . . . . . . . . . . . . . . . . . . . . ....117
9.3 Выделение памяти . . . . . . . . . . . . . . . . . . . . . . . . . . ....119
9.4 Доступ к строкам . . . . . . . . . . . . . . . . . . . . . . . . . . . ....120
9.5 Оптимизация доступа к многомерным массивам. . . . . . . . . . ....122
9.6 Обращение к элементу . . . . . . . . . . . . . . . . . . . . . . . . ....122
9.7 Оптимизация доступа к элементам массива . . . . . . . . . . . . ....123
10 Лекция 10. Структуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....126
10.1 Повторение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....126
10.2 Структуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....126
10.3 Выравнивание полей в структурах . . . . . . . . . . . . . . . . . . ....127
10.4 Объединения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....130
10.5 Порядок байт . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....131
10.6 Битовые поля . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....131
10.7 Немного про функции . . . . . . . . . . . . . . . . . . . . . . . . ....132
10.8 Соглашения CDECL . . . . . . . . . . . . . . . . . . . . . . . . . . ....132
10.9 Сохранение регистров . . . . . . . . . . . . . . . . . . . . . . . . ....133
11 Лекция 11. Функция main . . . . . . . . . . . . . . . . . . . . . . . . . . . ....134
11.1 ABI - двоичный интерфейс приложения . . . . . . . . . . . . . . ....134
11.2 Функция main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....135
11.3 Начальное состояние стека . . . . . . . . . . . . . . . . . . . . . . ....135
11.4 Сохранение требований по выравниванию . . . . . . . . . . . . . ....137
11.5 Конструкторы и деструкторы . . . . . . . . . . . . . . . . . . . . ....138
11.6 Оболочка вокруг main . . . . . . . . . . . . . . . . . . . . . . . . . ....139
12 Лекция 12. Особенности архитектуры х86-64. . . . . . . . . . . . . . . . ....140
12.1 Выравнивание фрейма . . . . . . . . . . . . . . . . . . . . . . . . ....140
12.2 Отказ от указателя фрейма . . . . . . . . . . . . . . . . . . . . . . ....140
12.3 Компиляторы и соглашения вызова функции . . . . . . . . . . . . ....142
12.4 Соглашение FASTCALL . . . . . . . . . . . . . . . . . . . . . . . ....144
12.5 Особенности 64-разрядной процессорной архитектуры . . . . . . ....145
12.6 Архитектура х86_64 . . . . . . . . . . . . . . . . . . . . . . . . . . ....146
13 Лекция 13. Безопасность программного обеспечения . . . . . . . . . . . ....148
13.1 Пример 1 “Заглянуть за горизонт” . . . . . . . . . . . . . . . . . . ....148
13.2 Пример 2. “Нескучная арифметика” . . . . . . . . . . . . . . . . . ....150
13.3 Пример 3. “return-to-libc” . . . . . . . . . . . . . . . . . . . . . . . ....151
13.4 Способы защиты . . . . . . . . . . . . . . . . . . . . . . . . . . . ....154
14 Лекция 14. Динамическая память . . . . . . . . . . . . . . . . . . . . . . ....156
14.1 Управление динамической памятью . . . . . . . . . . . . . . . . . ....156
14.2 Выделение динамической памяти . . . . . . . . . . . . . . . . . . ....156
14.3 Ограничения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....158
14.4 Производительность. Пропускная способность . . . . . . . . . . ....158
14.5 Внутренняя фрагментация. Внешняя фрагментация . . . . . . . . ....158
14.6 Проблемы реализации менеджера памяти . . . . . . . . . . . . . ....159
15 Лекция 15. Работа с числами с плавающей точкой. Часть 1 . . . . . . . . ....165
15.1 Дробные двоичные числа . . . . . . . . . . . . . . . . . . . . . . . ....165
15.2 Представимые рациональные числа . . . . . . . . . . . . . . . . . ....165
15.3 Представление чисел с плавающей точкой . . . . . . . . . . . . . ....165
15.4 Диапазоны значений . . . . . . . . . . . . . . . . . . . . . . . . . ....167
15.5 Округление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....167
15.6 Арифметические операции . . . . . . . . . . . . . . . . . . . . . . ....168
15.7 Математические свойства сложения и умножения . . . . . . . . . ....170
15.8 Числа с плавающей точкой в языке Си . . . . . . . . . . . . . . . ....171
15.9 Упрощённая схема х87 . . . . . . . . . . . . . . . . . . . . . . . . ....171
16 Лекция 16. Работа с числами с плавающей точкой. Часть 2. Сопроцессор х87....173
16.1 Слово (регистр) состояния . . . . . . . . . . . . . . . . . . . . . . ....173
16.2 Управляющий регистр . . . . . . . . . . . . . . . . . . . . . . . . ....175
16.3 Регистр признаков . . . . . . . . . . . . . . . . . . . . . . . . . . . ....175
16.4 NASM и числа с плавающей точкой . . . . . . . . . . . . . . . . . ....175
16.5 Пример 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....176
16.6 Пример 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....178
16.7 Порядок действий . . . . . . . . . . . . . . . . . . . . . . . . . . . ....178
16.8 Дополнительные команды . . . . . . . . . . . . . . . . . . . . . . ....179
16.9 Сравнение чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . ....180
16.10 Дополнительные возможности работы сопроцессора . . . . . . . ....181
17 Лекция 17. Элементы системы программирования . . . . . . . . . . . . . ....182
17.1 Система программирования . . . . . . . . . . . . . . . . . . . . . ....182
17.2 Система программирования языка Си . . . . . . . . . . . . . . . . ....182
17.3 Компиляция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....184
17.4 Схема работы ассемблера . . . . . . . . . . . . . . . . . . . . . . . ....184
17.5 Пример Си-программы . . . . . . . . . . . . . . . . . . . . . . . . ....185
17.6 Статическая компоновка . . . . . . . . . . . . . . . . . . . . . . . ....186
18 Лекция 18. Сборка Си-программы . . . . . . . . . . . . . . . . . . . . . . ....191
18.1 Предварительное определение переменных . . . . . . . . . . . . ....191
18.2 Сильные и слабые символы. Пример. . . . . . . . . . . . . . . . . ....191
18.3 Правила работы с символами . . . . . . . . . . . . . . . . . . . . ....192
18.4 Задача. Ошибка компоновки . . . . . . . . . . . . . . . . . . . . . ....193
18.5 Пример (Правила перебазирования) . . . . . . . . . . . . . . . . . ....193
18.6 Работа с общими функциями . . . . . . . . . . . . . . . . . . . . . ....196
18.7 Статические библиотеки . . . . . . . . . . . . . . . . . . . . . . . ....196
18.8 Загрузка исполняемого объектного файла . . . . . . . . . . . . . . ....197
19 Лекция 19. Динамические библиотеки. Динамическое связывание . . . . ....199
19.1 Динамические библиотеки . . . . . . . . . . . . . . . . . . . . . . ....199
19.2 Пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....200
19.3 Позиционно независимый код в IA-32 . . . . . . . . . . . . . . . . ....201
19.4 Код при вызове функций . . . . . . . . . . . . . . . . . . . . . . . ....204
19.5 Загрузка динамически скомпонованного исполняемого файла . . ....205
20 Лекция 20. Аппаратное обеспечение . . . . . . . . . . . . . . . . . . . . . ....207
20.1 Логические вентили . . . . . . . . . . . . . . . . . . . . . . . . . . ....207
20.2 Сумматор. Полусумматор . . . . . . . . . . . . . . . . . . . . . . . ....209
20.3 Мультиплексор . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....209
20.4 Арифметико-логическое устройство . . . . . . . . . . . . . . . . . ....210
20.5 Регистр: сохранение 1 бита . . . . . . . . . . . . . . . . . . . . . . ....210
20.6 Статическая память . . . . . . . . . . . . . . . . . . . . . . . . . . ....211
20.7 Отличие статической памяти от динамической памяти . . . . . . ....211
20.8 Разработка интегральных схем . . . . . . . . . . . . . . . . . . . . ....211
20.9 Этапы разработки и изготовления компонент ЭВМ . . . . . . . . ....212
20.10 Закон Мура . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....212
20.11 Закон Гроша . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....213
20.12 Закон Белла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....213
20.13 Различные классы компьютеров . . . . . . . . . . . . . . . . . . . ....213
20.14 Оперативная память . . . . . . . . . . . . . . . . . . . . . . . . . . ....214
21 Лекция 21. Организация шин . . . . . . . . . . . . . . . . . . . . . . . . . ....217
21.1 Шины и адресные пространства. . . . . . . . . . . . . . . . . . . ....217
21.2 Организация ввода/вывода через пространство портов и через память. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....220
21.3 Шина. Точка зрения системного программиста . . . . . . . . . . . ....222
21.4 Пример устройства на шине: WatchDog. . . . . . . . . . . . . . . ....224
21.5 Физические принципы устройства шин. Основные характеристики шин. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....225
21.6 Развитие системы связанных шин персональных компьютеров . . ....226
21.7 Примеры шин: фронтальная шина . . . . . . . . . . . . . . . . . . ....229
21.8 Синхронизация обращений к памяти . . . . . . . . . . . . . . . . ....229
21.9 Примеры шин: PCI. . . . . . . . . . . . . . . . . . . . . . . . . . . ....232
22 Лекция 22. Использование шин в современных компьютерах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....234
22.1 Примеры шин: AGP, USB, SATA . . . . . . . . . . . . . . . . . . . ....234
22.2 Жесткий диск . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....235
22.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....237
22.4 Ввод/вывод (блочного) SATA-устройства. . . . . . . . . . . . . . . ....238
22.5 Твердотельные диски (SSD) . . . . . . . . . . . . . . . . . . . . . ....239
22.6 Локальность в программах . . . . . . . . . . . . . . . . . . . . . . ....242
22.7 Иерархическая организация памяти, кэширование. . . . . . . . . ....244
22.8 Кэш-память: способы организации. . . . . . . . . . . . . . . . . . ....246
22.9 Кэш прямого отображения. . . . . . . . . . . . . . . . . . . . . . . ....247
23 Лекция 23. Работа кэша. Количественные характеристики работы компьютера . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....248
23.1 Запись в кэш . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....248
23.2 Метрики производительности кэша . . . . . . . . . . . . . . . . . ....249
23.3 Способы оценки производительности компьютеров и программ . ....250
23.4 Аппаратные средства измерения времени. . . . . . . . . . . . . . ....251
23.5 Оценка производительности памяти: синтетический бенчмарк (контрольная задача) . . . . . . . . . . . . . . . . . . . . . . . . . ....252
23.6 Микроархитектура процессора, ее связь с другими архитектурными уровнями. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....254
23.7 Пропускная способность vs. Латентность . . . . . . . . . . . . . . ....256
23.8 Оценка латентности памяти на синтетическом тесте. . . . . . . . ....257
23.9 Микроархитектурные решения . . . . . . . . . . . . . . . . . . . ....260
23.10 Конвейерная обработка команд, проблемы конвейерной обработки 260
23.11 CISC и RISC архитектуры. . . . . . . . . . . . . . . . . . . . . . . ....266
23.12 RISC-V – архитектура RISC-микропроцессоров с открытым исходным кодом. . . . . . . . . . . . . . . . . . . . . . . . . . . . ....267
23.13 Конвейер RISC-V . . . . . . . . . . . . . . . . . . . . . . . . . . . ....269
23.14 Развитие системы команд в архитектуре x86 . . . . . . . . . . . . ....270
24 Лекция 24. Системное управление работой современного компьютера . . ....272
24.1 Режимы работы современного процессора архитектуры Intel64/AMD64, загрузка. . . . . . . . . . . . . . . . . . . . . . . . ....272
24.2 Встраиваемое ПО, обеспечивающее начальную загрузку компьютера: BIOS, ACPI, UEFI . . . . . . . . . . . . . . . . . . . ....273
24.3 Многозадачная работа компьютера: требования к аппаратуре. . . ....275
24.4 Модели памяти. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....276
24.5 Аппарат защиты памяти. . . . . . . . . . . . . . . . . . . . . . . . ....278
24.6 Страничная виртуальная память. . . . . . . . . . . . . . . . . . . ....280
24.7 Упрощенная схема извлечения данных из виртуальной памяти . ....284
24.8 Уровни (кольца) защиты . . . . . . . . . . . . . . . . . . . . . . . ....285
24.9 Прерывания. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....285
24.10 Hello, world! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....289
Книга имеет своей целью изучение базовых принципов устройства современных ЭВМ, анализ качественных и количественных характеристик различных компонент ЭВМ, анализ влияния этих характеристик на работу прикладных программ. Помимо того, предполагается практическое освоение языка ассемблера архитектуры IA-32, изучение особенностей этой процессорной архитектуры, изучение взаимосвязей между архитектурой набора команд, механизмами реализации языка Си и системой программирования.