Опубликовано

Встречайте: “Ассемблер и программная модель процессоров x86/64”

Ассемблер и программная модель процессоров x86/64

Книга является практическим пособием по программной модели процессоров i80x86/64. Простейшие элементы этой модели (переменные, константы, методы адресации и система команд) изучаются с помощью ассемблера a86, отладчика d86. 32-битные возможности i80x86, включая защищенный режим, вентили, исключения и прерывания, привилегии, страничное преобразование, исключения, LDT и TSS, а также 64-битные режимы процессора x64 с исключениями и прерываниями в long mode изучаются с использованием ассемблера nasm.

Электронный архив на сайте издательства содержит исходные тексты примеров и необходимые для работы файлы.

Для программистов

Программирование на машинном уровне

  • Ассемблеры a86/a386
  • Netwide Assembler (nasm)
  • Система команд i80x86/64
  • 32-битный защищенный режим
  • 64-битные режимы

Книгу “Ассемблер и программная модель процессоров x86/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 и промышленным сетям.