Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Программирование на ассемблере на платформе x86-64

Покупка
Артикул: 816399.01.99
Доступ онлайн
439 ₽
В корзину
В данной книге речь идёт о работе процессора в двух его основных режимах: защищённом режиме и 64-битном, который также называют long mode («длинный режим»). Также помимо изложения принципов и механизмов работы процессора в защищённом и 64-битном режимах, речь пойдёт о программировании на ассемблере в операционных системах семейства Windows, как в 32-битных, так и 64-битных версиях. Рассматривается не только разработка обычных приложений для операционных систем Windows, но и разработка драйверов на ассемблере. При написании книги уделялось большое внимание именно практической составляющей, т.е. изложение материала идёт только по делу и только то, что необходимо знать любому системному и низкоуровневому программисту. Последний раздел книги посвящён принципам работы многопроцессорных систем, а также работе с расширенным программируемым контроллером прерываний (APIC). На сайте издательства находятся полные исходные коды примеров к книге, а также дополнительные программы и материалы. Издание предназначено для системных и низкоуровневых программистов, а также для студентов и преподавателей технических специальностей высших и средне-специальных учебных заведений.
Аблязов, Р. З. Программирование на ассемблере на платформе x86-64 : учебное пособие / Р. З. Аблязов. - 2-е изд. - Москва : ДМК Пресс, 2023. - 306 с. - ISBN 978-5-89818-354-7. - Текст : электронный. - URL: https://znanium.ru/catalog/product/2103587 (дата обращения: 22.11.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов
Москва, 2023

Руслан Аблязов
Программирование на ассемблере на платформе x86-64

Издание рекомендовано в качестве учебного пособия 
для студентов технических вузов

2-е издание, электронное

УДК 004.438Assembler
ББК 32.973.26-018.1
А13

А13
Аблязов, Руслан Зуфярович.
Программирование на ассемблере на платформе x86–64 / Р. З. Аблязов. — 2-е изд., эл. — 1 файл pdf : 306 с. — Москва : ДМК Пресс, 2023. — Систем. 
требования: Adobe Reader XI либо Adobe Digital Editions 4.5 ; экран 10". — 
Текст : электронный.
ISBN 978-5-89818-354-7
В данной книге речь идёт о работе процессора в двух его основных режимах: защищённом режиме и 64-битном, который также называют long mode («длинный режим»). 
Также помимо изложения принципов и механизмов работы процессора в защищённом 
и 64-битном режимах, речь пойдёт о программировании на ассемблере в операционных 
системах семейства Windows, как в 32-битных, так и 64-битных версиях. Рассматривается не только разработка обычных приложений для операционных систем Windows, 
но и разработка драйверов на ассемблере. При написании книги уделялось большое 
внимание именно практической составляющей, т.е. изложение материала идёт только 
по делу и только то, что необходимо знать любому системному и низкоуровневому программисту. Последний раздел книги посвящён принципам работы многопроцессорных 
систем, а также работе с расширенным программируемым контроллером прерываний 
(APIC).
На сайте издательства находятся полные исходные коды примеров к книге, а также 
дополнительные программы и материалы.
Издание предназначено для системных и низкоуровневых программистов, а также 
для студентов и преподавателей технических специальностей высших и средне-специальных учебных заведений.

УДК 004.438Assembler 
ББК 32.973.26-018.1

Электронное издание на основе печатного издания: Программирование на ассемблере на платформе x86–64 / Р. З. Аблязов. — Москва : ДМК Пресс, 2011. — 304 с. — ISBN 978-5-94074-676-8. — 
Текст : непосредственный.

Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме 
и какими бы то ни было средствами без  письменного разрешения владельцев авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность технических 
ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные с 
использованием книги.

В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных техническими средствами защиты авторских прав, правообладатель вправе требовать от нарушителя возмещения убытков или выплаты компенсации.

ISBN 978-5-89818-354-7
©  Аблязов Р. З., 2011
© Оформление, издание, ДМК Пресс, 2011

Содержание

Используемый компилятор ................................................................. 9

Глава 1. Основы ................................................................................. 11

1.1. Основные понятия ...................................................................... 11

1.1.1. Что такое процессор? ............................................................. 11
1.1.2. Небольшая предыстория ........................................................ 14
1.1.3. Процессоры x86-64 ................................................................ 16
1.1.4. Регистры процессоров x86-64 ................................................ 18
1.1.5. Память .................................................................................... 19
1.1.6. Работа с внешними устройствами .......................................... 21
1.1.7. Резюме ................................................................................... 21

1.2. Основы ассемблера ................................................................... 22

1.2.1. Немного о языке ассемблера .................................................. 22
1.2.2. Регистр флагов ....................................................................... 23
1.2.3. Команда MOV.......................................................................... 24
1.2.4. Формат хранения данных в памяти ......................................... 26
1.2.5. Команды SUB и ADD ................................................................ 27
1.2.6. Логические операции ............................................................. 27
1.2.7. Сдвиги .................................................................................... 28
1.2.8. Работа с флагами процессора ................................................ 30
1.2.9. Работа со стеком .................................................................... 30
1.2.10. Резюме ................................................................................. 30

1.3. Метки, данные, переходы .......................................................... 31

1.3.1. Данные ................................................................................... 31
1.3.2. Метки ..................................................................................... 32
1.3.3. Переходы................................................................................ 35
1.3.4. Безымянные метки ................................................................. 38
1.3.5. Работа с битами ...................................................................... 39
1.3.6. Резюме ................................................................................... 39

1.4. Изучаем ассемблер подробнее ................................................ 39

1.4.1. Работа с памятью и стеком ..................................................... 40
1.4.2. Работа с числами на ассемблере ............................................ 41
1.4.3. Умножение и деление ............................................................. 44
1.4.4. Порты ввода-вывода ............................................................... 46
1.4.5. Циклы ..................................................................................... 46
1.4.6. Обработка блоков данных ....................................................... 47
1.4.7. Макросы ................................................................................. 50

Содержание

1.4.8. Структуры ............................................................................... 52
1.4.9. Работа с MSR-регистрами  ..................................................... 53
1.4.10. Команда CPUID ..................................................................... 54
1.4.11. Команда UD2 ........................................................................ 55
1.4.12. Включение файлов ................................................................ 55
1.4.13. Резюме ................................................................................. 55

Глава 2. Защищённый режим ....................................................... 56

2.1. Введение в защищённый режим ............................................... 56

2.1.1. Уровни привилегий ................................................................. 56
2.1.2. Сегменты в защищённом режиме ........................................... 58
2.1.3. Глобальная дескрипторная таблица ........................................ 61
2.1.4. Практика ................................................................................. 63
2.1.5. Резюме ................................................................................... 70

2.2. Прерывания в защищённом режиме ........................................ 71

2.2.2. Дескрипторы шлюзов ............................................................. 72
2.2.3. Исключения ............................................................................ 74
2.2.4. Коды ошибок .......................................................................... 76
2.2.5. Программные прерывания ...................................................... 77
2.2.6. Аппаратные прерывания ......................................................... 77
2.2.7. Обработчик прерывания ......................................................... 79
2.2.8. Практика ................................................................................. 80
2.2.9. Резюме ................................................................................... 85

2.3. Механизм трансляции адресов ................................................. 85

2.3.1. Что это такое? ......................................................................... 85
2.3.2. Обычный режим трансляции адресов ..................................... 87
2.3.3. Режим расширенной физической трансляции адресов ........... 91
2.3.4. Обработчик страничного нарушения ....................................... 94
2.3.5. Флаг WP в регистре CR0 ......................................................... 95
2.3.6. Практика ................................................................................. 96
2.3.7. Резюме ................................................................................. 102

2.4. Многозадачность ...................................................................... 102

2.4.1. Общие сведения ................................................................... 102
2.4.2. Сегмент задачи (TSS) ........................................................... 103
2.4.3. Дескриптор TSS .................................................................... 105
2.4.4. Локальная дескрипторная таблица ....................................... 105
2.4.5. Регистр задачи (TR) .............................................................. 106
2.4.6. Управление задачами ........................................................... 106
2.4.7. Шлюз задачи ........................................................................ 109
2.4.8. Уровень привилегий ввода-вывода ....................................... 109
2.4.9. Карта разрешения ввода-вывода .......................................... 110
2.4.10. Включение многозадачности .............................................. 110
2.4.11. Практическая реализация ................................................... 111
2.4.12. Резюме ............................................................................... 118

2.5. Механизмы защиты .................................................................. 119

2.5.1. Поля и флаги, используемые для защиты  
на уровне сегментов и страниц ...................................................... 119
2.5.2. Проверка лимитов сегментов ............................................... 120
2.5.3. Проверки типов .................................................................... 120
2.5.4. Уровни привилегий ............................................................... 122
2.5.5. Проверка уровня привилегий при доступе  
к сегментам данных ....................................................................... 123
2.5.6. Проверка уровней привилегий при межсегментной  
передаче управления ..................................................................... 124
2.5.7. Шлюзы вызова ...................................................................... 125
2.5.8. Переключение стека ............................................................. 128
2.5.9. Использование инструкций SYSENTER и SYSEXIT .................. 129
2.5.10. Практика ............................................................................. 130
2.5.11. Резюме ............................................................................... 133

Глава 3. ПРОГРАММИРОВАНИЕ В WIN32 ............................... 134

3.1. Введение в Win32 ...................................................................... 134

3.1.1. Основные сведения .............................................................. 135
3.1.2. Память в Win32 ...................................................................... 135
3.1.3. Исполняемые компоненты Windows ...................................... 136
3.1.4. Системные библиотеки и подсистемы .................................. 137
3.1.5. Модель вызова функций в Win32 ........................................... 138
3.1.6. Выполнение программ в Win32: общая картина ..................... 138
3.1.7. Практика ............................................................................... 139
3.1.8. Резюме ................................................................................. 147

3.2. Программирование в третьем кольце .................................... 148

3.2.1. Общий обзор ........................................................................ 148
3.2.2. Работа с объектами .............................................................. 149
3.2.3. Работа с файлами ................................................................. 149
3.2.4. Обработка ошибок API-функций............................................ 152
3.2.5. Консольные программы ........................................................ 152
3.2.6. GUI-программы .................................................................... 153
3.2.7. Динамически подключаемые библиотеки ............................. 156
3.2.8. Обработка исключений в программе .................................... 159
3.2.9. Практика ............................................................................... 162
3.2.10. Резюме ............................................................................... 171

3.3. Программирование в нулевом кольце .................................... 171

3.3.1. Службы ................................................................................. 172
3.3.2. Общий обзор ........................................................................ 173
3.3.3. Driver Development Kit (DDK) ................................................. 174
3.3.4. Контекст потока и уровни запросов прерываний ................... 175
3.3.5. Пример простого драйвера .................................................. 176
3.3.6. Строки в ядре Windows .......................................................... 179

Содержание

Содержание

3.3.7. Подсистема ввода-вывода.................................................... 180
3.3.8. Практика ............................................................................... 186
3.3.9. Резюме ................................................................................. 201

Глава 4. LONG MODE ...................................................................... 202

4.1. Введение в long mode .............................................................. 202

4.1.1. Общий обзор ........................................................................ 202
4.1.2. Сегментация в long mode ...................................................... 204
4.1.3. Механизм трансляции страниц ............................................. 205
4.1.4. Переход в long mode ............................................................. 205
4.1.5. Практика ............................................................................... 206
4.1.6. Резюме ................................................................................. 208

4.2. Работа с памятью в long mode ................................................. 208

4.2.1. Общий обзор ........................................................................ 209
4.2.2. Страницы размером 4 Кб ...................................................... 209
4.2.3. Страницы размером 2 Мб ..................................................... 211
4.2.4. Страницы размером 1 Гб ...................................................... 212
4.2.5. Регистр CR3 .......................................................................... 213
4.2.6. Проверки защиты ................................................................. 214
4.2.7. Практика ............................................................................... 214
4.2.8. Резюме ................................................................................. 221

4.3. Прерывания в long mode .......................................................... 221

4.3.1. Дескрипторы шлюзов ........................................................... 221
4.3.2. Таблица IDT, 64-битный TSS и механизм IST .......................... 222
4.3.3. Вызов обработчика прерывания ........................................... 223
4.3.4. Практика ............................................................................... 224
4.3.5. Резюме ................................................................................. 230

4.4. Защита и многозадачность ...................................................... 230

4.4.1. Сегменты .............................................................................. 231
4.4.2. Шлюзы вызова ...................................................................... 231
4.4.3. Инструкции SYSCALL и SYSRET .............................................. 232
4.4.4. Многозадачность .................................................................. 233
4.4.5. Практика ............................................................................... 235
4.4.6. Резюме ................................................................................. 238

Глава 5. ПРОГРАММИРОВАНИЕ В WIN64 ............................... 239

5.1. Введение в Win64 ...................................................................... 239

5.1.1. Преимущества и недостатки ................................................. 239
5.1.2. Память в Win64 ...................................................................... 240
5.1.3. Модель вызова ..................................................................... 240
5.1.4. Режим совместимости .......................................................... 242
5.1.5. Win64 API и системные библиотеки ....................................... 242
5.1.6. Практика ............................................................................... 243
5.1.7. Резюме ................................................................................. 244

5.2. Программирование в Win64 ..................................................... 244

5.2.1. Изменения в типах данных .................................................... 245
5.2.2. Выравнивание стека ............................................................. 245
5.2.3. GUI-приложения ................................................................... 246
5.2.4. Программирование драйверов ............................................. 250
5.2.5. Отладка приложений в Win64 ................................................ 254
5.2.6. Резюме ................................................................................. 254

Глава 6. МНОГОПРОЦЕССОРНЫЕ СИСТЕМЫ ....................... 255

6.1. Работа с APIC ............................................................................ 255

6.1.1. Общий обзор ........................................................................ 255
6.1.2. Включение APIC  ................................................................... 256
6.1.3. Local APIC ID ......................................................................... 257
6.1.4. Локальная векторная таблица ............................................... 257
6.1.5. Local APIC Timer .................................................................... 259
6.1.6. Обработка прерываний ......................................................... 261
6.1.7. Работа с I/O APIC .................................................................. 263
6.1.8. Практика ............................................................................... 266
6.1.9. Резюме ................................................................................. 270

6.2. Межпроцессорное взаимодействие ....................................... 270

6.2.1. Общий обзор ........................................................................ 270
6.2.2. Межпроцессорные прерывания ............................................ 271
6.2.3. Синхронизация доступа к данным ......................................... 273
6.2.4. Инициализация многопроцессорной системы ...................... 275
6.2.5. Практика ............................................................................... 276
6.2.6. Резюме ................................................................................. 280

ПРИЛОЖЕНИЯ .................................................................................. 281

Приложение А. MSR-регистры ....................................................... 281

А.1. Регистр IA32_EFER ................................................................... 281
А.2. Регистры, используемые командами SYSENTER/SYSEXIT ........ 281
А.3. Регистры, используемые командами SYSCALL/SYSRET ............ 282
А.4. Регистры APIC ......................................................................... 282
А.5. Регистры для управления сегментами в long mode .................. 283
А.6. Вспомогательные регистры ..................................................... 283

Приложение Б. Системные регистры ............................................ 283

Б.1. Регистр CR0 ............................................................................ 283
Б.2. Регистры CR2 и CR3 ................................................................ 285
Б.3. Регистр CR4 ............................................................................ 286
Б.4. Регистры GDTR и IDTR ............................................................. 287
Б.5. Регистры LDTR и TR ................................................................. 288
Б.6. Регистр флагов ....................................................................... 288
Б.7. Регистр CR8 ............................................................................ 290

Содержание

Содержание

Приложение В. Системные команды ............................................. 290

B.1. Работа с системными регистрами ........................................... 290
B.2. Системные команды ................................................................ 293
B.3. Работа с кэшем процессора .................................................... 295
B.4. Дополнительные команды ....................................................... 295

Алфавитный указатель ................................................................. 297

Используемый компилятор
При компиляции всех примеров, приведённых в этой книге, необходимо использовать FASM. Почему я выбрал именно этот компилятор? По очень многим причинам.

Максимальный набор поддерживаемых команд. FASM поддерживает весь 
1. 

(или почти весь) набор команд x86-64.
Наличие Linux- и Windows-версий, а также поддержка широкого списка 
2. 

выходных файлов. Можно компилировать программы для Windows (формат PE) и для Linux (формат ELF).
Гибкий синтаксис и отсутствие совершенно бесполезных, но обязатель3. 

ных директив (например, .386, .486 и т. п.).
Полный контроль над размещением данных в исполняемом файле. 
4. 

Мощнейший макросный движок, с помощью которого можно создать прак5. 

тически любой макрос и изменить текст программы и сам язык до неузнаваемости.
При компиляции через командную строку нет необходимости указывать 
6. 

множество опций компиляции. Для того чтобы получить исполняемый 
файл нужного типа, достаточно задать все необходимые параметры в самом исходнике.
Windows-версия FASM поставляется вместе с IDE, благодаря которой мож7. 

но скомпилировать программу нажатием одной кнопки (или пункта меню).

Компилятор FASM можно найти на компакт-диске, прилагающемся к книге 

(папка fasm). Последнюю версию этого компилятора также можно бесплатно скачать на сайте flatassembler.net.


                                    
Доступ онлайн
439 ₽
В корзину