формула физического адреса в 16-битном реальном режиме? - PullRequest
1 голос
/ 24 июня 2010

физический адрес = 16 * селектор + смещение но я не знаю, почему умножение 16 на селектор?

Ответы [ 4 ]

4 голосов
/ 24 июня 2010

Чтобы быть «совместимым с программистом» с Z80, но при этом иметь возможность использовать более 64 КБ памяти, ранние процессоры Intel представили сегментация памяти .16-битный сегмент будет сдвинут влево на 4 бита (что означает умножение на 16, а , а не 64, как утверждает ваш вопрос) перед добавлением к 16-битному смещению, что приведет к 20-битному адресу.1005 *

Для программистов, привыкших к Z80, все, что требовалось, - это использовать сегменты, предоставляемые ОС, и они могли бы использовать заданное смещение в 64 килобайта, как им заблагорассудится.Новые программисты могут выполнять более сложные манипуляции с сегментами, предоставляя им доступ к 1 МБ адресного пространства (IBM PC сократил его до 640 КБ, но по своей собственной причине).

2 голосов
/ 20 апреля 2011

Целью 8088/8086 было предоставить средство, с помощью которого 16-разрядный процессор мог бы иметь адресное пространство в 1 мегабайт, при этом программистам не приходилось бы делить адресное пространство на куски по 64 КБ и беспокоиться о том, пересекают ли адреса границымежду ними.Несмотря на то, что он был сильно порочен, на самом деле он лучше, чем любой другой подход, который я видел для работы с адресами, размер которых превышает размер регистра.Это часто работает относительно легко в тех случаях, когда данные естественным образом подразделяются на элементы размером 64 КБ или меньше, и когда допустимо начинать элементы, начиная с 16-байтовых границ.Умножение на 16 (вместо некоторого большего или меньшего числа) было, вероятно, произвольным, но оно удобно работает при перечислении вещей в шестнадцатеричной записи, и это был хороший компромисс между использованием двух небольших чисел (что ограничило бы адресное пространство дополовина мегабайта или меньше) или слишком большое число (для этого потребовалось бы больше кода, чтобы либо справиться с произвольными смещениями для выделенных блоков, либо тратить больше блоков заполнения памяти на большее кратное число).

Единственный основнойНедостатки в конструкции сегментации 8088, на самом деле, таковы:

  1. Двух регистров сегментации общего назначения недостаточно "достаточно".Распространенным шаблоном является «копирование данных из одного объекта в другой объект с использованием третьего объекта для его перевода»;этот шаблон может быть эффективно реализован, только если один из объектов находится либо в сегменте кода, либо в стеке.К сожалению, это не было исправлено до 80386 года, где обычной практикой было игнорировать сегменты.
  2. Не было никакого хорошего способа сделать какую-либо арифметику на сегментных регистрах.Инструкции по добавлению или вычитанию 0x1000 из DS или ES (или FS или GS), либо если перенос был установлен, либо безоговорочно - всего восемь (или шестнадцать) кодов операций - значительно облегчили бы обработку сегментов.
  3. Должны были быть инструкции "mov seg, немедленные".

Несмотря на то, что программисты часто ворчали о 8088/8086 в те времена, это было намного лучше, чем у любого другого 16-битного процессора, который я видел тогда или с тех пор (примечание: 68000 я считаю 32-битнымпроцессор).

2 голосов
/ 24 июня 2010

64? Конечно? Прочитайте, например, википедии . Умножение на 64 похоже на смещение влево на 6 бит (в Википедии сказано, что оно должно быть 4, т. Е. * 16), то есть все равно, что сказать, что селектор представляет наиболее значимые 16 бит 22-битного адреса (википедия сообщает 20). Это настоящий режим, как описано в википедии (лучше, чем я могу).

1 голос
/ 24 июня 2010

Не знаю, почему умножить 64 на селектор?

16-битный указатель может легко адресовать 64 КБ.

Разработчики ЦП хотели иметь возможность адресовать 1 МБ.

Таким образом, вместо того чтобы использовать один 16-битный указатель, они указали, что указатель будет реализован двумя регистрами, то есть сегмент-смещение, где «сегмент» - это 16-битный регистр, значение которого умножается на 16 заказ на адрес 1 МБ.

Значение (16) получается путем деления требуемого диапазона адресов (1 МБ) на естественную адресуемость 16-разрядного размера регистра (64 КБ) ... т.е. 16 получается из 1 МБ / 64 КБ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...