Ассемблер: Как сегменты используются в 32-битных системах?

Насколько я знаю, еще во времена 16-битных ПК у нас были регистры сегментов, содержащие адрес каждого типа сегмента, и вы могли получить доступ к смещению с чем-то вроде этого SS: [EDI], это будет принимать значение, содержащееся в EDI, как смещение к сегменту стека.

Теперь я знаю, что в 32-битных системах у нас есть GDT (глобальная таблица дескрипторов) и LDT (локальная таблица дескрипторов), сегменты теперь содержат индекс в этой таблице, и можно вычислить смещение, которое указывало бы на правильный адрес памяти.

Я правильно понимаю?

PUSH DWORD PTR SS: [EBP + 8]; basicbof.00401000

Итак, что будет означать подобное утверждение в 32-битной ОС (XP SP2)?


person Tony The Lion    schedule 26.07.2010    source источник


Ответы (3)


Регистры сегментов теперь содержат селекторы. Каждый селектор является индексом в глобальной или локальной таблице дескрипторов плюс запрошенный уровень безопасности.

Например:

mov ds, 0x0000

Поставит селектор 0 из таблицы 0 (GDT), с доступом 0 уровня к DS. (Это специальный регистр, который используется для проверки нулевого указателя).

Таблицы содержат информацию о длине базы и длине для каждого селектора, поэтому больше не ограничиваются 64 КБ (но могут быть любыми от 0 до 4 ГБ).

Лучший способ узнать об этом - прочитать (свободно распространяемую) документацию по процессорам Intel.

Изменить: ссылка

person sukru    schedule 26.07.2010

phu - 10 лет спустя мои знания немного устарели.

sukru ответ - это то, что я помню.

Я бы интерпретировал ваш оператор сборки как: Возьмите DWORD в StackSegment: BasePointer + 8 (= локальная переменная или параметр метода - не могу вспомнить) и поместите его в стек

person Arthur    schedule 26.07.2010

Обратите внимание, что SS DS ES и т. Д. Селекторы бессмысленны на уровне пользователя, потому что они указывают на одни и те же (обычно 4-килобайтные) страницы. Я не знаю, как обстоят дела с программированием ядра ...

person Quonux    schedule 26.07.2010