Как получить адрес сегментной памяти, когда у меня есть физический адрес?

Физический адрес ячейки памяти представлен в виде 1A32H. Какой адрес начала сегмента памяти. Или, точнее, адрес seg: off, который я должен использовать для доступа к нему.

Может кто-нибудь объяснить мне пошагово, как решить эту проблему?


person Alchemisz    schedule 10.06.2020    source источник
comment
Какой тип процессора вы используете? x86 в реальном режиме? x86 в защищенном режиме? Любой другой тип ЦП с сегментами (например, 65C816)?   -  person Martin Rosenau    schedule 10.06.2020
comment
Я использую x86 в реальном режиме   -  person Alchemisz    schedule 10.06.2020


Ответы (1)


В реальном режиме x86 физический адрес рассчитывается как:

16 * сегмент + смещение

Таким образом, к физическому адресу 1A32H можно получить доступ разными способами:

Сегмент = 1A3H, Смещение = 2 или
Сегмент = 1A2H, Смещение = 12H или
Сегмент = 1A1H, Смещение = 22H или
...
Сегмент = 0, Смещение = 1A32H

Это зависит от вашего варианта использования, какую комбинацию сегмента и смещения вы выбрали:

Если адрес является начальным адресом диапазона памяти (например, первого элемента массива), вы должны использовать более высокое значение сегмента (сегмент 1A3H, смещение 2H).

Если адрес является конечным адресом диапазона памяти (например, начальный указатель стека), вы должны использовать меньшее значение сегмента (сегмент 0, смещение 1A32H).

Также обратите внимание, что смещение - это 16-битное число.

Таким образом, к физическим адресам> = 2 ^ 16 нельзя получить доступ, используя значение сегмента 0:

Доступ к адресу 1A325H (в качестве примера) можно получить, используя:

Сегмент = 1A32H, смещение = 5 или
Сегмент = 1A31H, смещение = 15H или
...
Сегмент = 0A33H, смещение = 0FFF5H

person Martin Rosenau    schedule 10.06.2020