Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка1.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.68 Mб
Скачать

1.2. Организация памяти с точки зрения мп 8086

Память для МП 8086 представляется в виде линейной последовательности байт. МП 8086 может адресовать 1 Мб памяти. Адреса начинаются с 0 – если требуется обратиться к 10-му по счету байту его адрес будет равен 9. Процессор может адресовать не только байты, но и слова (два байта). Так как адресация 1 Мб памяти требует, чтобы адрес был 20 разрядным числом (1 Мб = 1048576 байта = 220), а все регистры МП 8086 являются 16-разрядными, применена так называемая сегментная адресация памяти. Идея этого метода адресации графически представлена на рис. 1.2.

0

Сегмент 1

0

Смещение 1

65535

Сегмент 2

0

Смещение 2

65535

.

.

.

1048575

Рис. 1.2 – сегментная адресация памяти.

Все адресное пространство 1 Мб разбивается на сегменты – участки памяти объемом 64 Кб. Начало каждого следующего сегмента смещено относительно начала предыдущего на 16 байт – таким образом все адресное пространство разбивается на 65536 перекрывающихся сегментов объемом 64 Кб каждый. При обращении к какому-либо байту или слову указывается номер сегмента (от 0 до 65535), в котором находится этот байт, и смещение – номер байта (от 0 до 65535) относительно начала указанного сегмента. Операцию обращения к ячейке памяти можно записать в виде формулы: адрес_памяти = сегмент * 16 + смещение. По адресу, вычисленному в этой формуле, и происходит обращение процессора к памяти. Система команд МП 8086 определяет, что номер сегмента хранится в сегментном регистре (CS, DS, SS или ES), а смещение – в регистрах BX, BP, SP, SI или DI. Смещение может указываться в команде и явно. Таким образом, адрес в модели сегментной адресации памяти представляется в виде пары значений сегмент:смещение. Следует отметить, что адресу одной и той же ячейки памяти могут соответствовать несколько пар сегмент:смещение. При обращении к данным используются сегментные регистры DS, SS или ES, причем регистр SS используется для обращения к данным, хранящимся в стеке. Для обращения к командам (это делает сам процессор) используется сегментный регистр CS и регистр IP.

Пример 1: вычислить значение адреса, по которому процессор обращается к памяти, если имеется пара сегмент:смещение 0015h:0319h (адреса обычно указываются в 16-ричной системе счисления, что в языке ассемблера обозначается буквой h).

Решение: адрес_памяти = 0015h * 10h + 0319h = 0150h + 0319h = 0469h.

Пример 2: выписать все пары сегмент:смещение которые соответствуют адресу 0023h.

Решение: данному адресу соответствует три пары сегмент:смещение:

0000h:0023h: 0023h = 0000h * 10h + 0023h;

0001h:0013h: 0023h = 0001h * 10h + 0013h;

0002h:0003h: 0023h = 0002h * 10h + 0003h.

1.3. Методы адресации памяти

Методы адресации памяти применительно к МП 8086 определяют правила, по которым вычисляется смещение в командах, использующих обращение к ячейкам памяти. Эти правила, в свою очередь, определяют, какие регистры используются для вычисления смещения и какие сегментные регистры используются по умолчанию в том или ином методе адресации. Все методы адресации памяти можно разбить на две группы:

  1. прямая адресация;

  2. косвенная адресация.

При использовании прямой адресации смещение в команде задается явным образом. При этом по умолчанию используется сегментный регистр DS. Это означает, что если в команде происходит обращение к памяти, явным образом указано смещение и не указан используемый сегментный регистр, то номер сегмента берется из сегментного регистра DS.

Косвенная адресация может быть следующих типов:

  1. базовая;

  2. индексная;

  3. базово-индексная.

При использовании базовой адресации смещение находится в регистре BX или BP – в зависимости от того, какой конкретно регистр указывается в команде. При использовании регистра BX номер сегмента по умолчанию находится в сегментном регистре DS. При использовании регистра BP номер сегмента по умолчанию находится в сегментном регистре SS.

При использовании индексной адресации смещение находится в регистре SI или DI. При этом по умолчанию также используется сегментный регистр DS.

Базово-индексная адресация является комбинацией базовой и индексной адресации. Это означает, что смещение вычисляется как сумма значений указанных регистров из базовой и индексной адресации. Например, смещение может вычисляться как сумма значений регистров BP и SI или BX и DI. В таблице 1.1 перечислены все возможные комбинации регистров, используемых в базово-индексной адресации и те сегментные регистры, которые используются по умолчанию в том или ином случае.

Таблица 1.1 – базово-индексная адресация.

Регистр базовой

Адресации

Регистр индексной

адресации

Вычисление

смещения

Используемый по умолчанию

сегментный регистр

BX

SI

BX + SI

DS

BX

DI

BX + DI

DS

BP

SI

BP + SI

SS

BP

DI

BP + DI

SS

Особенностью всех методов косвенной адресации является то, что смещение может вычисляться как сумма значений указанных регистров и непосредственно заданного значения. Например, «базовая адресация со смещением» означает, что смещение вычисляется как сумма значений регистра BX или BP и непосредственного значения, скажем BX + 10 или BP + 12. Более того, непосредственно задаваемое значение может быть и отрицательным, например SI – 2 или BX + DI – 6. Косвенная адресация обозначается в программе на языке ассемблера квадратными скобками, например, [BX + SI].

В таблице 1.2 представлены все методы косвенной адресации памяти, используемые МП 8086 и их характеристики.

Таблица 1.2 – методы косвенной адресации памяти.

Базовая

адресация

Индексная

адресация

Базово-индексная

адресация

Используемый по умолчанию

сегментный регистр

[BX]

[SI]

[BX + SI]

DS

[DI]

[BX + DI]

DS

[BX + значение]

[SI + значение]

[BX + SI + значение]

DS

[DI + значение]

[BX + DI + значение]

DS

[BP]

[BP + SI]

SS

[BP + DI]

SS

[BP + значение]

[BP + SI + значение]

SS

[BP + DI + значение]

SS

Комбинации регистров и непосредственных значений, не указанные в таблице 1.2, использовать нельзя – МП 8086 не поддерживает такие способы адресации. Например, нельзя использовать способ адресации, в котором смещение вычисляется как сумма значений регистров BX и BP.

Следует отметить, что существует еще так называемая непосредственная адресация. Однако такая адресация определяет не смещение ячейки памяти, а непосредственное числовое значение, указываемое в команде.