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

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

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

Правильно ли мое понимание?

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

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

Ответы [ 3 ]

3 голосов
/ 26 июля 2010

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

Например:

mov ds, 0x0000

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

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

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

Редактировать: ссылка

0 голосов
/ 27 июля 2010

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

0 голосов
/ 26 июля 2010

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

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

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

...