Зубков С. В. Assembler^ ^^_ ^ш тят »* у \JM\\J О V_. U. дня DOS, Windows ilCTCUMIP УДК 004.438Assembler ББК 32.973.26-018.1 3-91 Зубков С. В. 3-91 Assembler для DOS, Windows и UNIX / Зубков Сергей Владимирович. - 3-е изд., стер. - М. : ДМК Пресс ; СПб. : Питер, 2004. - 608 с. : ил. - (Серия «Для программистов»). ISBN 5-94074-259-9 В книге освещаются все аспекты современного программирования на ассембле- ре для DOS, Windows 95/NT и UNIX (Solaris, Linux и FreeBSD), включая созда- ние резидентных программ и драйверов, прямое программирование периферий- ных устройств, управление защищенным режимом и многое другое. Детально рассматривается архитектура процессоров Intel вплоть до Pentium III. Все главы иллюстрируются подробными примерами работоспособных программ. Издание ориентировано как на профессионалов, так и на начинающих без опыта программирования. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разреше- ния владельцев авторских прав. Материал, изложенный в данной книге, многократно проверен. Но, поскольку вероятность на- личия технических и просто человеческих ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим изда- тельство не несет ответственности за возможные ошибки, связанные с использованием книги. © Зубков С. В., 2004 ISBN 5-94074-259-9 © ДМК Пресс, 2004 Зубков Сергей Владимирович Assembler для DOS, Windows и UNIX Главный редактор Захаров И. М. [email protected] Научный редактор Шалаев Н. В. Литературный редактор Космачева Н. А. Верстка А/щ-Заде В. X. Дизайн обложки Антонов А. И. Подписано в печать 12.11.2003. Формат 70хЮО'/ . 16 Гарнитура «Петербург». Печать офсетная. Усл. печ. л. 49,4. Тираж 3000 экз. Зак. № 3501 Издательство «ДМК Пресс», 105023, Москва, пл. Журавлева, 2/8 Web-сайт издательства: www.dmk.ru Internet-магазин: www.abook.ru, www.dmk.ru Ордена Трудового Красного Знамени ГУП Чеховский полиграфический комбинат Министерства Российской Федерации по делам печати, телерадиовещания и средств массовых коммуникаций 142300, г. Чехов Московской области Тел. (272) 71-336, факс (272) 62-536 Содержание Введение и Глава 1, Предварительные сведения 13 1.1. Что нужно для работы с ассемблером 13 1.2. Представление данных в компьютерах 14 1.2.1. Двоичная система счисления 14 1.2.2. Биты, байты и слова 15 1.2.3. Шестнадцатеричная система счисления 16 1.2.4. Числа со знаком 17 1.2.5. Логические операции 18 1.2.6. Коды символов 18 1.2.7. Организация памяти 19 Глава 2. Процессоры Intel в реальном режиме 20 2.1. Регистры процессора 20 2.1.1. Регистры общего назначения 20 2.1.2. Сегментные регистры 22 2.1.3. Стек 22 2.1.4. Регистр флагов 23 2.2. Способы адресации 24 2.2.1. Регистровая адресация 24 2.2.2. Непосредственная адресация 25 2.2.3. Прямая адресация 25 2.2.4. Косвенная адресация 25 2.2.5. Адресация по базе со сдвигом 26 2.2.6. Косвенная адресация с масштабированием 26 2.2.7. Адресация по базе с индексированием 27 2.2.8. Адресация по базе с индексированием и масштабированием 27 2.3. Основные непривилегированные команды 28 2.3.1. Пересылка данных 28 2.3.2. Двоичная арифметика 34 2.3.3. Десятичная арифметика 38 •ВЯШ Assembler для DOS, Windows и UNIX 2.3.4. Логические операции 41 2.3.5. Сдвиговые операции 43 2.3.6. Операции над битами и байтами 45 2.3.7. Команды передачи управления 47 2.3.8. Строковые операции 54 2.3.9. Управление флагами 57 2.3.10. Загрузка сегментных регистров 59 2.3.11. Другие команды 59 2.4. Числа с плавающей запятой 63 2.4.1. Типы данных FPU 63 2.4.2. Регистры FPU 65 2.4.3. Исключения FPU 67 2.4.4. Команды пересылки данных FPU 68 2.4.5. Базовая арифметика FPU 70 2.4.6. Команды сравнения FPU 74 2.4.7. Трансцендентные операции FPU 76 2.4.8. Константы FPU 78 2.4.9. Команды управления FPU 78 2.5. Расширение IAMMX 82 2.5.1. Регистры ММХ 82 2.5.2. Типы данных ММХ 83 2.5.3. Команды пересылки данных ММХ 83 2.5.4. Команды преобразования типов ММХ 84 2.5.5. Арифметические операции ММХ 85 2.5.6. Команды сравнения ММХ 88 2.5.7. Логические операции ММХ 88 2.5.8. Сдвиговые операции ММХ 89 2.5.9. Команды управления состоянием ММХ .'. 90 2.5.10. Расширение AMD 3D 90 2.6. Расширение SSE 91 2.6.1. Регистры SSE 91 2.6.2. Типы данных SSE 92 2.6.3. Команды SSE 92 2.6.4. Определение поддержки SSE 105 2.6.5. Исключения 105 Глава 3. Директивы и операторы ассемблера юе 3.1. Структура программы 106 3.2. Директивы распределения памяти 108 3.2.1. Псевдокоманды определения переменных 108 3.2.2. Структуры 109 Содержание . ^ 3.3. Организация программы 110 3.3.1. Сегменты 110 3.3.2. Модели памяти и упрощенные директивы определения сегментов 112 3.3.3. Порядок загрузки сегментов 114 3.3.4. Процедуры 115 3.3.5. Конец программы 115 3.3.6. Директивы задания набора допустимых команд 116 3.3.7. Директивы управления программным счетчиком 116 3.3.8. Глобальные объявления 117 3.3.9. Условное ассемблирование 118 3.4. Выражения 120 3.5. Макроопределения 121 3.5.1. Блоки повторений 123 3.5.2. Макрооператоры 124 3.5.3. Другие директивы, используемые в макроопределениях 124 3.6. Другие директивы 125 3.6.1. Управление файлами 125 3.6.2. Управление листингом : 125 3.6.3. Комментарии 126 Глава 4. Основы программирования для MS DOS 127 4.1. Программа типа COM 128 4.2. Программа типа EXE 130 4.3. Вывод на экран в текстовом режиме 131 4.3.1. Средства DOS 131 4.3.2. Средства BIOS 134 4.3.3. Прямая работас видеопамятью 139 4.4. Ввод с клавиатуры 140 4.4.1. Средства DOS 140 4.4.2. Средства BIOS 148 4.5. Графические видеорежимы 151 4.5.1. Работа с VGA-режимами 151 4.5.2. Работа с SVGA-режимами 155 4.6. Работас мышью 166 4.7. Другие устройства 171 4.7.1. Системный таймер 171 4.7.2. Последовательный порт 178 4.7.3. Параллельный порт 181 Assembler для DOS, Windows и UNIX 4.8. Работа с файлами 182 4.8.1. Создание и открытие файлов 183 4.8.2. Чтение и запись в файл 186 4.8.3. Закрытие и удаление файла 187 4.8.4. Поиск файлов 188 4.8.5. Управление файловой системой 192 4.9. Управление памятью 193 4.9.1. Обычная память : 193 4.9.2. Область памяти UMB 195 4.9.3. Область памяти НМД 195 4.9.4. Интерфейс EMS 196 4.9.5. Интерфейс XMS 197 4.10. Загрузка и выполнение программ 202 4.11. Командные параметры и переменные среды 208 Глава 5. Более сложные приемы программирования .. 212 5.1. Управляющие структуры 212 5.1.1. Структуры IF...THEN...ELSE 212 5.1.2. Структуры CASE 213 5.1.3. Конечные автоматы 214 5.1.4. Циклы 215 5.2. Процедуры и функции 216 5.2.1. Передача параметров 216 5.2.2. Локальные переменные 221 5.3. Вложенные процедуры 222 5.3.1. Вложенные процедуры со статическими ссылками 222 5.3.2. Вложенные процедуры с дисплеями 223 5.4. Целочисленная арифметика повышенной точности 224 5.4.1. Сложение и вычитание 225 5.4.2. Сравнение 225 5.4.3. Умножение 226 5.4.4. Деление 227 5.5. Вычисления с фиксированной запятой 228 5.5.1. Сложение и вычитание 228 5.5.2. Умножение 228 5.5.3. Деление 229 5.5.4. Трансцендентные функции 229 5.6. Вычисления с плавающей запятой 233 Содержание 5.7. Популярные алгоритмы 238 5.7.1. Генераторы случайных чисел 238 5.7.2. Сортировки 242 5.8. Перехват прерываний 245 5.8.1. Обработчики прерываний 246 5.8.2. Прерывания от внешних устройств 249 5.8.3. Повторная входимость 253 5.9. Резидентные программы 256 5.9.1. Пассивная резидентная программа 256 5.9.2. Мультиплексорное прерывание 262 5.9.3. Выгрузка резидентной программы из памяти 276 5.9.4. Полурезидентные программы 292 5.9.5. Взаимодействие между процессами 297 5.10. Программирование на уровне портов ввода-вывода ....305 5.10.1. Клавиатура 305 5.10.2. Последовательный порт 309 5.10.3. Параллельный порт 315 5.10.4. Видеоадаптеры VGA 316 5.10.5. Таймер 331 5.10.6. Динамик 335 5.10.7. Часы реального времени и CMOS-память 336 5.10.8. Звуковые платы 339 5.10.9. Контроллер DMA 359 5.10.10. Контроллер прерываний 366 5.10.11. Джойстик 371 5.11. Драйверы устройств в DOS 374 5.11.1. Символьные устройства 375 5.11.2. Блочные устройства 384 Глава 6. Программирование в защищенном режиме ... 388 6.1. Адресация в защищенном режиме 388 6.2. Интерфейс VCPI 391 6.3. Интерфейс DPMI 394 6.3.1. Переключение в защищенный режим 394 6.3.2. Функции DPMI управления дескрипторами 395 6.3.3. Передача управления между режимами в DPMI 396 6.3.4. Обработчики прерываний 398 6.3.5. Пример программы 399 И . Assembler для DOS, Windows и UNIX 6.4. Расширители DOS 403 6.4.1. Способы объединения программы с расширителем 403 6.4.2. Управление памятью в DPMI 405 6.4.3. Вывод на экран через линейный кадровый б^фер 406 Глава 7. Программирование для Windows 95/NT 413 7.1. Первая программа 413 7.2. Консольные приложения 416 7.3. Графические приложения 421 7.3.1. Окно типа MessageBox 421 7.3.2. Окна 422 7.3.3. Меню 427 7.3.4. Диалоги 431 7.3.5. Полноценное приложение 436 7.4. Динамические библиотеки 451 7.5. Драйверы устройств 457 Глава 8. Ассемблер и языки высокого уровня 460 8.1. Передача параметров 460 8.1.1. Конвенция Pascal 460 8.1.2. Конвенция С 461 8.1.3. Смешанные конвенции 463 8.2. Искажение имен 463 8.3. Встроенный ассемблер 463 8.3.1. Ассемблер, встроенный в Pascal..... 464 8.3.2. Ассемблер, встроенный в С 464 Глава 9. Оптимизация 465 9.1. Высокоуровневая оптимизация 465 9.2. Оптимизация на среднем уровне 465 9.2.1. Вычисление констант вне цикла 466 9.2.2. Перенос проверки условия в конец цикла 466 9.2.3. Выполнение цикла задом наперед 466 9.2.4. Разворачивание циклов 467 9.3. Низкоуровневая оптимизация 468 9.3.1. Общие принципы низкоуровневой оптимизации 468 9.3.2. Особенности архитектуры процессоров Pentium и Pentium MMX 471 9.3.3. Особенности архитектуры процессоров Pentium Pro и Pentium II 472 Содержание Глава 10. Процессоры Intel в защищенном режиме ... 476 10.1. Регистры 476 10.1.1. Системные флаги 476 10.1.2. Регистры управления памятью 477 10.1.3. Регистры управления процессором 478 10.1.4. Отладочные регистры 480 10.1.5. Машинно-специфичные регистры 481 10.2. Системные и привилегированные команды 482 10.3. Вход и выход из защищенного режима 488 10.4. Сегментная адресация 490 10.4.1. Модель памяти в защищенном режиме 490 10.4.2. Селектор 491 10.4.3. Дескрипторы 491 10.4.4. Пример программы 493 10.4.5. Нереальный режим ....: 497 10.5. Обработка прерываний и исключений 499 10.6. Страничная адресация 509 10.7. Механизм защиты 516 10.7.1. Проверка лимитов 516 10.7.2. Проверка типа сегмента 517 10.7.3. Проверка привилегий 517 10.7.4. Выполнение привилегированных команд 518 10.7.5. Защита на уровне страниц 519 10.8. Управление задачами 519 10.8.1. Сегмент состояния задачи 519 10.8.2. Переключение задач 521 10.9. Режим виртуального 8086 527 10.9.1. Прерывания в V86 527 10.9.2. Ввод-вывод в V86 528 Глава 11. Программирование на ассемблере в среде UNIX 529 11.1. Синтаксис AT&T 530 11.1.1. Основные правила 530 11.1.2. Запись команд 531 11.1.3. Адресация 532 11.2. Операторы ассемблера 533 11.2.1. Префиксные, или унарные, операторы 533 11.2.2. Инфиксные, или бинарные, операторы 533 Assembler для DOS, Windows и UNIX 11.3. Директивы ассемблера 534 11.3.1. Директивы определения данных 534 11.3.2. Директивы управления символами 535 11.3.3. Директивы определения секций 535 11.3.4. Директивы управления разрядностью 536 11.3.5. Директивы управления программным указателем 536 11.3.6. Директивы управления листингом г. 536 11.3.7. Директивы управления ассемблированием 537 11.3.8. Блоки повторения 537 11.3.9. Макроопределения 538 11.4. Программирование с использованием libc 538 11.5. Программирование без использования libc 540 11.6. Переносимая программа для UNIX 543 Заключение 558 Приложение 1. Таблицы символов 559 1. Символы ASCII 559 2. Управляющие символы ASCII 560 3. Кодировки второй половины ASCII 561 4. Коды символов расширенного ASCII 564 s 5. Скан-коды клавиатуры 565 Приложение 2. Команды Intel 80x86 567 1. Общая информация о кодах команд 567 1.1. Общий формат команды процессора Intel 567 1.2. Значения полей кода команды 567 1.3. Значения поля ModRM 568 1.4. Значения поля SIB : 569 2. Общая информация о скоростях выполнения 570 3. Префиксы 571 4. Команды процессоров Intel 8088 - Pentium III 572 Используемые сокращения 595 ГлОССарИЙ 599 Алфавитный указатель 602