Как преобразовать адрес памяти в адрес сегмента кода?

Как я могу преобразовать адрес в 16-битный сегмент кода (регистр CS)? Например, если сегмент.text начинается с 00E51000, как рассчитывается регистр CS для этого сегмента? Этот вопрос относится к 32-битной архитектуре x86.

1 ответ

В 32-битном режиме вы можете (и обычно должны) всегда использовать значение CS, которое ссылается на запись GDT с base=0 / limit=-1. Если вы работаете в пользовательском пространстве под основной операционной системой, ваш процесс уже начнется в этом случае. Фактически DS/ES/SS будет настроен таким же образом, то есть модель с плоской памятью. (FS или GS могут иметь ненулевую базу для локального хранилища потока.)

Затем вы можете ссылаться на память в этом разделе / ​​сегменте со смещением = 0x00E51000. например mov eax, 0x00E51234 / jmp eax ,

С DS/ES/SS, также равным 0 / -1, у вас есть модель плоской памяти, где mov eax, [0x00E51234] загружает те же байты, к которым вы бы перешли.

Другие вопросы по тегам