Система Orphus

Искусство программирования на Ассемблере

Автор: Н. Голубь
Издательство: Питер, 2006
832 страницы

Материал предоставил: Издательство ''Питер''
Найти в магазинах
Купить в Books.Ru
Купить в издательстве "Питер"

Аннотация

Содержание

Аннотация

В книге дано описание следующих элементов языка Ассемблера процессоров 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.

Содержание

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

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

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

1.1. Десятичная система счисления (Decimal)
1.2. Двоичная система счисления (Binary)
1.2.1. Перевод целых десятичных чисел в двоичную систему счисления
1.2.2. Перевод правильных десятичных дробей в двоичную систему счисления
1.2.3. Перевод смешанных десятичных чисел в двоичную систему счисления
1.2.4. Перевод двоичных чисел в десятичную систему счисления
1.3. Шестнадцатеричная система счисления (Hexadecimal)
1.3.1. Перевод десятичных чисел в шестнадцатеричную систему счисления
1.3.2. Перевод целых шестнадцатеричных чисел в десятичную систему счисления
1.3.3. Биты, байты, полубайты, слова и двойные слова
1.4. Восьмеричная система счисления (Octal)

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

2.1. Символы
2.2. Целые числа
2.2.1. Целые числа без знака
2.2.2. Целые числа со знаком
2.3. Вещественные числа
2.3.1. Представление вещественных чисел в двоичном нормализованном виде
2.3.2. Машинные форматы вещественных чисел
2.4. Простейшая программа описания данных на языке Ассемблера IBM PC для MS DOS
2.4.1. Формат директив и машинных команд
2.4.2. Директивы инициализации и описания данных на языке Ассемблера
2.4.3. Общая структура программы на Ассемблере в MS DOS
2.4.4. Структура lst-файла в TASM
2.4.5. Пример программы на языке Ассемблера для проверки внутреннего представления данных

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

3.1. Семейство IBM PC
3.2. Основные блоки IBM PC
3.3. Регистры IBM PC XT
3.3.1. Регистры общего назначения
3.3.2. Сегментные регистры
3.3.3. Регистр указателя команд
3.3.4. Регистр флагов
3.3.5. Регистр указателя стека
3.3.6. Регистры индексов
3.3.7. Регистр базового указателя
3.4. Оперативная память и операционные системы IBM PC
3.4.1. Сегментная организация памяти
3.4.2. Модели памяти
3.4.3. Формирование исполнительного адреса в реальном режиме

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

4.1. Преимущества и недостатки изучения языка Ассемблера с использованием известных алгоритмических языков Pascal и C/C++
4.2. Разница между директивами и командами Ассемблера
4.3. Описание сегмента - директива SEGMENT
4.4. Директива группирования сегментов Group
4.5. Директива Assume
4.6. Стандартные модели памяти
4.6.1. Директива MODEL
4.6.2. Директивы упрощенного описания сегментов
4.7. Описание процедур
4.8. Описание внешних ссылок
4.8.1. Директива описания общих имен PUBLIC
4.8.2. Директива описания внешних имен EXTRN

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

5.1. Команды пересылки и обмена информацией
5.1.1. Команда пересылки MOV
5.1.2. Команда обмена данными XCHG
5.1.3. Команда загрузки адреса LEA
5.1.4. Команды работы со стеком
5.1.5. Команды загрузки полного указателя LDS, LES и LSS
5.1.6. Команды пересылки флагов LAHF и SAHF
5.2. Арифметические команды
5.2.1. Команды сложения
5.2.2. Команды вычитания SUB, SBB, DEC, NEG и CMP
5.2.3. Команды умножения MUL и IMUL
5.2.4. Команды деления DIV и IDIV
5.2.5. Команды распространения знака CBW и CWD

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

6.1. Соглашения по интерфейсу
6.1.1. Borland/Turbo Pascal - 7.0x и Turbo Assembler
6.1.2. Borland C++ и Turbo Assembler
6.2. Встроенный Ассемблер
6.2.1. Ассемблер, встроенный в программу на языке Pascal
6.2.2. Ассемблер, встроенный в программу на языке C/C++
6.3. Введение в отладку программ
6.3.1. Категории ошибок в программах
6.3.2. Процесс отладки
6.3.3. Краткий обзор интегрированных отладчиков

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

7.1. Логические команды
7.1.1. Использование команд логического умножения AND и TEST
7.1.2. Использование команды логического сложения OR
7.1.3. Использование команды сложения по модулю 2 - XOR
7.1.4. Команда логического отрицания NOT
7.2. Команды сдвига
7.2.1. Команды арифметического сдвига SAL и SAR
7.2.2. Команды логического сдвига SHL и SHR
7.2.3. Команды циклического сдвига ROL, ROR, RCL и RCR

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

8.1. Формат команды процессоров i8086/i8088/i286
8.1.1. Байт кода операции
8.1.2. Байт способа адресации
8.2. Простейшие примеры ассемблирования

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

9.1. Команды безусловной передачи управления
9.1.1. Команда безусловного перехода JMP
9.1.2. Работа с процедурами в Ассемблере
9.2. Команды условной передачи управления Jcc
9.3. Команды управления циклами LOOPx
9.3.1. Команда LOOP - переход по счетчику
9.3.2. Команда LOOPE (LOOPZ) переход по счетчику и если равно
9.3.3. Команда LOOPNE (LOOPNZ) переход по счетчику и если НЕ равно
9.4. Основные принципы организации и обработки массивов
9.4.1. Одномерные массивы
9.4.2. Двумерные массивы
9.5. Вызов Pascal-процедуры из модуля на Ассемблере
9.6. Вызов Cpp-функции из модуля на Ассемблере

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

10.1. Команды управления флагами
10.2. Команды внешней синхронизации

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

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


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

12.1. Директивы текущего типа (со)процессора
12.2. Основные отличия архитектуры процессоров i386/i486/Pentium от i8086
12.2.1. Основные регистры процессора
12.2.2. Логический адрес. Формирование эффективного адреса
12.2.3. Формат команды процессоров Intel 80x86
12.2.4. Режимы адресации
12.2.5. Дополнительные типы данных
12.2.6. Организация оперативной памяти и адресного пространства
12.2.7. Прерывания и особые ситуации
12.3. Режимы работы
12.3.1. Реальный режим
12.3.2. Защищенный режим
12.3.3. Виртуальный режим V86
12.4. Дополнительные команды
12.4.1. Команды пересылки MOVSX и MOVZX
12.4.2. Команды работы со стеком PUSHAD, POPAD, PUSHFD и POPFD
12.4.3. Команды распространения знака CDQ и CWDE
12.4.4. Команда целочисленного умножения со знаком IMUL
12.4.5. Команды обработки строк MOVSD, CMPSD, SCASD, LODSD, STOSD
12.4.6. Команда идентификации процессора CPUid
12.4.7. Команда установки кадра стека ENTER
12.4.8. Команда выхода из процедуры LEAVE
12.5. Особенности программирования в 32-х разрядном коде
12.5.1. Пример реализации Borland (Turbo) Pascal-7.0х + Turbo Assembler 3.2
12.5.2. Пример реализации Borland Delphi-5.0 (6.0,7.0) + Turbo Assembler 5.х
12.5.3. Пример реализации Borland C++ Builder-5.0 (6.0) + Turbo Assembler 5.х
12.5.4. Особенности реализации Microsoft Visual C++ 6.0 (7.0) + Macro Assembler 6.x (7.x)
12.6. Примеры ассемблирования

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

13.1. Типы данных
13.1.1. Обычные данные
13.1.2. Особые числа
13.2. Регистры
13.2.1. Регистры данных
13.2.2. Регистр состояния сопроцессора
13.2.3. Регистр управления
13.2.4. Регистр тегов
13.3. Ситуации-исключения
13.4. Система команд
13.4.1. Условные обозначения для команд базового сопроцессора
13.4.2. Команды пересылки данных
13.4.3. Команды загрузки констант
13.4.4. Арифметические команды
13.4.5. Трансцендентные операции
13.4.6. Команды сравнения
13.4.7. Команды управления сопроцессором
13.5. Основные особенности программирования
13.5.1. Допустимые операнды
13.5.2. Форматы основных арифметических команд
13.5.3. Организация разветвлений
13.6. Машинные форматы команд сопроцессора

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

14.1. Исполняемые программы в MS DOS
14.1.1. Характеристика COM-файла
14.1.2. Характеристика EXE-файла
14.2. Команды обработки прерывания INTx
14.3. Основные функции сервисного прерывания MS DOS 21h
14.3.1. Вывод информации на дисплей
14.3.2. Ввод информации с клавиатуры
14.4. Основные функции работы с экраном. Прерывание BIOS 10h
14.4.1. Установка и запрос видеорежима
14.4.2. Управление размером и положением курсора
14.4.3. Вывод символов на экран в текстовом режиме
14.4.4. Очистка и прокрутка экрана
14.4.5. Вывод строки символов
14.5. Ввод с клавиатуры. Прерывание BIOS 16h
14.5.1. Чтение символа БЕЗ эхо-сопровождения
14.5.2. Определение наличия введенного символа
14.5.3. Запись символа в буфер клавиатуры
14.5.4. Определение текущего состояния клавиатуры
14.6. Введение в программирование на уровне портов ввода-вывода
14.6.1. Команды чтения операндов из порта INx
14.6.2. Команды записи операндов в порт OUTx
14.6.3. Контроллер клавиатуры

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

15.1. Основные понятия. Макроопределение и макрокоманда
15.2. Макрорасширение
15.3. Директивы макроассемблера
15.3.1. Директивы управления листингом
15.3.2. Директива LOCAL
15.3.3. Основные макрооператоры
15.3.4. Директивы повторения REPT, IRP и IRPC
15.3.5. Директива выхода EXITM
15.3.6. Директивы условного ассемблирования
15.3.7. Многострочные комментарии
15.3.8. Директивы подключения файлов
15.4. Создание библиотеки макросов
15.5. Программа тестирования клавиатуры

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

16.1. Современные Windows-платформы
16.2. Типы данных
16.3. Соглашения об именах
16.4. Венгерская нотация
16.5. Получение EXE-файла
16.6. Оконное приложение
16.6.1. Основные определения
16.6.2. Основы организации пользовательского интерфейса
16.6.3. Минимальная Windows-программа
16.6.4. Базовая структура модуля на Ассемблере
16.7. Консольное приложение

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

17.1. Регистры MMX
17.2. Типы данных MMX
17.3. Особенности выполнения MMX-команд
17.3.1. Определение поддержки MMX-команд
17.3.2. Арифметика с насыщением
17.3.3. Исключительные ситуации
17.3.4. Влияние префиксов на выполнение команд MMX
17.4. Система команд MMX
17.4.1. Очистка состояния MMX
17.4.2. Команды пересылки данных
17.4.3. Использование визуального отладчика Microsoft Visual C++ 6.0
17.4.4. Команды преобразования типов данных MMX
17.4.5. Арифметические команды
17.4.6. Команды сравнения
17.4.7. Побитовые логические операции
17.4.8. Операции сдвига
17.4.9. Команда перераспределения упакованных данных
17.4.10. Команды извлечения и вставки слов
17.5. Пример получения искаженного изображения

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

18.1. Регистры XMM
18.2. Определение поддержки расширений SSE/SSE2/SSE3
18.3. Типы XMM-данных
18.4. Особенности выполнения XMM-команд
18.4.1. Исключительные ситуации
18.4.2. Влияние префиксов на выполнение XMM-команд
18.5. Расширение SSE
18.5.1. Команды пересылки данных
18.5.2. Арифметические команды
18.5.3. Команды вычисления арифметических функций
18.5.4. Команды сравнения
18.5.5. Команды преобразования типов
18.5.6. Побитовые логические операции
18.5.7. Команды ''перемешивания'' данных
18.5.8. Команды управления состоянием
18.6. Расширение SSE2
18.6.1. Команды пересылки данных
18.6.2. Арифметические команды
18.6.3. Команды вычисления арифметических функций
18.6.4. Команды сравнения
18.6.5. Побитовые логические операции
18.6.6. Команды ''перемешивания'' данных
18.6.7. Команды преобразования типов
18.6.8. Команды управления
18.6.9. Целочисленные SIMD-команды
18.7. Расширение SSE3
18.7.1. Преобразование FPU-чисел с плавающей точкой в целые числа
18.7.2. Дублирование вещественных упакованных данных
18.7.3. Загрузка невыравненных переменных
18.7.4. Одновременное сложение/вычитание
18.7.5. Горизонтальное сложение/вычитание
18.7.6. Синхронизация потоков

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

Лабораторная работа № 1. Внутреннее представление целочисленных данных в IBM PC
Лабораторная работа № 2. Внутреннее представление вещественных данных в IBM PC
Лабораторная работа № 3. Вычисление целочисленных арифметических выражений (процессор i8086/i286)
Лабораторная работа № 4. Организация условных переходов (процессор i8086/i286)
Лабораторная работа № 5. Организация циклов и работа с целочисленными одномерными массивами (процессор i8086/i286)
Лабораторная работа № 6. Использование цепочечных команд - команд обработки строк (процессор i8086/i286)
Лабораторная работа № 7. Особенности 32-разрядного программирования (процессор i386/i486/Pentium)
Лабораторная работа № 8. Вычисление арифметических выражений и трансцендентных функций (сопроцессор ix87)
Лабораторная работа № 9. Организация условных переходов, циклов и работа с массивами (сопроцессор ix87)
Лабораторная работа № 10. Организация ввода-вывода целочисленной и текстовой информации

Приложения

Приложение 1. Системы счисления
Приложение 2. Кодировка символов
Приложение 3. Расширенные ASCII-коды
Приложение 4. Базовые арифметические типы данных
П4.1. Типы данных для С/С++
П4.2. Типы данных для Borland Pascal и Object Pascal (Delphi-5)
Приложение 5. Эквивалентные директивы в режимах MASM и Ideal
Приложение 6. Общая схема распределения памяти в MS DOS
Приложение 7. Коды операций команд Ассемблера для процессоров iX86
Приложение 8. Стандартные преобразования арифметических типов данных
Приложение 9. Коды операций команд сопроцессора

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