В общем случае на сегментированной платформе вы не можете просто прочитать значение указателя "в eax
", как вы предлагаете.На сегментированной платформе указатель, как правило, будет содержать как значение сегмента, так и значение смещения, что означает, что чтение такого указателя будет означать инициализацию как минимум двух регистров - сегмента и смещения - не только одного eax
.
Но в отдельных случаях это зависит от так называемой модели памяти.Компиляторы на сегментированных платформах поддерживают несколько моделей памяти.
Для начинающих, по понятным причинам, не имеет значения , какой регистр сегмента вы используете, пока регистр сегмента содержит правильное значение.Например, если регистры DS
и ES
содержат одно и то же значение внутри, то DS:<offset>
будет указывать на то же место в памяти, что и ES:<offset>
.
В так называемой «крошечной» модели памяти, например, все регистры сегментов содержали одно и то же значение, т.е. все - код, данные, стек - помещалось бы в одном сегменте (которыйименно поэтому он назывался "крошечный").В этой модели памяти каждый указатель был просто смещением в этом сегменте, и, конечно, просто не имело значения, какой регистр сегментов использовать с этим смещением.
В «больших» моделях памяти вы могли иметь отдельные сегментыдля кода (CS), стека (SS) и данных (DS).Но в таких моделях памяти указатель обычно содержит и смещение и сегментную часть адреса внутри него.В вашем примере указатель p
на самом деле будет двухкомпонентным объектом, содержащим одновременно значение сегмента и значение смещения.Чтобы разыменовать такой указатель, компилятор сгенерирует код, который будет считывать значения как сегмента, так и смещения из p
и использовать их оба.Например, значение сегмента будет считано в регистр ES
, а значение смещения будет считано в регистр si
.Затем код получит доступ к ES:[di]
, чтобы прочитать значение *p
.
Существуют также «промежуточные» модели памяти, когда код будет храниться в одном сегменте (CS), тогда как данные и стек будут обахранятся в другом сегменте, поэтому DS
и SS
будут содержать одно и то же значение.Очевидно, что на этой платформе не было необходимости различать DS
и SS
.
В самых больших моделях памяти вы могли иметь несколько сегментов данных.В этом случае довольно очевидно, что правильная адресация данных в сегментированном режиме - это на самом деле не вопрос выбора правильного сегментного регистра (как вы, кажется, верите), а скорее взятие в значительной степени любого сегментного регистраи инициализировать его с правильным значением перед выполнением доступа.