15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 Разряды
|
|
|
|
OF |
DF |
IF |
TF |
SF |
ZF |
|
AF |
|
PF |
|
CF |
Рис. 1.4. Регистр флагов.
Флаг переноса CF (Carry Flag) индицирует перенос или заем при выполнении арифметических операций, а также служит индикатором ошибки при обращении к системным функциям.
Флаг паритета PF (Parity Flag) устанавливается в 1, если результат операции содержит четное число двоичных единиц.
Флаг вспомогательного переноса AF (Auxiliary Flag) используется в операциях над упакованными двоично-десятичными числами. Он индицирует перенос или заем из старшей тетрады (бита 3).
Флаг нуля ZF (Zero Flag) устанавливается в 1, если результат операции равен 0.
Флаг знака SF (Sign Flag) показывает знак результата операции, устанавливаясь в 1 при отрицательном результате.
Управляющий флаг трассировки (ловушки) TF (Trace Flag) используется для осуществления пошагового выполнения программы. Если TF«1, то после выполнения каждой команды процессор реализует процедуру прерывания типа 1 (через вектор, расположенный по адресу 04).
Управляющий флаг разрешения прерываний IF (Interrupt Flag) разрешает (если равен 1) или запрещает (если равен 0) процессору реагировать на прерывания от внешних устройств.
Управляющий флаг направления DF (Direction Flag) используется командами обработки строк. Если DF-0, строка обрабатывается в прямом направлении, от меньших адресов к большим; если DF*1, обработка строки идет в обратном направлении.
Флаг переполнения OF (Overflow Flag) фиксирует переполнение, т.е. выход результата за пределы допустимого диапазона значений.
Для работы с регистром флагов предусмотрен ряд команд. Установка и сброс флагов CF, DF и IF осуществляется командами STC, STD и STI (установка) и CLC, CLD и CLI (сброс). Все содержимое регистра флагов можно сохранить в стеке командой PUSHF и извлечь из стека командой POPF; кроме того, младший байт регистра флагов (флаги CF, PF, AF, ZF и SF) можно переслать в регистр АН командой LAHF или загрузить в регистр флагов из АН командой SAHF.
Сегментация памяти
Перед тем как изучать регистры и команды процессора 8086, необходимо понять, как он адресует память, используя системные сегменты и смещения — термины, часто вызывающие недоразумения.
Используя для представления значения адреса 20 бит, 8086-й процессор может иметь прямой доступ к 1 Мбайт памяти. DOS, ROM BIOS и другие находящиеся в памяти программы уже занимают определенное место памяти персонального компьютера, поэтому остальные программы запускаются, используя меньшее пространство памяти — до 640 Кбайт. Если вы хотите, чтобы ваша программа работала на возможно большем числе компьютеров — ограничьте пределы необходимой памяти.
Замечание
Последние модели процессов, такие как 80386, 80486 и Pentium (известный как 80586), эмулируют режим процессора 8086. Методы, описанные в этой главе, применимы ко всем процессорам 80х86.
Программирование на языке ассемблера
Независимо от того, сколько памяти может адресовать процессор или сколько микросхем памяти установлено в компьютере, наименьшим блоком памяти является 8-битовый байт. Как отмечалось ранее, каждый байт имеет свое уникальное местоположение, называемое физическим адресом, по которому программы могут читать и записывать информацию. Очевидно, что для адресации больших объемов памяти необходимо большее число бит под физические адреса. Если в вашем компьютере 64 Кбайт памяти, тогда для задания адреса любого байта достаточно 16 бит, с помощью которых представляются значения от 0 до 65535 (216-!), или округленно — 64 Кбайт. Для адресации 1 Мбайт памяти персонального компьютера требуется как минимум 20 бит (220-! равно 1048575, или, в шестнадцатеричном представлении, FFFFF). Проблема состоит в том, что 8086 процессор использует только 16-битовые регистры. Тогда каким образом процессор 8086 может иметь доступ ко всему мегабайту памяти в обычном персональном компьютере?
Ответом является сегментация памяти — метод, используемый процессором 8086 для разделения большого адресного пространства памяти на логические 64 Кбайт фрагменты. С помощью этого метода адрес конкретного байта может быть выражен двумя значениями: адресом фрагмента (сегмента) и 16-битовым смещением от начала сегмента.
Эта комбинация значений сегмента и смещения называется логическим адресом. Первый байт сегмента имеет смещение 0000, второй — 0001, третий — 0002 и т.д., независимо от того, где сегмент физически начинается в памяти. Рис. 4.1 демонстрирует эту идею, показывая, что каждая точка памяти имеет как физический адрес (справа), так и логический адрес (слева), выраженный через смещение от начала границы сегмента. С помощью сегментации процессор 8086 может эффективно адресовать до 1 Мбайт памяти, даже используя относительно небольшие 16-битовые регистры. Кроме того, сегментация позволяет легко перемещать программы в новые физические области памяти, изменяя только базовый адрес сегмента. При этом не требуется изменять значения смещений внутри сегмента, что позволяет перемещаемым программам исполняться одинаково в разных местах памяти.
Нижняя память
Физические адреса Логические адреса
0
1
2
3
0
1
2
3
0
1
2
3
0
1
2
3
Верхняя память
Сегмент
Сегмент
Сегмент
Сегмент
Рис. 1. Логические адреса с соответствующими физическими адресами в памяти