Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИЯ1.DOC
Скачиваний:
1
Добавлен:
22.07.2019
Размер:
107.52 Кб
Скачать

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-битовые регистры. Кроме того, сегментация позволяет легко перемещать программы в новые физические облас­ти памяти, изменяя только базовый адрес сегмента. При этом не требуется изменять значения смещений внутри сегмента, что позволяет перемещаемым программам исполняться одинаково в разных местах памяти.

Нижняя память

Физические адреса Логические адреса

  1. 0

  2. 1

  3. 2

  4. 3

  5. 0

  6. 1

  7. 2

  8. 3

  9. 0

  10. 1

  11. 2

  12. 3

  13. 0

  14. 1

  15. 2

  16. 3

Верхняя память

Сегмент

Сегмент

Сегмент

Сегмент

Рис. 1. Логические адреса с соответствующими физическими адресами в памяти