Данный курс имеет своей целью изучение базовых принципов устройства современных ЭВМ, анализ качественных и количественных характеристик различных компонент ЭВМ, анализ влияния этих характеристик на работу прикладных программ. Помимо того, в рамках курса предполагается практическое освоение языка ассемблера архитектуры IA-32, изучение особенностей этой процессорной архитектуры, изучение взаимосвязей между архитектурой набора команд, механизмами реализации языка Си и системой программирования.
Список всех тем лекций
Лекция 1. Введение.
Цель курса
Свойства чисел
Язык ассемблера
Отладка
Асимптотическая сложность
Зачем сейчас нужен язык ассемблера?
Литература
План лекций
История первых компьютеров
Архитектура фон Неймана
Единственный вариант архитектуры?
Модельный цикл работы ЭВМ
Ключевые термины и понятия
Лекция 2. Машина, на которой работает пользовательская программа.
Машина, на которой работает пользовательская программа
Рассмотрение одного регистра
Кодирование записи четырех команд
Команда MOV
Порядок размещения байт в памяти
Команда сложения
Интерпретация конструкции с командой add с незаданным размером
Еще одна команда пересылки
Резюме
IA-32
Пример
Память
Лекция 3. Устройство ассемблерной программы.
Повторение
Объявление и инициализация переменной
Построение дерева
Умножение
Обратный путь
Устройство ассемблерной программы
Основные секции
Директивы секции data
Пример заполнения секции data
Резюме по командам арифметики
INC
MUL
Пример
IDIV, DIV
16-разрядный операнд
CBW, CWD, CDQ
Лекция 4. Регистр EFLAGS.
Регистр EFLAGS
Арифметические FLAGи
ZF, SF, CF
Переполнение при сложении двух беззнаковых чисел
OF - знаковое переполнение
Знаковое переполнение с графической точки зрения
Изменение естественного порядка выполнения программы
Команды переходов
Коды
Варианты сравнения
Пример
Другой способ
Резюме
Восстановление корректного варианта
Код
Просмотр содержимого исполняемого файла
Лекция 5. Вызов функции.
Вызов функции
Аппаратный стек AI-32
Команда push
Команда push dword
Команда pop dword
Команда call
Куда call передаст управление?
Команда ret
Пример цепочки вызовов
Стек фреймов
Организация фрейма в IA-32/Linux
Пример
Лекция 6. Система команд.
Повторение
Группы команд
Команда LEA
Косвенная адресация
Базово-индексная адресация
Базово-индексная с масштабированием
Базово-индексная с масштабированием и смещением
Реализация стрелки Пирса
Сдвиг влево
Направление и интерпретация
Сдвиг вправо
Форматы
FLAGи
Команды вращения
Фрагмент кода криптографической хеш-функции
Обратная задача
Сложение 64-разрядных чисел на 32-разрядных регистрах
Умножение 64-разрядных чисел на 32-разрядных регистрах
Лекция 7. Как организована передача управления.
Как организована передача управления
Сравнение знаковых чисел
Сравнение: со знаком и без
Пример
Задача
Реализация операторов с помощью известных команд
Условная передача данных
Конвейер - совмещение разных действий в один момент времени
Опустошение конвейера при передаче управления
Применение команды, чтобы передачи управления не происходило
Циклы
Оператор while
Команда loop для поддержки работы с циклами
Лекция 8. Оператор управления switch.
Задача
Оператор управления switch
Реализация на ассемблере
Duffs Device
Пример
Код
Размещение меток в массиве
Числовой круг
Приведение сравниваемой величины к нулевой базе
Начало оператора switch
Окончание оператора switch
Дерево поиска
Обратная задача
Указатели
Массивы
Имена для производных типов
Обращение к отдельному элементу
Пример
Лекция 9. Многомерные массивы.
Разбор вопросов
Повторение
Две обратные задачи
Добавили к одномерному массиву еще один уровень
Не во всех языках программирования развертывание идет по строчкам
Выделение памяти
Доступ к строчкам
Пример
Массивы указателей
Оптимизации, выполняющиеся при работе с многомерными массивами
Обращение к элементу
Неизвестная размерность
Оптимизация доступа к элементам массива
Упрощение кода
Лекция 10. Структуры.
Повторение
Задача на определение размерности двух массивов
Структуры
Доступ к полям
Указатель на поле структуры
Выравнивание полей в структурах
Почему выравнивают данные
Выполнение правил выравнивания для полей
Различные соглашения о выравнивании
Массивы структур
Как сохранить место
Пример: двоичное дерево
Использование объединений для доступа к отдельным битам
Пример
Пример, связанный с рекурсивным вызовом
Распределение регистров
Рекурсивный вызов
Выводы
Лекция 11. Функция main.
Обратная задача- восстанавливаем объявление функции
ABI - двоичный интерфейс приложения
Уровни
Функция main
Начальное состояние стека
Секции программы
Расчёты адреса начала координат
Команда hlt
Сохранение требований по выравниванию
Функция main с выравниванием стека
Пример вызова malloc
Реализация кода
Выравнивание стека
Лекция 12. Отклонение от соглашения вызова CDECL. Особенности архитектуры х86-64.
Выравнивание фрейма (повторение пройденного материала)
Отказ от указателя фрейма
Компиляторы и соглашения о вызове функций
Соглашение STDCALL
Соглашение FASTCALL
Особенности 64-х разрядной процессорной архитектуры
Архитектура х86-64
Примеры
Лекция 13. Безопасность программного обеспечения.
"Заглянуть за горизонт"
" Нескучная арифметика"
"return-to-libc"
Вызов функций - заключение
Лекция 14. Динамическая память.
Управление динамической памятью
Выделение динамической памяти
Ограничения
Пропускная способность
Внешняя фрагментация
Проблемы реализации менеджера памяти
Промежуточные итоги
Задача на моделирование работы менеджера динамической памяти
Лекция 15. Работа с числами с плавающей точкой. Часть 1.
Дробные двоичные числа
Представимые рациональные числа
Представление чисел с плавающей точкой
Диапазоны значений
Некоторые числа
Округление.
Математические свойства сложения и умножения
Числа с плавающей точкой в языке Си
Пример
Упрощённая схема х87
Лекция 16. Работа с числами с плавающей точкой. Часть 2. Сопроцессор х87.
Слово (регистр) состояния
Управляющий регистр
Регистр признаков (тагов)
NASM и числа с плавающей точкой
Пример 1
Пример 2
Порядок действий
Дополнительные возможности работы сопроцессора
Лекция 17. Элементы системы программирования.
Система программирования
Система программирования языка Си
Компиляция
Пример Си-программы
Частичная трансляция команд
Построение объектного кода
Статическая компоновка
Лекция 18. Сборка Си-программы.
Предварительное определение переменных
Пример
Задача (ошибка компоновки)
Пример (правила перебазирования)
Работа с общими функциями
Лекция 19. Динамические библиотеки. Динамическое связывание.
Динамические библиотеки
Пример
Позиционно независимый код IA-32
Код при вызове функции
Динамическая библиотека LD_LIBRARY_PATH=pwd
Резюме по теме
Лекция 20. Аппаратное обеспечение.
Логические вентили
Полусумматор
Мультиплексор
Арифметико-логическое устройство
бита
Статическая память
Отличие статической памяти от динамической памяти
Разработка интегральных схем
Этапы разработки и изготовления компонент ЭВМ
Закон Мура
Закон Гроша
Закон Белла
Различные классы компьютеров
Оперативная память
Лекция 21. Организация шин. Часть 1.
Организация шин
Типовое соединение ЦПУ и оперативной памяти
Шина: точка зрения разработчика аппаратуры
Характеристика шин
Примеры шин (1)
Синхронизация обращений к памяти
Примеры шин (2)
Лекция 22. Организация шин. Часть 2.
Примеры шин (3)
Внешнее устройство HDD
Геометрия диска
Ёмкость диска
Работа с диском (одна пластина)
Доступ к диску
Логические блоки
Твердотельные диски
Тенденции в развитии запоминающих устройств
Примеры
Примеры кэшей
Лекция 23. Организация функционирования кэш-памяти.
Запись данных в память
Иерархия кэшей в Intel Core i7
Метрики производительности кэша
Оценка производительности
Пример (оценка производительности памяти)
Неучтённые факторы
Упреждающая выборка данных
Латентность
Отключение упреждающей выборки
Выводы
Лекция 24. Системное управление работой компьютера.
Архитектура Intel64
Схема загрузки IA-32
Реальный режим/8086
UЕFI
Стандарт АСРI
Многозадачная работа компьютера: требования к аппаратуре
Модель памяти в IA-32
Уровни защиты
Типы и классы прерываний
Системные вызовы