Предисловие к 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