- •Содержание
- •Введение
- •ДЕНЬ 1
- •Знакомство с архитектурой компьютера
- •1.1. Что такое архитектура компьютера
- •1.2. Системы счисления
- •1.3. Биты и байты
- •1.4. Фон-неймановская архитектура
- •1.5. Процессор
- •1.5.1. Режимы работы процессора
- •1.5.2. Регистры процессора
- •1.5.2.1. Пользовательские регистры
- •1.5.2.1.1. Регистры общего назначения
- •1.5.2.1.2. Сегментные регистры
- •1.5.2.1.3. Регистр флагов и указателя команд
- •1.5.2.2.Системные регистры
- •1.5.2.3. Регистры FPU и MMX
- •1.5.2.4. Регистры XMM (расширение SSE/SSE2)
- •1.6. Память
- •1.8. Шины
- •ДЕНЬ 2
- •Основы программирования на ассемблере
- •2.1. Какой ассемблер выбрать
- •2.2. Этапы создания программы
- •2.3. Структура программы
- •2.3.1. Метка
- •2.3.2. Команда или директива
- •2.3.3. Операнды
- •2.3.4. Комментарий
- •2.4. Некоторые важные директивы ассемблера
- •2.4.1. Директивы определения данных
- •2.4.2. Директива эквивалентности
- •2.4.3. Директива присваивания
- •2.4.4. Директивы задания набора допустимых команд
- •2.4.5. Упрощенные директивы определения сегмента
- •2.4.6. Директива указания модели памяти
- •2.5. Разработка нашей первой программы на ассемблере
- •2.5.1. Программа типа COM
- •2.5.2. Программа типа EXE
- •2.6. Основные различия между программами типа EXE и COM
- •2.7. Функции BIOS и DOS
- •2.8. Префикс программного сегмента (PSP)
- •2.9. Знакомство с отладчиком
- •2.10. Младший байт по младшему адресу
- •ДЕНЬ 3
- •Основные конструкции ассемблера
- •3.1. Цикл
- •3.2. Безусловный переход
- •3.3. Сравнение и условные переходы
- •3.4. Стек
- •3.5. Подпрограммы (процедуры)
- •3.6. Директива INCLUDE
- •3.7. Конструкции времени исполнения программы
- •3.8. Директивы условного ассемблирования
- •3.9. Макросы
- •3.9.1. Блоки повторений
- •ДЕНЬ 4
- •Основные команды ассемблера
- •4.1. Команды пересылки
- •4.2. Оператор PTR
- •4.3. Способы адресации
- •4.3.1. Непосредственная адресация
- •4.3.2. Регистровая адресация
- •4.3.3. Косвенная адресация
- •4.3.4. Прямая адресация (адресация по смещению)
- •4.3.5. Базовая адресация
- •4.3.6. Индексная адресация
- •4.3.7. Базовая-индексная адресация
- •4.3.8. Адресация по базе с индексированием и масштабированием
- •4.4. Относительные операторы
- •4.5. Логические команды
- •4.6. Команды сдвига
- •4.6.1. Команды линейного (нециклического) сдвига
- •4.6.2. Команды циклического сдвига
- •4.7. Команды обработки строк/цепочечные команды
- •4.7.1. Команды пересылки цепочек
- •4.7.2. Команды сравнения цепочек
- •4.7.3. Команды сканирования цепочек
- •4.7.4. Команды загрузки элемента из цепочки в аккумулятор
- •4.7.6. Команды ввода элемента цепочки из порта ввода-вывода
- •4.7.7. Команды вывода элемента цепочки в порт ввода-вывода
- •4.8. Команды работы с адресами и указателями
- •4.9. Команды трансляции (преобразования) по таблице
- •ДЕНЬ 5
- •Арифметические команды. Сопроцессор
- •5.1. Арифметические операторы
- •5.2. Команды выполнения целочисленных операций
- •5.2.1. Целые двоичные числа
- •5.2.2. BCD-числа
- •5.2.3. Команды, работающие с целыми двоичными числами
- •5.2.3.1. Сложение и вычитание
- •5.2.3.2. Инкремент и декремент
- •5.2.3.3. Умножение и деление
- •5.2.3.4. Изменение знака числа
- •5.2.4. Ввод и вывод чисел
- •5.2.5.1. Сложение и вычитание неупакованных BCD-чисел
- •5.2.5.2. Умножение и деление неупакованных BCD-чисел
- •5.2.5.3. Сложение и вычитание упакованных BCD-чисел
- •5.3. Команды выполнения операций с вещественными числами
- •5.3.1. Вычисления с фиксированной запятой
- •5.3.2. Вычисления с плавающей запятой
- •5.3.2.1. Сравнение вещественных чисел
- •5.4. Архитектура сопроцессора
- •5.4.1. Типы данных FPU
- •5.4.2. Регистры FPU
- •5.4.2.1. Регистры данных R0-R7
- •5.4.2.2. Регистр состояния SWR (Status Word Register)
- •5.4.2.3. Регистр управления CWR (Control Word Register)
- •5.4.2.4. Регистр тегов TWR (Tags Word Register)
- •5.4.2.5. Регистры-указатели команд IPR (Instruction Point Register) и данных DPR (Data Point Register)
- •5.4.3. Исключения FPU
- •5.4.4. Команды сопроцессора
- •5.4.4.1. Команды пересылки данных FPU
- •5.4.4.2. Арифметические команды
- •5.4.4.3. Команды манипуляций константами
- •5.4.4.4. Команды управления сопроцессором
- •5.4.4.5. Команды сравнения
- •5.4.4.6. Трансцендентные команды
- •ДЕНЬ 6
- •Программирование под MS-DOS
- •6.2. Вывод на экран в текстовом режиме
- •6.2.1. Функции DOS
- •02h (INT 21h) — вывод символа с проверкой на <Ctrl>+<Break>
- •06h (INT 21h) — вывод символа без проверки на <Ctrl>+<Break>
- •09h (INT 21h) — вывод строки на экран с проверкой на <Ctrl>+<Break>
- •40h (INT 21h) — записать в файл или на устройство
- •INT 29h — быстрый вывод символа на экран
- •6.2.2. Прямая запись в видеопамять
- •6.3. Ввод с клавиатуры
- •6.3.1. Функции DOS
- •01h (INT 21h) — ввод символа с эхо
- •06h (INT 21h) — ввод-вывод через консоль
- •07h (INT 21h) — нефильтрованный ввод без эхо
- •08h (INT 21h) — ввод символа без эхо
- •0Ah (INT 21h) — буферизированный ввод с клавиатуры
- •0Bh (INT 21h) — проверить состояние ввода
- •0Ch (INT 21h) — очистить буфер и считать символ
- •3Fh (INT 21h) — чтение из файла или устройства
- •6.3.2. Функции BIOS
- •00h, 10h, 20h (INT 16h) — прочитать символ с клавиатуры с ожиданием
- •01h, 11h, 21h (INT 16h) — проверка символа
- •02h, 12h, 22h (INT 16h) — считать состояние клавиатуры
- •6.4. Работа с файлами
- •6.4.1. Создание и открытие файлов
- •3Ch (INT 21h) — создать файл
- •3Dh (INT 21h) — открыть существующий файл
- •5Bh (INT 21h) — создать и открыть существующий файл
- •5Ah (INT 21h) — создать и открыть временный файл
- •6Ch (INT 21h) — создать или открыть файл с длинным именем
- •6.4.2. Чтение и запись в файл
- •3Fh (INT 21h) — чтение из файла или устройства
- •42h (INT 21h) — установить указатель чтения/записи
- •40h (INT 21h) — записать в файл или на устройство
- •68h (INT 21h) — сброс файловых буферов MS-DOS на диск
- •0Dh (INT 21h) — сброс всех файловых буферов на диск
- •6.4.3. Закрытие и удаление файла
- •3Eh (INT 21h) — закрыть файл
- •41h (INT 21h) — удалить файл
- •LFN 41h (INT 21h) — удалить файл c длинным именем
- •6.4.4. Поиск файлов
- •4Eh (INT 21h) — найти первый файл
- •4Fh (INT 21h) — найти следующий файл
- •LFN 4Eh (INT 21h) — найти первый файл с длинным именем
- •LFN 4Fh (INT 21h) — найти следующий файл
- •LFN A1h (INT 21h) — закончить поиск файла
- •6.4.5. Управление директориями
- •39h (INT 21h) — создать директорию
- •LFN 39h (INT 21h) — создать директорию с длинным именем
- •3Ah (INT 21h) — удалить директорию
- •LFN 3Ah (INT 21h) — удалить директорию с длинным именем
- •47h (INT 21h) — определить текущую директорию
- •LFN 47h (INT 21h) — определить текущую директорию с длинным именем
- •3Bh (INT 21h) — сменить директорию
- •LFN 3Bh (INT 21h) — сменить директорию с длинным именем
- •6.5. Прерывания
- •6.5.1. Внутренние и внешние аппаратные прерывания
- •6.5.2. Запрет всех маскируемых прерываний
- •6.5.3. Запрет определенного маскируемого прерывания
- •6.5.4. Собственный обработчик прерывания
- •Функция 35h (INT 21h) — получить вектор прерываний
- •Функция 25h (INT 21h) — установить вектор прерываний
- •6.5.5. Распределение номеров прерываний
- •ДЕНЬ 7
- •7.2. Первая простейшая программа под Windows на ассемблере
- •7.2.1. Директива INVOKE
- •7.3. Консольное приложение
- •7.4. Графическое приложение
- •7.4.1. Регистрация класса окон
- •7.4.2. Создание окна
- •7.4.3. Цикл обработки очереди сообщений
- •7.4.4. Процедура главного окна
- •7.5. Дочерние окна управления
- •7.6. Использование ресурсов
- •7.6.1. Подключение ресурсов к исполняемому файлу
- •7.6.2. Язык описания ресурсов
- •7.6.2.1. Пиктограммы
- •7.6.2.2. Курсоры
- •7.6.2.3. Растровые изображения
- •7.6.2.4. Строки
- •7.6.2.5. Диалоговые окна
- •7.6.2.6. Меню
- •7.7. Динамические библиотеки
- •7.7.1. Простейшая динамическая библиотека
- •7.7.2. Неявная загрузка DLL
- •7.7.3. Явная загрузка DLL
- •Приложение 1. Основные технические характеристики микропроцессоров фирмы Intel
- •Приложение 2. Таблицы кодов символов
- •Приложение 3. Сравнение двух синтаксисов ассемблера
- •Список литературы
http://www.sklyaroff.ru |
142 |
mov ds,dx
mov dx,offset int_hook
int 21h
...
...
...
lds dx,old_hook mov ah,25h
mov al,63h int 21h
6.5.5. Распределение номеров прерываний
Как уже говорилось, в памяти отводится место под 256 векторов прерываний (1 Кбайт). Некоторые из них практически не используются; к другим, наоборот, обращается каждая программа.
В табл. 6.3 показана таблица векторов прерываний, чтобы вы имели представление о ее составе.
Таблица 6.3. Таблица векторов прерываний
Номер вектора |
Адрес вектора |
Назначение вектора |
|
|
|
|
|
||
|
|
|
|||||||
00h |
00000h |
Внутренне прерывание генерируется CPU при попытке |
|||||||
|
|
деления на нуль |
|
|
|
|
|
||
|
|
|
|
|
|
||||
01h |
00004h |
Внутреннее |
|
прерывание пошагового |
выполнения |
||||
|
|
программы. Генерируется после выполнения каждой |
|||||||
|
|
машинной команды, если в слове флагов установлен |
|||||||
|
|
бит пошаговой трассировки TF. Используется |
|||||||
|
|
отладчиками |
|
|
|
|
|
|
|
|
|
|
|||||||
02h |
00008h |
Аппаратное немаскируемое прерывание. Обычно |
|||||||
|
|
генерируется при ошибке четности в оперативной |
|||||||
|
|
памяти и при запросе прерывания от сопроцессора |
|||||||
|
|
|
|
|
|
|
|||
03h |
0000Ch |
Программное |
прерывание |
для |
|
трассировки. |
|||
|
|
Генерируется |
при |
выполнении |
|
однобайтовой |
|||
|
|
машинной команды с кодом CCh и обычно |
|||||||
|
|
используется отладчиками для установки точки |
|||||||
|
|
прерывания |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
04h |
00010h |
Внутреннее |
|
прерывание |
генерируется, |
когда |
|||
|
|
арифметический результат приводит к переполнению |
|||||||
|
|
|
|||||||
05h |
00014h |
Аппаратное прерывание от нажатия клавиши |
|||||||
|
|
PrintScreen (печать экрана) |
|
|
|
|
|||
|
|
|
|||||||
06h |
00018h |
Внутреннее прерывание недопустимого кода операции |
|||||||
|
|
или длина команды больше 10 байт |
|
|
|
||||
|
|
|
|
|
|
||||
07h |
0001Ch |
Особый |
случай |
отсутствия |
арифметического |
||||
|
|
сопроцессора |
|
|
|
|
|
|
|
|
|
|
|||||||
08h |
00020h |
IRQ0 — аппаратное прерывание от системного таймера |
|||||||
|
|
(генерируется 18,2 раза в секунду) |
|
|
|
||||
|
|
|
|
|
|
||||
09h |
00024h |
IRQ1 — аппаратное |
прерывание |
от |
клавиатуры. |
||||
|
|
Генерируется при каждом нажатии и отпускании |
|||||||
|
|
клавиши. Используется для чтения данных из |
|||||||
|
|
клавиатуры |
|
|
|
|
|
|
|
|
|
|
|||||||
0Ah |
00028h |
IRQ2 — используется для каскадирования аппаратных |
|||||||
|
|
прерываний |
|
|
|
|
|
|
|
|
|
|
|||||||
0Bh |
0002Ch |
IRQ3 — аппаратное прерывание от последовательного |
|||||||
|
|
порта COM2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
http://www.sklyaroff.ru |
|
|
|
|
|
|
|
143 |
|
|
|
|
|
|
Таблица 6.3. (продолжение) |
|||||
|
|
|
|
|||||||
|
0Ch |
00030h |
IRQ4 — аппаратное прерывание от последовательного |
|||||||
|
|
|
порта COM1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
0Dh |
00034h |
IRQ5 — аппаратное |
прерывание |
от |
параллельного |
||||
|
|
|
порта LPT2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
0Eh |
00038h |
IRQ6 — аппаратное |
прерывание |
от |
гибкого |
диска. |
|||
|
|
|
Генерируется контроллером НГМД после завершения |
|||||||
|
|
|
операции ввода/вывода |
|
|
|
|
|
||
|
|
|
|
|
|
|
||||
|
0Fh |
0003Ch |
IRQ7 — аппаратное |
прерывание |
от |
параллельного |
||||
|
|
|
порта LPT1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
10h |
00040h |
Программы BIOS обслуживания видеосистемы |
|
|
|||||
|
|
|
|
|
|
|||||
|
11h |
00044h |
Определение конфигурации устройств в системе |
|
|
|||||
|
|
|
|
|
|
|||||
|
12h |
00048h |
Определение размера оперативной памяти |
|
|
|||||
|
|
|
|
|
|
|||||
|
13h |
0004Ch |
Программы BIOS обслуживания дисков |
|
|
|||||
|
|
|
|
|
|
|
||||
|
14h |
00050h |
Программы |
BIOS |
обслуживания |
последовательного |
||||
|
|
|
порта |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
15h |
00054h |
Расширенный сервис |
|
|
|
|
|
||
|
|
|
|
|
|
|||||
|
16h |
00058h |
Программы BIOS обслуживания клавиатуры |
|
|
|||||
|
|
|
|
|
|
|||||
|
17h |
0005Ch |
Программы BIOS обслуживания принтера |
|
|
|||||
|
|
|
|
|
|
|
|
|||
|
18h |
00060h |
Запуск BASIC в ПЗУ, если он есть |
|
|
|
|
|||
|
|
|
|
|
|
|
||||
|
19h |
00064h |
Перезагрузка операционной системы |
|
|
|
||||
|
|
|
|
|||||||
|
1Ah |
00068h |
Программы BIOS обслуживания часов реального |
|||||||
|
|
|
времени |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
1Bh |
0006Ch |
Обработчик |
прерывания, |
возникающего, |
если |
||||
|
|
|
пользователь нажал комбинацию клавиш <Ctrl+Break> |
|||||||
|
|
|
|
|||||||
|
1Ch |
00070h |
Вектор для прикладной обработки прерываний от |
|||||||
|
|
|
системного таймера |
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
1Dh |
00074h |
Адрес таблицы видеопараметров, используемой |
|||||||
|
|
|
программами BIOS |
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
1Eh |
00078h |
Адрес таблицы параметров дискеты, используемой |
|||||||
|
|
|
программами BIOS |
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
1Fh |
0007Ch |
Указатель на графическую таблицу для символов с |
|||||||
|
|
|
кодами ASCII 128-255 |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
||
|
21h |
00084h |
Диспетчер функций DOS |
|
|
|
|
|
||
|
|
|
|
|||||||
|
22h |
00088h |
Адрес возврата в родительский процесс после |
|||||||
|
|
|
завершения текущего |
|
|
|
|
|
||
|
|
|
|
|||||||
|
23h |
0008Ch |
Адрес обработчика системы DOS, активизируемого |
|||||||
|
|
|
нажатием клавиш <Ctrl>+<C> |
|
|
|
|
|
||
|
|
|
|
|
|
|||||
|
24h |
00090h |
Адрес обработчика DOS критических ошибок |
|
|
|||||
|
|
|
|
|||||||
|
25h |
00094h |
Активизирует службу DOS для чтения данных с диска |
|||||||
|
|
|
по абсолютным адресам |
|
|
|
|
|
||
|
|
|
|
|||||||
|
26h |
00098h |
Активизирует службу DOS для записи данных с диска |
|||||||
|
|
|
по абсолютным адресам |
|
|
|
|
|
||
|
|
|
|
|||||||
|
27h |
0009Ch |
Завершает работу программы, но оставляет ее в памяти |
|||||||
|
|
|
под наблюдением DOS |
|
|
|
|
|
||
|
|
|
|
|||||||
|
2Fh |
000BCh |
Программное прерывание, используемое для связи с |
|||||||
|
|
|
резидентными программами |
|
|
|
|
|
||
|
|
|
|
|||||||
|
33h |
000CCh |
Программы обслуживания мыши, реализуемые в |
|||||||
|
|
|
драйвере мыши |
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
43h |
0010Ch |
Указывает набор графических знаков (EGA, PS/2) |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
http://www.sklyaroff.ru |
|
|
|
|
|
144 |
|
|
|
|
|
Таблица 6.3. (окончание) |
||||
|
|
|
|
|||||
|
4Ah |
00128h |
Вектор для прикладной обработки прерываний от |
|||||
|
|
|
будильника (часов реального времени) |
|
|
|
||
|
|
|
|
|||||
|
60h...67h |
00180h...0019Ch |
Свободные векторы для использования прикладными |
|||||
|
|
|
программами |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
68h...6Fh |
001A0h...001BCh |
Не используются |
|
|
|
|
|
|
|
|
|
|||||
|
70h |
001C0h |
IRQ8 — аппаратное прерывание от будильника (часов |
|||||
|
|
|
реального времени) |
|
|
|
|
|
|
|
|
|
|
|
|||
|
71h |
001C4h |
IRQ9 — аппаратное |
прерывание от |
подключенной к |
|||
|
|
|
компьютеру нестандартной аппаратуры |
|
|
|
||
|
|
|
|
|
||||
|
72h |
001C8h |
IRQ10 — используется |
дополнительными |
||||
|
|
|
устройствами |
|
|
|
|
|
|
|
|
|
|
||||
|
73h |
001CCh |
IRQ11 — используется |
дополнительными |
||||
|
|
|
устройствами |
|
|
|
|
|
|
|
|
|
|
|
|||
|
74h |
001D0h |
IRQ12 — прерывание от мыши PS/2-типа |
|
|
|||
|
|
|
|
|||||
|
75h |
001D4h |
IRQ13 — аппаратное прерывание от арифметического |
|||||
|
|
|
сопроцессора |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
76h |
001D8h |
IRQ14 — аппаратное |
прерывание |
от |
первого |
IDE- |
|
|
|
|
контролера "операция завершена" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
77h |
001DCh |
IRQ15 — аппаратное |
прерывание |
от |
второго |
IDE- |
|
|
|
|
контролера "операция завершена" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78h...7F |
001DCh...001FCh |
Зарезервировано |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
80h...85h |
00200h...00214h |
Зарезервировано для BASIC |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
86h...F0h |
00218h...003C0h |
Используются интерпретатором BASIC |
|
|
|
||
|
|
|
|
|
||||
|
F1h...FFh |
003C4h...003FCh |
Зарезервировано для временного |
использования |
||||
|
|
|
программистом |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Большинство векторов прерываний содержат адреса обработчиков прерываний. Однако некоторые номера прерываний просто указывают на различную служебную информацию. Например, прерывание 1Eh содержит адрес, по которому хранятся параметры инициализации дисковода для дискет; вектор прерывания 1Fh указывает на битовые комбинации, используемые BIOS при выводе на экран дисплея знаков текста, а прерывания 41h и 46h указывают на параметры жесткого диска.
Такие векторы прерываний не используются для выполнения прерываний. Если, к примеру, вы попытаетесь выполнить прерывание 1Eh, то, скорее всего, вызовите аварийный сбой в работе программы, т. к. вектор 1Eh указывает на данные, а не на выполняемый код.