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

Краткие теоретические сведения.

Память представляет собой массив емкостью 1 Мбайт, т. е. 220 8-разрядных ячеек (рисунок 1.1).

Рисунок 1.1 – Программная модель памяти

В памяти хранятся как байты, так и 16-разрядные слова. Слова располагаются в двух соседних ячейках памяти: старший байт хранится в ячейке со старшим адресом, младший — в ячейке с младшим адресом. Адресом слова считается адрес его младшего байта. На рисунке 1.1 показан пример, когда по адресу 00000 хранится байт 35Н, а по адресу 00001 — слово 784АН. Начальные (00000Н—003FFH) и конечные адреса (FFFF0H—FFFFFH) зарезервированы для системы прерываний и начальной установки соответственно.

Организация памяти, при которой каждому адресу соответствует содержимое одной ячейки памяти (см. рисунок 1.1), называется линейной. В МП i8086 используется сегментная организация памяти, которая характеризуется тем, что программно доступной является не вся память, а лишь некоторые сегменты, т. е. области памяти. Внутри сегмента используется линейная адресация.

Введение сегментной организации можно объяснить следующим образом. Микропроцессор i8086 представляет собой 16-разрядный процессор, т. е. имеет 16-разрядную внутреннюю шину, 16-разрядные регистры и сумматоры. Стремление разработчиков БИС адресовать по возможности больший массив памяти обусловило использование 20-разрядной шины данных. Для сравнения: 16-разрядная шина адреса разрешает адресовать 216= 64 Кбайт; 20-разрядная — 220= 1 Мбайт.

Для формирования 20-разрядного адреса в 16-разрядном процессоре используют информацию двух 16-разрядных регистров. В МП i8086 20- разрядный адрес формируется из двух 16-разрядных адресов, которые называют логическими. Первый логический адрес, дополненный справа четырьмя нулями, представляет собой начальный адрес сегмента емкостью 64 Кбайт. Второй логический адрес определяет смещение в сегменте, т. е. определяет расстояние от начала сегмента до адресованной ячейке. Если это расстояние равно 0000, то адресуется первая ячейка сегмента, если FFFFH — последняя. Таким образом, логическое адресное пространство разделено на блоки соседних адресов емкостью 64 Кбайт, т. е. сегменты.

Такой подход к организации памяти удобен еще и потому, что память обычно логически делится на области кода (программной памяти), данных и стека. Сегмент – это независимая и отдельно адресуемая единица памяти. В каждом сегменте устанавливается своя собственная нумерация слов. Физический адрес памяти определяется номером сегмента и адресом внутри сегмента. Физический 20-разрядный адрес ячейки памяти формируется из двух 16-разрядных адресов — адреса сегмента Seg и исполнительного адреса ЕА (Executive Address), которые суммируются со смещением на четыре разряда (рисунок 1.2).

Смещение адреса сегмента на 4 разряда влево эквивалентно его умножению на 24. Следовательно, физический адрес равняется 16 х Seg + ЕА. В качестве первого логического адреса Seg используется содержимое одного из четырех сегментных регистров: CS (Code Segment — сегмент кодов), DS (Data Segment — сегмент данных), ES (Extended Segment — дополнительный сегмент данных), SS (Stack Segment — сегмент стека). Второй логический адрес ЕА, или смещение, зависит от сегмента. Так, в сегменте кодов ЕА используется содержимое указателя команд IP, в сегментах данных значение ЕА зависит от средства адресации операнда, в сегменте стека для указания второго логического адреса используются регистры SP или BP.

Рисунок 1.2 - Формирование физического адреса

Преобразование логических адресов в физические всегда однозначно, т. е. паре Seg и ЕА отвечает единственный физический адрес. Обратное преобразование не является однозначным: физический адрес можно представить с помощью 64 Кбайт / 16 = 4096 пар логических адресов. В дальнейшем будем обозначать физический адрес в виде Seg:EA, где вместо Seg и ЕА могут использоваться как обозначения регистров, так и 16-разрядные данные.

Емкость памяти 1 Мбайт, начиная с нулевого адреса, разбивается на параграфы по 16 байт. Сегмент может начинаться только на границе параграфа, т. е. в адресе сегмента младшие четыре бита — нулевые. Размещение сегментов в памяти произвольное: сегменты могут частично или полностью перекрываться либо не иметь общих областей. Изменяя значения первого и второго логических адресов, можно адресовать любую ячейку из общей памяти емкостью 1 Мбайт.

На рисунке 1.3, а показано расположение в пространстве 1 Мбайт четырех сегментов по 64 Кбайт без перекрытия. Начальные адреса сегментов определяются содержимым 16-разрядных сегментных регистров, которые дополнены справа четырьмя нулевыми битами. Смещение в сегменте кодов определяется содержимым регистра IP, смещение в сегменте данных и дополнительном сегменте данных — эффективным адресом ЕА, который указывается в команде, смещение в сегменте стека — содержимым регистра SP.

Рисунок 1.3 – Расположение сегментов в пространстве памяти 1 Мбайт: a — без перекрытия; б — с частичным перекрытием

В сегментах кодов расположены коды команд, т. е. программа в машинных кодах; в остальных сегментах — данные. Программа может обращаться только к данный в сегментах, которые обозначены на рисунке 1.3, серыми прямоугольниками.

Изменяя содержимое сегментных регистров, можно передвигать сегменты в границах всей памяти 1 Мбайт. На рисунке 3.3, б показано расположение сегментов кодов, данных, стека и дополнительного сегмента с частичным перекрытием. Такой случай возникает тогда, когда содержимое сегментных регистров отличается менее чем на 64 Кбайт / 16 = 4096 байт.

Пример 1.

Найти значение физического адреса по двум значениям логических адресов CS:IP.

Пусть содержимое сегментного регистра CS — число 2002h, содержимое указателя команд IP — 3175h. Прибавим к значению CS четыре нуля с правой стороны (умножение на 1610 (1016)):

CS(0000) = 0010 0000 0000 0010 0000b = 2020h.

Выполнив операцию суммирования этой величины с содержимым регистра IP, получим физический адрес:

0010 0000 0000 0010 0000

+

0011 0001 0111 0101

0010 0011 0001 1001 0101 = 23195h.

Таким образом, запись CS:IP при CS = 2002h, IP = 3175h соответствует физическому адресу 23195h.

Пример 2.

Найти значение двух логических адресов, которые соответствуют физическому адресу 23195h и не равняются логическим адресам примера 1.

Значение физического адреса 23195h можно получить суммированием двух других логических адресов 2100h:2195h:

0010 0001 0000 0000 0000

+

0010 0001 1001 0101

0010 0011 0001 1001 0101 = 23195h.

Режимы адресации.

Большинство команд процессора вызывается с аргументами, которые в ассемблере принято называть операндами. Например: команда сложения содержимого регистра с числом требует задания двух операндов — содержимого регистра и числа. Далее рассмотрены все существующие способы задания адреса хранения операндов — способы адресации.

    1. Регистровая адресация.

Операнды могут располагаться в любых регистрах общего назначения и сегментных регистрах. В этом случае в тексте программы указывается название соответствующего регистра, например команда, копирующая в регистр AX содержимое регистра BX, записывается как

mov ax,bx

    1. Непосредственная адресация.

Некоторые команды (все арифметические команды, кроме деления) позволяют указывать один из операндов непосредственно в тексте программы, например команда

mov ax,2

помещает в регистр AX число 2.

    1. Прямая адресация.

Если известен адрес операнда, располагающегося в памяти, можно использовать этот адрес. Если операнд — слово, находящееся в сегменте, на который указывает ES, со смещением от начала сегмента 0001, то команда

mov ax,es:0001

поместит это слово в регистр AX. В реальных программах обычно для задания статических переменных используют директивы определения данных, которые позволяют ссылаться на статические переменные не по адресу, а по имени. Тогда, если в сегменте, указанном в ES, была описана переменная word_var размером в слово, можно записать ту же команду как

mov ax,es:word_var

В таком случае ассемблер сам заменит слово «word_var» на соответствующий адрес. Если селектор сегмента данных находится в DS, имя сегментного регистра при прямой адресации можно не указывать, DS используется по умолчанию. Прямая адресация иногда называется адресацией по смещению.

  1. Косвенная адресация.

По аналогии с регистровыми и непосредственными операндами адрес операнда в памяти также можно не указывать непосредственно, а хранить в любом регистре. До 80386 для этого можно было использовать только BX, SI, DI и BP, но потом эти ограничения были сняты и адрес операнда разрешили считывать также и из EAX, EBX, ECX, EDX, ESI, EDI, EBP и ESP (но не из AX, CX, DX или SP напрямую — надо использовать EAX, ECX, EDX, ESP соответственно или предварительно скопировать смещение в BX, SI, DI или BP). Например, следующая команда помещает в регистр AX слово из ячейки памяти, селектор сегмента которой находится в DS, а смещение — в BX:

mov ax,[bx]

Как и в случае прямой адресации, DS используется по умолчанию, но не во всех случаях: если смещение берут из регистров ESP, EBP или BP, то в качестве сегментного регистра используется SS. В реальном режиме можно свободно пользоваться всеми 32-битными регистрами, надо только следить, чтобы их содержимое не превышало границ 16-битного слова.

    1. Адресация по базе со сдвигом.

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

mov ax,[bx+2]

помещает в регистр AX слово, находящееся в сегменте, указанном в DS, со смещением на 2 большим, чем число, находящееся в BX. Так как слово занимает ровно два байта, эта команда поместила в AX слово, непосредственно следующее за тем, которое есть в предыдущем примере. Такая форма адресации используется в тех случаях, когда в регистре находится адрес начала структуры данных, а доступ надо осуществить к какому-нибудь элементу этой структуры. Другое важное применение адресации по базе со сдвигом — доступ из подпрограммы к параметрам, переданным в стеке, используя регистр BP (EBP) в качестве базы и номер параметра в качестве смещения. Другие допустимые формы записи этого способа адресации:

mov ax,[bp]+2

mov ax,2[bp]

До 80386 в качестве базового регистра можно было использовать только BX, BP, SI или DI и сдвиг мог быть только байтом или словом (со знаком).С помощью этого метода можно организовывать доступ к одномерным массивам байт: смещение соответствует адресу начала массива, а число в регистре — индексу элемента массива, который надо считать. Очевидно, что, если массив состоит не из байт, а из слов, придется умножать базовый регистр на два, а если из двойных слов — на четыре. Для этого предусмотрен следующий специальный метод адресации.

6. Косвенная адресация с масштабированием.

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

mov ax,[esi*2]+2

Множитель, который может быть равен 1, 2, 4 или 8, соответствует размеру элемента массива — байту, слову, двойному слову, учетверенному слову соответственно. Из регистров в этом варианте адресации можно использовать только EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, но не SI, DI, BP или SP, которые можно было использовать в предыдущих вариантах.

    1. Адресация по базе с индексированием.

В этом методе адресации смещение операнда в памяти вычисляется как сумма чисел, содержащихся в двух регистрах, и смещения, если оно указано. Все следующие команды — это разные формы записи одного и того же действия:

mov ax,[bx+si+2]

mov ax,[bx][si]+2

mov ax,[bx+2][si]

mov ax,[bx][si+2]

mov ax,2[bx][si]

В регистр AX помещается слово из ячейки памяти со смещением, равным сумме чисел, содержащихся в BX и SI, и числа 2. Из шестнадцатибитных регистров так можно складывать только BX + SI, BX + DI, BP + SI и BP + DI, а из 32-битных — все восемь регистров общего назначения. Так же как и для прямой адресации, вместо непосредственного указания числа можно использовать имя переменной, заданной одной из директив определения данных. Так можно прочитать, например, число из двумерного массива: если задана таблица 10x10 байт, 2 — смещение ее начала от начала сегмента данных (на практике будет использоваться имя этой таблицы), BX = 20, а SI = 7, приведенные команды прочитают слово, состоящее из седьмого и восьмого байт третьей строки. Если таблица состоит не из одиночных байт, а из слов или двойных слов, удобнее использовать следующую, наиболее полную форму адресации.

13

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]