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