
Книга является практическим пособием по программной модели процессоров i80x86/64. Простейшие элементы этой модели (переменные, константы, методы адресации и система команд) изучаются с помощью ассемблера a86, отладчика d86. 32-битные возможности i80x86, включая защищенный режим, вентили, исключения и прерывания, привилегии, страничное преобразование, исключения, LDT и TSS, а также 64-битные режимы процессора x64 с исключениями и прерываниями в long mode изучаются с использованием ассемблера nasm.
Электронный архив на сайте издательства содержит исходные тексты примеров и необходимые для работы файлы.
Для программистов
Программирование на машинном уровне
- Ассемблеры a86/a386
- Netwide Assembler (nasm)
- Система команд i80x86/64
- 32-битный защищенный режим
- 64-битные режимы
Предисловие…………………………………………………………………………………………….. 9
Примечания………………………………………………………………………………………………………………………………… 11
Часть I. Реальный режим…………………………………………………………….. 13
Глава 1. Установка программ………………………………………………………………… 15
Установка и настройка Bochs…………………………………………………………………………………………………… 15
Формирование образа диска…………………………………………………………………………………………………….. 16
Настройка отладочного варианта Bochs………………………………………………………………………………… 18
Примечания………………………………………………………………………………………………………………………………… 18
Глава 2. Программирование данных……………………………………………………… 21
Вызов a86……………………………………………………………………………………………………………………………………. 21
Программирование последовательностей………………………………………………………………………………. 22
Программирование bmp-файла………………………………………………………………………………………………… 26
Примечания………………………………………………………………………………………………………………………………… 29
Глава 3. Данные, имена и типы……………………………………………………………… 31
Структура программы………………………………………………………………………………………………………………. 31
Директивы определения данных………………………………………………………………………………………………. 32
Обозначение чисел…………………………………………………………………………………………………………………….. 37
Символические обозначения чисел, выражения…………………………………………………………………….. 38
Переменные и метки…………………………………………………………………………………………………………………… 40
Типы имен…………………………………………………………………………………………………………………………………… 41
Типы и выражения……………………………………………………………………………………………………………………… 43
Алгоритм трансляции………………………………………………………………………………………………………………… 46
Повторное определение имен…………………………………………………………………………………………………… 50
Локальные имена……………………………………………………………………………………………………………………….. 51
Предопределенные имена…………………………………………………………………………………………………………. 52
Имя end……………………………………………………………………………………………………………………………………….. 52
Примечания………………………………………………………………………………………………………………………………… 54
Глава 4. Способы адресации………………………………………………………………….. 57
Данные процессора…………………………………………………………………………………………………………………… 57
Обозначения операндов машинных команд……………………………………………………………………………. 59
Способы адресации операндов………………………………………………………………………………………………… 60
Регистровая и непосредственная адресация……………………………………………………………………. 60
Адресация данных в памяти……………………………………………………………………………………………… 61
Прямая адресация…………………………………………………………………………………………………….. 61
Косвенная адресация……………………………………………………………………………………………….. 63
Ограничение на адресацию операндов в памяти……………………………………………………………. 67
Примечания………………………………………………………………………………………………………………………………… 68
Глава 5. Система команд i8086………………………………………………………………. 69
Способы адресации операндов………………………………………………………………………………………………… 69
Регистровая, непосредственная и прямая адресация……………………………………………………… 70
Косвенная адресация…………………………………………………………………………………………………………. 71
Косвенная адресация по значению одного регистра…………………………………………….. 71
Косвенная адресация по сумме значений двух регистров……………………………………. 71
Обзор системы команд………………………………………………………………………………………………………………. 71
Команды пересылки…………………………………………………………………………………………………………… 72
Арифметические команды…………………………………………………………………………………………………. 73
Логические команды………………………………………………………………………………………………………….. 74
Команды сдвигов и вращений…………………………………………………………………………………………… 74
Команды передачи управления………………………………………………………………………………………… 75
Адресация в командах передачи управления………………………………………………………… 76
Команды условных переходов………………………………………………………………………………… 77
Воздействие команд на флаги…………………………………………………………………………………………… 79
Строковые команды…………………………………………………………………………………………………………… 82
Примечания………………………………………………………………………………………………………………………………… 83
Глава 6. Программирование циклов………………………………………………………. 85
Поиск в массиве байтов…………………………………………………………………………………………………………….. 85
Поиск в массиве слов…………………………………………………………………………………………………………………. 87
Поиск байта со значением больше заданного………………………………………………………………………… 88
Подсчет байтов в заданном диапазоне значений…………………………………………………………………… 89
Алгоритмическое решение………………………………………………………………………………………………… 89
Табличное решение……………………………………………………………………………………………………………. 90
Примечания………………………………………………………………………………………………………………………………… 92
Глава 7. Примеры программ………………………………………………………………….. 93
Обработка данных на уровне битов………………………………………………………………………………………… 93
Программирование ввода-вывода……………………………………………………………………………………………. 95
Опережающие ссылки……………………………………………………………………………………………………….. 98
Упаковка четырехбитовых кодов…………………………………………………………………………………………… 100
Задания на составление программ………………………………………………………………………………………… 102
Задания первого уровня сложности……………………………………………………………………………….. 102
Варианты заданий………………………………………………………………………………………………….. 102
Задания второго уровня сложности……………………………………………………………………………….. 104
Примечания………………………………………………………………………………………………………………………………. 108
Глава 8. Математический сопроцессор…………………………………………………. 111
Окно FPU в d86…………………………………………………………………………………………………………………………. 111
Загрузка и выгрузка данных…………………………………………………………………………………………………… 112
Порядок двуместных операций………………………………………………………………………………………………. 114
Организация ветвлений…………………………………………………………………………………………………………… 117
Признаки в слове состояния……………………………………………………………………………………………………. 118
Настройки FPU…………………………………………………………………………………………………………………………. 120
Форматы действительных чисел……………………………………………………………………………………………. 121
Внутренний формат данных FPU……………………………………………………………………………………. 122
Стандартные форматы вещественных чисел………………………………………………………………… 124
Операции FPU…………………………………………………………………………………………………………………………… 125
Пересылки…………………………………………………………………………………………………………………………. 126
Загрузка данных……………………………………………………………………………………………………… 126
Команды выгрузки………………………………………………………………………………………………….. 128
Команда обмена……………………………………………………………………………………………………… 130
Арифметические операции……………………………………………………………………………………………… 130
Основные арифметические операции……………………………………………………………………. 131
Операции над знаковым битом……………………………………………………………………………… 132
Округление до целого…………………………………………………………………………………………….. 133
Получение остатка от деления………………………………………………………………………………. 134
Извлечение корня……………………………………………………………………………………………………. 135
Масштабирование………………………………………………………………………………………………….. 135
Операции сравнения и тестирования……………………………………………………………………. 135
Тригонометрические операции………………………………………………………………………………………. 137
Возведение в степень……………………………………………………………………………………………………….. 137
Возведение числа 2 в целую степень…………………………………………………………………….. 138
Возведение числа 2 в дробную степень………………………………………………………………… 138
Вычисление целой и дробной частей значения степени…………………………………….. 139
Возведение числа 2 в произвольную степень………………………………………………………. 139
Вычисление логарифмов………………………………………………………………………………………… 139
Команды управления………………………………………………………………………………………………………. 141
Сохранение и восстановление состояния……………………………………………………………………… 142
Задачи………………………………………………………………………………………………………………………………………. 143
Примечания………………………………………………………………………………………………………………………………. 145
Глава 9. Сегменты……………………………………………………………………………….. 149
Эффективный адрес…………………………………………………………………………………………………………………. 150
Базовый адрес и сегментные регистры………………………………………………………………………………….. 151
Перепрограммирование сегментных регистров……………………………………………………………………. 154
Регистр es………………………………………………………………………………………………………………………….. 154
Регистр ss…………………………………………………………………………………………………………………………… 156
Регистр cs………………………………………………………………………………………………………………………….. 157
Регистр ds………………………………………………………………………………………………………………………….. 159
Повторный запуск резидентной программы………………………………………………………………….. 160
Программные секции……………………………………………………………………………………………………….. 162
Префикс переназначения сегмента…………………………………………………………………………………. 167
Задачи………………………………………………………………………………………………………………………………………. 172
Примечания………………………………………………………………………………………………………………………………. 173
Глава 10. Исключения………………………………………………………………………….. 177
Таблица векторов…………………………………………………………………………………………………………………….. 177
Векторные вызовы…………………………………………………………………………………………………………………… 178
Исключения и прерывания……………………………………………………………………………………………………… 185
Ассемблер nasm……………………………………………………………………………………………………………………….. 189
Отладочные исключения………………………………………………………………………………………………………… 193
Примечания………………………………………………………………………………………………………………………………. 196
Глава 11. Внешние прерывания…………………………………………………………… 197
Системный таймер…………………………………………………………………………………………………………………… 197
Клавиатура………………………………………………………………………………………………………………………………. 201
Часы реального времени…………………………………………………………………………………………………………. 203
Примечания………………………………………………………………………………………………………………………………. 203
Глава 12. 32-битовые данные и адреса…………………………………………………. 205
Префиксы размерности операнда и адреса…………………………………………………………………………… 205
Косвенная адресация через 32-битовые регистры……………………………………………………….. 211
Новые команды………………………………………………………………………………………………………………… 213
Примечания………………………………………………………………………………………………………………………………. 215
Часть II. Защищенный режим………………………………………………….. 217
Глава 13. Код в защищенном режиме…………………………………………………… 219
Опыты с дескрипторами и защитой памяти………………………………………………………………………….. 225
Первые опыты с привилегиями……………………………………………………………………………………………….. 226
Переключение сегментов кода и вентили вызова…………………………………………………………………. 227
Обратное переключение режима……………………………………………………………………………………………. 231
Примечания………………………………………………………………………………………………………………………………. 232
Глава 14. Данные и стек………………………………………………………………………. 235
Дескрипторы данных………………………………………………………………………………………………………………. 235
Дескриптор стека…………………………………………………………………………………………………………………….. 238
Режим unreal…………………………………………………………………………………………………………………………….. 241
Адресная линия A20………………………………………………………………………………………………………………… 242
Привилегии сегментов данных……………………………………………………………………………………………….. 244
Примечания………………………………………………………………………………………………………………………………. 250
Глава 15. Исключения и прерывания…………………………………………………… 253
Дескрипторы прерываний и исключений………………………………………………………………………………. 253
Коды ошибок для исключений……………………………………………………………………………………………….. 258
Внешние прерывания………………………………………………………………………………………………………………. 259
Поле IOPL в регистре флагов………………………………………………………………………………………………….. 266
Примечания………………………………………………………………………………………………………………………………. 267
Глава 16. LDT и TSS…………………………………………………………………………….. 269
Дескрипторы LDT……………………………………………………………………………………………………………………. 269
Программное переключение контекста…………………………………………………………………………………. 272
Дескрипторы TSS…………………………………………………………………………………………………………………….. 276
Примечания………………………………………………………………………………………………………………………………. 285
Глава 17. Преобразование адресов……………………………………………………….. 287
Первый вариант трансляции адресов……………………………………………………………………………………. 288
Вариант PSE…………………………………………………………………………………………………………………………….. 292
Вариант PAE…………………………………………………………………………………………………………………………….. 295
Плоская модель памяти…………………………………………………………………………………………………………… 301
Примечания………………………………………………………………………………………………………………………………. 305
Глава 18. Привилегии………………………………………………………………………….. 307
Изменение уровня привилегий………………………………………………………………………………………………… 307
Вызов привилегированной процедуры………………………………………………………………………………….. 311
Обращение к портам ввода-вывода……………………………………………………………………………………….. 317
Привилегии при страничном отображении…………………………………………………………………………… 318
Примечания………………………………………………………………………………………………………………………………. 320
Часть III. 64-битовые режимы…………………………………………………… 321
Глава 19. Переход в режим совместимости…………………………………………… 323
Переход в режимы long…………………………………………………………………………………………………………… 323
Особенности режима совместимости…………………………………………………………………………………….. 328
Примечания………………………………………………………………………………………………………………………………. 330
Глава 20. Переход в 64-битовый режим………………………………………………… 331
Загрузчик ld0……………………………………………………………………………………………………………………………. 331
Применимость 64-битовых данных……………………………………………………………………………………….. 339
Примечания………………………………………………………………………………………………………………………………. 339
Глава 21. Особенности 64-битового режима…………………………………………. 341
64-битовые операнды……………………………………………………………………………………………………………… 342
Относительная адресация и перемещаемость………………………………………………………………………. 345
Селекторы fs и gs……………………………………………………………………………………………………………………… 349
Системные вызовы…………………………………………………………………………………………………………………… 352
Сегмент задачи в 64-битовом режиме……………………………………………………………………………………. 357
Обработка прерываний в 64-битовом режиме………………………………………………………………………. 359
Примечания………………………………………………………………………………………………………………………………. 370
Послесловие…………………………………………………………………………………………. 373
Приложения…………………………………………………………………………………… 375
Приложение 1. Компиляция Bochs……………………………………………………….. 377
Подготовка к компиляции для Windows и Linux……………………………………………………………………. 377
Компиляция для Windows……………………………………………………………………………………………………….. 378
Компиляция для Linux…………………………………………………………………………………………………………….. 379
Примечания………………………………………………………………………………………………………………………………. 380
Приложение 2. Инструментальные программы FreeDOS……………………… 381
Файловый менеджер………………………………………………………………………………………………………………… 381
Текстовый редактор edit………………………………………………………………………………………………………….. 382
Редактор памяти e32……………………………………………………………………………………………………………….. 382
Форматы отображения данных в d86……………………………………………………………………………………. 383
Приложение 3. Дополнительные опыты с FPU……………………………………… 384
Команда fisttp…………………………………………………………………………………………………………………………… 384
Формат BCD…………………………………………………………………………………………………………………………….. 385
Прерывания от i80x87……………………………………………………………………………………………………………… 385
Синхронизация процессора и сопроцессора………………………………………………………………………… 388
Расширение MMX……………………………………………………………………………………………………………………. 389
Примечания………………………………………………………………………………………………………………………………. 392
Приложение 4. Ошибки в a86/a386………………………………………………………. 393
Ошибки в a86……………………………………………………………………………………………………………………………. 393
Ошибки в a386………………………………………………………………………………………………………………………….. 394
Приложение 5. Описание электронного архива……………………………………. 395
Список источников………………………………………………………………………………. 397
Предметный указатель…………………………………………………………………………. 398
Жуков Андрей Владимирович, кандидат технических наук, преподаватель Санкт-Петербургского политехнического университета, программист в области автоматизации управления. Автор книги и практических курсов по ассемблерам, трансляторам, интерфейсам внешних устройств, микроконтроллерам, PLC и промышленным сетям.