Лекция 1. Цели курса. Организация курса: лекции и семинарские занятия, литература и информационная поддержка, правила выставления оценок.
История вычислительной техники. Архитектура фон Неймана. Основные компоненты компьютера. Машинная команда, типы операндов, адресность ЭВМ, такт работы. Представление машинной команды, ассемблерная инструкция. Упрощенная схема выполнения инструкции (команды).
Слайды
Лекция 2. Архитектура IA32: основные регистры, форматы команд. IA-32 и ее связь с архитектурами 8086 и Intel64. Выполнение простейших ассемблерных инструкций: пересылка данных и арифметические операции. Упрощенная схема компиляции Си-программы в окружении: компилятор gcc, операционная система Linux, архитектура IA-32.
Слайды
Лекция 3. Ассемблер nasm. Организация ассемблерной программы, секции кода и данных. Арифметические операции и регистр флагов.
Слайды
Лекция 4. Условная и безусловная передача управления. Коды условий. Пример ассемблерной программы: условные и безусловные переходы. Разбор задачи на восстановление управляющих операторов языка Си.
Слайды
Лекция 5. Проблемы организации вызова функций. Аппаратная поддержка стека. Пример ассемблерной программы: отображение вызова функции языка Си в язык ассемблера.
Различные группы команд в архитектуре IA-32. Команды «быстрой» арифметики.
Слайды
Лекция 6. Реализация арифметических операций над 64-разрядными целыми в архитектуре IA-32. Побитовые логические инструкции. Инструкции сдвига и вращения.
Слайды
Лекция 7. Операции над отдельными битами. Операции над данными типа _Bool. Разбор задачи на восстановление выражения языка Си. Реализация управляющих операторов языка Си. goto-форма представления ветвлений и циклов. Условная передача данных.
Слайды
Лекция 8. Особенности реализации операторов цикла на языке ассемблера. Организация цикла с помощью инструкции LOOP. Различные способы отображения оператора switch в язык ассемблера: последовательность if-else, таблица переходов, дерево выбора.
Слайды
Лекция 9. Отображение операторов разыменования указателя и взятия адреса из языка Си в язык ассемблера. Размещение различных типов переменных языка Си в памяти компьютера. Пример работы с указателями. Одномерные массивы и указатели. Адресная арифметика.
Слайды
Лекция 10. Массивы: одномерные, многомерные, многоуровневые. Расположение в памяти, способы работы с отдельными элементами. Особенности работы компилятора с массивами: примеры простых оптимизаций: примеры машинно-независимой и машинно-зависимой оптимизации. Обратная задача на определение размера массива. Структуры, расположение в памяти, доступ к отдельным полям.
Слайды
Лекция 11. Выравнивание полей. Объединения. Битовые поля. Задачи на вычисление размера типа данных.
Особенности организации вызова функций. Соглашение о вызове функций cdecl. Распределение памяти во фрейме функции. Организация рекурсии.
Слайды
Лекция 12. Коллоквиум №1.
Возвращаемое значение в соглашении cdecl, возврат структур из функции в компиляторе.
Слайды
Лекция 13. Инициализация окружения Си-программы. Функции _start и main. Конструкторы/деструкторы. Выравнивание фреймов в стеке. Организация вызова функций стандартной библиотеки языка Си из ассемблерного кода. Соглашения stdcall и fastcall.
Слайды
Лекция 14. Оптимизация и ABI: вызов функций без указателя фрейма. Функции с переменным числом параметров. Ассемблерные вставки в Си-программах.
Соглашение вызова функции в архитектуре x86-64, принципиальные отличия от IA-32.
Слайды
Лекция 15. Переполнение буфера и методы защиты.
Формат инструкций архитектуры IA-32. Префиксы: модификаторы размера операнда и адреса, префиксы повтора. Реализация операций над строками.
Слайды
Лекция 16. Управление динамической памятью. Пропускная способность и эффективность расходования. Внутренняя и внешняя фрагментация. Управление свободными блоками: неявный и явный список, раздельные списки. Сборка мусора. Алгоритм пометок (Mark and Sweep).
Слайды
Лекция 17. Типовые ошибки при работе с памятью.
Представление чисел с плавающей точкой. Стандарт IEEE 754. Операции над числами с плавающей точкой. Округление чисел.
Слайды
Лекция 18. Сопроцессор FPU x87. Аппаратный стек регистров.
Арифметические операции над числами с плавающей точкой. Обратная польская запись. Числа с плавающей точкой в языке Си: типы, доступ к результатам сравнения чисел, передача в качестве параметров функции, возвращаемое значение. Слайды
Лекция 19. Организация аппаратного обеспечения компьютера. Логические вентили. Закон Мура. Закон Гроша. Устройство оперативной памяти. Статическая и динамическая память. Расслоение памяти. Шины, их характеристики.
Слайды
Лекция 20. Коллоквиум №2.
Примеры шин: фронтальная шина, PCI, USB, SATA, … Блокировка шины памяти.
Слайды
Лекция 21. Ввод/вывод. Устройство НЖМД: организация, емкость, временные характеристики доступа. Организация ввода/вывода через пространство портов и через память. Пример периферийного устройства: WatchDog. Твердотельные диски. Тенденции в развитии запоминающих устройств. Принципиальные ограничения в развитии вычислительной техники: “Memory Wall” и “Power Wall”. Локальность в программах. Иерархическая организация памяти, кэширование.
Слайды
Лекция 22. Кэш-память: способы организации. Кэш прямого отображения. N-канальный ассоциативный кэш. Полностью ассоциативный кэш. Метрики производительности кэша. Способы оценки производительности компьютеров и программ. Аппаратные средства измерения времени. Синтетический тест: оценка производительности памяти современного компьютера.
Конвейерная обработка команд. Приостановка и опустошение конвейера. Суперскалярная архитектура. Внеочередное выполнение команд. Предсказание переходов. CISC и RISC архитектуры.
Слайды
Лекция 23. История развития архитектуры x86. Режимы работы современного процессора архитектуры Intel64/AMD64. Обратная совместимость процессоров. Начальная загрузка компьютера: BIOS, ACPI, UEFI.
Многозадачная работа компьютера: требования к аппаратуре. Аппарат защиты памяти. Прерывания. Пользовательский и привилегированный режимы работы ЦПУ.
Слайды
Лекция 24. Системные вызовы.
Система программирования языка Си. Программные инструменты, используемые при разработке Си-программ. Схема работы ассемблера. Статическая компоновка программы. Схема работы компоновщика: разрешение символов и перемещение кода. Типы объектных файлов (модулей). Формат ELF.
Обработка компоновщиком нескольких символов с одинаковыми именами: сильные и слабые символы. Загрузка исполняемого файла в память.
Слайды