logo search
Методичка

4.2 Реальный режим адресации

В реальном режиме процессор может обращаться только к первым 1’048’576 байтам (1 Мбайт) ОЗУ, поскольку при этом он использует только 20 младших разрядов шины адреса. Следовательно, диапазон адресов памяти, выраженных в шестнадцатеричном представлении, будет составлять от 00000 до FFFFF. Основная проблема, с которой столкнулись инженеры фирмы Intel, состояла в том, что с помощью 16-разрядных регистров процессор 8086 не мог непосредственно работать с 20-разрядными адресами оперативной памяти. Поэтому они придумали специальную схему адресации, которую назвали сегментацией памяти (рис. 1). Суть ее состояла в том, что все доступное адресное пространство (1 Мб) разделялось на блоки размером 216 = 64 Кбайт, которые назывались сегментами. Для указания адреса внутри сегмента использовалось смещение (offset).

Начало каждого сегмента отстояло от начала смежного сегмента на 24 = 16 байт или 10h байт в шестнадцатеричном представлении. Это расстояние называлось параграфом. Поэтому младшая шестнадцатеричная цифра в адресе каждого сегмента равна нулю. Другими словами, адрес любого сегмента всегда будет кратен 16 байтам. А раз так, при записи адреса сегмента последнюю цифру можно опустить. Таким образом, если, например, указано 16-разрядное сегментное значение С000, оно будет соответствовать сегменту, расположенному в памяти начиная с адреса С0000.

По сути, физический адрес ячейки памяти – это обычное число, указывающее ее порядковый номер относительно начала памяти, т.е. нулевого адреса. Как уже было сказано, в реальном режиме линейный (т.е. абсолютный) адрес имеет длину 20 битов, а его значение может находиться в диапазоне от 00000 до FFFFF в шестнадцатеричном представлении. Однако в 16-разрядных программах оперировать 20-разрядными линейными адресами нельзя. Поэтому абсолютные адреса ячеек памяти задаются в виде сегмента и смещения, т.е. двух 16-разрядных чисел, определяющих адрес в форме “сегмент:смещение” следующим образом:

Адреса, заданные в программах в форме "сегмент:смещение", автоматически преобразуются ЦПУ в 20-разрядные физические (линейные) адреса по формуле:

Физический_адрес = Сегмент10h + Смещение.

Пример 1. Рассмотрим фрагмент программы пересылки содержимого байта, расположенного по адресу 08F1:0100, в регистр bl:

mov ax,08F1h

mov ds,ax

mov bl,[0100]

При вычислении линейного адреса ЦПУ должен умножить сегмент на 10h и прибавить к полученному результату смещение, как показано ниже:

08F1  10 = 08F10 (Физический адрес начала сегмента)

08F10 + 0100 = 09010 (Физический адрес ячейки памяти)

Замечание 1. На самом деле содержимое сегментного регистра не умножается на 10h, а сдвигается влево на 4 бита (1 тетраду), что, по сути, выполняет ту же операцию умножения на 10h, но значительно быстрее.

Замечание 2. Ячейка памяти может адресоваться из различных сегментов, т.к. они перекрывают друг друга. К примеру, ячейка, расположенная по смещению 0100 в сегменте 08F1, адресуется из смежного сегмента 08F0. При этом смещение в этом сегменте будет увеличено на один параграф, т.е. на 10h: 08F00 + 0110 = 09010. Обратите внимание, что физический адрес ячейки памяти совпадает с физическим адресом ячейки, определённым в примере 1.