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