Искусство программирования на Ассемблере. - 3-е издание, переработанное и дополненное

Предисловие к 3-ему изданию ................ 10

Введение ......................... 12

Часть I. Лекции ............... 17

Глава 1. Позиционные системы счисления ................ 18

1.1. Десятичная система счисления (Decimal)............ 19

1.2. Двоичная система счисления (Binary)................. 20

1.2.1. Перевод целых десятичных чисел в двоичную систему счисления......... 20

1.2.2. Перевод правильных десятичных дробей в двоичную систему счисления........ 21

1.2.3. Перевод смешанных десятичных чисел в двоичную систему счисления...... 22

1.2.4. Перевод двоичных чисел в десятичную систему счисления........ 23

1.3. Шестнадцатеричная система счисления (Hexadecimal)......... 23

1.3.1. Перевод десятичных чисел в шестнадцатеричную систему счисления......... 23

1.3.2. Перевод целых шестнадцатеричных чисел в десятичную
систему счисления .................. 25

1.3.3. Биты, байты, полубайты, слова и двойные слова.............. 26

1.4. Восьмеричная система счисления (Octal)............ 27

Глава 2. Формат представления базовых данных в IBM PC .......... 28

2.1. Символы ..................... 29

2.2. Целые числа....................... 29

2.2.1. Целые числа без знака............... 30

2.2.2. Целые числа со знаком.................... 31

2.3. Вещественные числа..................... 34

2.3.1. Представление вещественных чисел в двоичном нормализованном виде ... 34

2.3.2. Машинные форматы вещественных чисел............ 35

2.4. Простейшая программа описания данных на языке Ассемблера IBM PC для MS DOS.. 40

2.4.1. Формат директив и машинных команд............. 40

2.4.2. Директивы инициализации и описания данных на языке Ассемблера..... 41

2.4.3. Общая структура программы на Ассемблере в MS DOS........... 43

2.4.4. Структура lst-файла в TASM.............. 44

2.4.5. Пример программы на языке Ассемблера для проверки внутреннего
представления данных................... 45

Глава 3. Архитектура IBM PC ................. 49

3.1. Семейство IBM PC ...................... 49

3.2. Основные блоки IBM PC................... 56

3.3. Регистры IBM PC XT.................. 56

3.3.1. Регистры общего назначения ............... 57

3.3.2. Сегментные регистры ............... 58

3.3.3. Регистр указателя команд .............. 58

3.3.4. Регистр флагов ................... 58

3.3.5. Регистр указателя стека ................. 59

3.3.6. Регистры индексов ................... 60

3.3.7. Регистр базового указателя.................. 60

3.4. Оперативная память и операционные системы IBM PC............ 60

3.4.1. Сегментная организация памяти................. 60

3.4.2. Модели памяти.................... 62

3.4.3. Формирование исполнительного адреса в реальном режиме...... 63

Глава 4. Основные директивы IBM PC ................. 65

4.1. Преимущества и недостатки изучения языка Ассемблера с использованием известных
алгоритмических языков Pascal и C/C++............. 65

4.2. Разница между директивами и командами Ассемблера............. 66

4.3. Описание сегмента — директива SEGMENT........... 67

4.4. Директива группирования сегментов Group........... 69

4.5. Директива Assume.................. 69

4.6. Стандартные модели памяти.................... 70

4.6.1. Директива MODEL .................. 70

4.6.2. Директивы упрощенного описания сегментов............ 71

4.7. Описание процедур ..................... 71

4.8. Описание внешних ссылок.................. 71

4.8.1. Директива описания общих имен PUBLIC ........... 71

4.8.2. Директива описания внешних имен EXTRN............... 72

Глава 5. Основные команды целочисленной арифметики IBM PC XT/AT ....... 74

5.1. Команды пересылки и обмена информацией............ 74

5.1.1. Команда пересылки MOV .............. 75

5.1.2. Команда обмена данными XCHG .............. 81

5.1.3. Команда загрузки адреса LEA .................. 82

5.1.4. Команды работы со стеком .................. 83

5.1.5. Команды загрузки полного указателя LDS, LES и LSS ........ 84

5.1.6. Команды пересылки флагов LAHF и SAHF............... 85

5.2. Арифметические команды ................. 85

5.2.1. Команды сложения.................... 85

5.2.2. Команды вычитания SUB, SBB, DEC, NEG и CMP............. 100

5.2.3. Команды умножения MUL и IMUL.............. 101

5.2.4. Команды деления DIV и IDIV............. 104

5.2.5. Команды распространения знака CBW и CWD.............. 107

Глава 6. Ассемблер и языки высокого уровня ............... 112

6.1. Соглашения по интерфейсу .................. 113

6.1.1. Borland/Turbo Pascal — 7.0x и Turbo Assembler ............ 113

6.1.2. Borland C++ и Turbo Assembler................ 116

6.2. Встроенный Ассемблер ................... 142

6.2.1. Ассемблер, встроенный в программу на языке Pascal ........ 142

6.2.2. Ассемблер, встроенный в программу на языке C/C++........ 144

6.3. Введение в отладку программ............... 147

6.3.1. Категории ошибок в программах............. 148

6.3.2. Процесс отладки................ 149

6.3.3. Краткий обзор интегрированных отладчиков.......... 155

Глава 7. Основные команды работы с битами для IBM PC XT ........ 157

7.1. Логические команды................... 157

7.1.1. Использование команд логического умножения AND и TEST ...... 159

7.1.2. Использование команды логического сложения OR ........... 163

7.1.3. Использование команды сложения по модулю 2 — XOR ........ 163

7.1.4. Команда логического отрицания NOT ............... 163

7.2. Команды сдвига..................... 168

7.2.1. Команды арифметического сдвига SAL и SAR .............. 168

7.2.2. Команды логического сдвига SHL и SHR ........... 173

7.2.3. Команды циклического сдвига ROL, ROR, RCL и RCR............ 175

Глава 8. Введение в машинные коды IBM PC XT/AT ............. 177

8.1. Формат команды процессоров i8086/i8088/i286 .......... 177

8.1.1. Байт кода операции.................. 178

8.1.2. Байт способа адресации................. 180

8.2. Простейшие примеры ассемблирования................. 181

Глава 9. Команды передачи управления для IBM PC XT/AT ...... 187

9.1. Команды безусловной передачи управления............... 187

9.1.1. Команда безусловного перехода JMP........... 187

9.1.2. Работа с процедурами в Ассемблере............. 192

9.2. Команды условной передачи управления Jcc.............. 205

9.3. Команды управления циклами LOOPx............. 208

9.3.1. Команда LOOP — переход по счетчику.............. 208

9.3.2. Команда LOOPE (LOOPZ) переход по счетчику и если равно....... 210

9.3.3. Команда LOOPNE (LOOPNZ) переход по счетчику и если НЕ равно ...... 210

9.4. Основные принципы организации и обработки массивов ............ 214

9.4.1. Одномерные массивы.................... 214

9.4.2. Двумерные массивы ............... 219

9.5. Вызов Pascal-процедуры из модуля на Ассемблере......... 221

9.6. Вызов Cpp-функции из модуля на Ассемблере.......... 223

Глава 10. Команды управления состоянием микропроцессора i8086 ......... 229

10.1. Команды управления флагами .................. 229

10.2. Команды внешней синхронизации............. 230

Глава 11. Основные команды обработки строк для IBM PC XT/AT ...... 231

11.1. Общие положения по обработке строк в Ассемблере........... 232

11.2. Особенности обработки Ассемблером строк Borland Pascal....... 233

Глава 12. Основные особенности процессоров i386, i486, Pentium ....... 241

12.1. Директивы текущего типа (со)процессора ................ 242

12.2. Основные отличия архитектуры процессоров i386/i486/Pentium от i8086........ 243

12.2.1. Основные регистры процессора............ 243

12.2.2. Логический адрес. Формирование эффективного адреса........ 248

12.2.3. Формат команды процессоров Intel 80x86.............. 249

12.2.4. Режимы адресации ................ 252

12.2.5. Дополнительные типы данных ............... 253

12.2.6. Организация оперативной памяти и адресного пространства ...... 254

12.2.7. Прерывания и особые ситуации............. 254

12.3. Режимы работы................... 256

12.3.1. Реальный режим.................... 256

12.3.2. Защищенный режим .................... 257

12.3.3. Виртуальный режим V86.................. 258

12.4. Дополнительные команды ................... 259

12.4.1. Команды пересылки MOVSX и MOVZX .............. 259

12.4.2. Команды работы со стеком PUSHAD, POPAD, PUSHFD и POPFD....... 259

12.4.3. Команды распространения знака CDQ и CWDE.......... 260

12.4.4. Команда целочисленного умножения со знаком IMUL............ 260

12.4.5. Команды обработки строк MOVSD, CMPSD, SCASD, LODSD, STOSD...... 260

12.4.6. Команда идентификации процессора CPUid........... 261

12.4.7. Команда установки кадра стека ENTER............ 267

12.4.8. Команда выхода из процедуры LEAVE............. 267

12.5. Особенности программирования в 32-х разрядном коде............ 267

12.5.1. Пример реализации Borland (Turbo) Pascal-7.0х + Turbo Assembler 3.2........ 268

12.5.2. Пример реализации Borland Delphi-5.0 (6.0,7.0) + Turbo Assembler 5.х........ 270

12.5.3. Пример реализации Borland C++ Builder-5.0 (6.0) + Turbo Assembler 5.х..... 273

12.5.4. Особенности реализации Microsoft Visual C++ 6.0 (7.0) +
Macro Assembler 6.x (7.x).................. 277

12.6. Примеры ассемблирования ................. 287

Глава 13. Математический сопроцессор .............. 295

13.1. Типы данных ....................... 295

13.1.1. Обычные данные.................... 296

13.1.2. Особые числа................... 296

13.2. Регистры........................ 297

13.2.1. Регистры данных ................... 298

13.2.2. Регистр состояния сопроцессора................. 298

13.2.3. Регистр управления ................... 300

13.2.4. Регистр тегов................... 300

13.3. Ситуации—исключения................. 302

13.4. Система команд................... 303

13.4.1. Условные обозначения для команд базового сопроцессора.......... 303

13.4.2. Команды пересылки данных............. 304

13.4.3. Команды загрузки констант .................. 308

13.4.4. Арифметические команды ............... 308

13.4.5. Трансцендентные операции.............. 309

13.4.6. Команды сравнения............... 311

13.4.7. Команды управления сопроцессором................ 313

13.5. Основные особенности программирования................ 314

13.5.1. Допустимые операнды................ 314

13.5.2. Форматы основных арифметических команд........... 314

13.5.3. Организация разветвлений............... 323

13.6. Машинные форматы команд сопроцессора................ 333

Глава 14. Основы организации ввода-вывода информации ........ 341

14.1. Исполняемые программы в MS DOS.............. 342

14.1.1. Характеристика COM-файла................. 343

14.1.2. Характеристика EXE-файла............. 345

14.2. Команды обработки прерывания INTx................. 346

14.3. Основные функции сервисного прерывания MS DOS 21h........ 348

14.3.1. Вывод информации на дисплей.............. 348

14.3.2. Ввод информации с клавиатуры............ 354

14.4. Основные функции работы с экраном. Прерывание BIOS 10h........ 370

14.4.1. Установка и запрос видеорежима ............... 370

14.4.2. Управление размером и положением курсора ............ 371

14.4.3. Вывод символов на экран в текстовом режиме ........... 372

14.4.4. Очистка и прокрутка экрана.................. 373

14.4.5. Вывод строки символов.............. 374

14.5. Ввод с клавиатуры. Прерывание BIOS 16h............... 378

14.5.1. Чтение символа БЕЗ эхо-сопровождения........... 378

14.5.2. Определение наличия введенного символа............. 379

14.5.3. Запись символа в буфер клавиатуры................ 379

14.5.4. Определение текущего состояния клавиатуры............ 379

14.6. Введение в программирование на уровне портов ввода-вывода........... 380

14.6.1. Команды чтения операндов из порта INx.......... 380

14.6.2. Команды записи операндов в порт OUTx............... 381

14.6.3. Контроллер клавиатуры................... 382

Глава 15. Макросредства языка Ассемблера IBM PC ........ 386

15.1. Основные понятия. Макроопределение и макрокоманда........... 387

15.2. Макрорасширение.................... 392

15.3. Директивы макроассемблера............... 393

15.3.1. Директивы управления листингом ............. 393

15.3.2. Директива LOCAL................ 394

15.3.3. Основные макрооператоры.............. 394

15.3.4. Директивы повторения REPT, IRP и IRPC............. 395

15.3.5. Директива выхода EXITM .............. 399

15.3.6. Директивы условного ассемблирования........... 399

15.3.7. Многострочные комментарии................ 402

15.3.8. Директивы подключения файлов................. 402

15.4. Создание библиотеки макросов................. 402

15.5. Программа тестирования клавиатуры............ 405

Глава 16. Основы программирования Windows-приложений на Ассемблере ....... 410

16.1. Современные Windows-платформы................ 411

16.2. Типы данных.................. 412

16.3. Соглашения об именах ................... 414

16.4. Венгерская нотация.................. 415

16.5. Получение EXE-файла................... 416

16.6. Оконное приложение ..................... 418

16.6.1. Основные определения............... 418

16.6.2. Основы организации пользовательского интерфейса........ 420

16.6.3. Минимальная Windows-программа............. 422

16.6.4. Базовая структура модуля на Ассемблере............. 428

16.7. Консольное приложение................. 431

Глава 17. Основные особенности команд мультимедийного расширения MMX
для процессоров Intel Pentium
.............. 434

17.1. Регистры MMX ................. 436

17.2. Типы данных MMX ................. 436

17.3. Особенности выполнения MMX-команд ............. 437

17.3.1. Определение поддержки MMX-команд............ 438

17.3.2. Арифметика с насыщением............... 438

17.3.3. Исключительные ситуации............... 439

17.3.4. Влияние префиксов на выполнение команд MMX............ 439

17.4. Система команд MMX................... 439

17.4.1. Очистка состояния MMX................. 439

17.4.2. Команды пересылки данных............. 439

17.4.3. Использование визуального отладчика Microsoft Visual C++ 6.0...... 442

17.4.4. Команды преобразования типов данных MMX........... 447

17.4.5. Арифметические команды................ 452

17.4.6. Команды сравнения............... 474

17.4.7. Побитовые логические операции................. 475

17.4.8. Операции сдвига.................... 475

17.4.9. Команда перераспределения упакованных данных ............ 480

17.4.10. Команды извлечения и вставки слов................ 484

17.5. Пример получения искаженного изображения.......... 484

Глава 18. Основные особенности XMM-команд для процессоров Intel Pentium .. 490

18.1. Регистры XMM.................. 492

18.2. Определение поддержки расширений SSE/SSE2/SSE3........... 494

18.3. Типы XMM-данных................. 505

18.4. Особенности выполнения XMM-команд.............. 507

18.4.1. Исключительные ситуации............... 508

18.4.2. Влияние префиксов на выполнение XMM-команд............ 508

18.5. Расширение SSE.................. 508

18.5.1. Команды пересылки данных............. 509

18.5.2. Арифметические команды................ 510

18.5.3. Команды вычисления арифметических функций.......... 512

18.5.4. Команды сравнения............... 518

18.5.5. Команды преобразования типов............ 520

18.5.6. Побитовые логические операции................. 529

18.5.7. Команды "перемешивания" данных ............. 530

18.5.8. Команды управления состоянием................ 536

18.6. Расширение SSE2...................... 536

18.6.1. Команды пересылки данных............. 537

18.6.2. Арифметические команды................ 537

18.6.3. Команды вычисления арифметических функций.......... 538

18.6.4. Команды сравнения............... 538

18.6.5. Побитовые логические операции................. 538

18.6.6. Команды "перемешивания" данных ............. 538

18.6.7. Команды преобразования типов............ 539

18.6.8. Команды управления ................. 543

18.6.9. Целочисленные SIMD-команды............. 544

18.7. Расширение SSE3...................... 558

18.7.1. Преобразование FPU-чисел с плавающей точкой в целые числа........ 558

18.7.2. Дублирование вещественных упакованных данных........... 559

18.7.3. Загрузка невыравненных переменных............... 560

18.7.4. Одновременное сложение/вычитание........... 560

18.7.5. Горизонтальное сложение/вычитание................ 561

18.7.6. Синхронизация потоков.............. 562

Часть II. Лабораторный практикум .......... 563

Лабораторная работа № 1. Внутреннее представление целочисленных данных
в IBM PC
....................... 564

Лабораторная работа № 2. Внутреннее представление вещественных данных
в IBM PC
....................... 569

Лабораторная работа № 3. Вычисление целочисленных арифметических
выражений (процессор i8086/i286)
................. 577

Лабораторная работа № 4. Организация условных переходов
(процессор i8086/i286)
................ 603

Лабораторная работа № 5. Организация циклов и работа с целочисленными
одномерными массивами (процессор i8086/i286)
........ 642

Лабораторная работа № 6. Использование цепочечных команд — команд
обработки строк (процессор i8086/i286)
............... 656

Лабораторная работа № 7. Особенности 32-разрядного программирования
(процессор i386/i486/Pentium)
.............. 662

Лабораторная работа № 8. Вычисление арифметических выражений
и трансцендентных функций (сопроцессор ix87)
 .......... 688

Лабораторная работа № 9. Организация условных переходов, циклов и работа
с массивами (сопроцессор ix87)
................. 708

Лабораторная работа № 10. Организация ввода-вывода целочисленной
и текстовой информации
.................. 728

Приложения ....................... 765

Приложение 1. Системы счисления ................... 765

Приложение 2. Кодировка символов................. 768

Приложение 3. Расширенные ASCII-коды.............. 771

Приложение 4. Базовые арифметические типы данных ........... 773

П4.1. Типы данных для С/С++............... 773

П4.2. Типы данных для Borland Pascal и Object Pascal (Delphi-5)....... 775

Приложение 5. Эквивалентные директивы в режимах MASM  и Ideal.......... 776

Приложение 6. Общая схема распределения памяти в MS DOS......... 777

Приложение 7. Коды операций команд Ассемблера для  процессоров iX86....... 778

Приложение 8. Стандартные преобразования арифметических типов данных ......... 780

Приложение 9. Коды операций команд сопроцессора.............. 782

Список использованной и рекомендуемой литературы ........... 788

Глоссарий ..................... 794

Предметный указатель ..................... 814

 

В книге дано описание следующих элементов языка Ассемблера процессоров Intel x86: системы счисления, внутреннее представление данных и команд, основы 16- и 32-разрядного программирования, программирование сопроцессора, ввод-вывод информации в DOS и Windows, использование макросредств, потоковых мультимедийных MMX- и XMM-команд (расширения SSE/SSE2/SSE3). Подробно, шаг за шагом на многочисленных примерах законченных программ рассматриваются идеи и принципы организации вычислений на Ассемблере от простого к сложному, с использованием аналогии и прямой поддержки со стороны алгоритмических языков Pascal (Borland Pascal-7.x, Borland Delphi-5.0/6.0/7.0) или С/С++ (Borland C++ 3.1/4.5/5.02, Borland C++ Builder 5.0/6.0, Microsoft Visual C++ 6.0, Microsoft Visual Studio.NET 2002/2003). Для разработчиков разнообразного программного обеспечения, желающих повысить качество, надежность и эффективность своих программ, преподавателей и студентов, профессионально изучающих программирование, а также для всех желающих познакомиться с нижним уровнем программирования процессоров Intel x86.