2013-12-21 3 views
1

Я немного запутался в использовании двоеточия в сборке x86. Я знаю, что в реальном режиме %gs:0x14 будет адресом %gs сдвигом 4 бита слева и добавляет 0x14. Но в защищенном режиме это одно и то же? Например, в защищенном режиме,Как интерпретировать% gs: 0x14?

movl %gs:0x14 %eax 

В каком смысле %gs:0x14 доступен? Это как 0x14(%gs) или то же, что и в реальном режиме?

Обновление: , чтобы уточнить мой вопрос, предположим, %gs = 0x1234 что такое значение% eax после инструкции movl %gs:0x14 %eax.

Дополнительная информация:

Просто нашел этот документ полезным для функции гс и фс в другой системе http://www.akkadia.org/drepper/tls.pdf

И эта ссылка предоставляет информацию о сегменте: смещение адреса.

http://thestarman.pcministry.com/asm/debug/Segments.html

+0

Возможный дубликат [Что делает двоеточие: среднее значение в синтаксисе GAS для сборки x86, как в% ds: (% bx)?] (Http://stackoverflow.com/questions/18736663/what-does-the-colon- mean-in-x86-assembly-gas-syntax-as-in-dsbx) –

ответ

1

Во-первых, давайте рассмотрим условия. Кажется, вы используете «защищенный режим» вообще, в отличие от реального режима. Но, по крайней мере, в руководствах Intel, этот термин применим только для 32-битного режима. Для 64-битного режима они используют плохой маркетинговый термин «режим IA-32e», который ужасен по сравнению с «длинным» режимом AMD, но оба по-прежнему скрывают тот факт, что 64-битный режим также защищен.

Эта разница важна, так как обработка% gs различна для 32- и 64-разрядного защищенного режима. Для 32 бит это еще один регистр сегментов. Код переключения потоков заполняет его базой сегмента для текущего потока в одном и том же виртуальном пространстве, поэтому, в отличие от {CS, DS, ES, SS}, его база не равна нулю в плоском режиме. Для 64 бит это просто смещение, хранящееся в процессоре MSR, а также измененное планировщиком на текущий адрес TLS потока. (Информация о деталях может различаться между Linux/* BSD/Windows и т. Д., Из которых% fs и% gs используется для какой роли.) Но, как общий результат, при просмотре доступа, например% gs: 0x14, вы должны понимать, что

  • Г.С. базовый адрес получил (с использованием, как указывалось выше, общий способ для 32 битов и специальных MSR на основе обработки по 64 бита nvironment)
  • 0x14 добавляется к этому адресу

и это все, что вам нужно знать, если вы не разрабатываете ядро ​​или другую глубоко системную вещь, например, Вино.

+0

Отличный ответ. Но разве это не 64-битная архитектура Intel IA-64? И AMD64/x86-64 совместим с реальным, защищенным и длинным режимом. Protected используется только в 32-битной системе. – AuA

+1

@AuA IA-64 - это совершенно другая архитектура без каких-либо% gs. Когда Intel осознала, что IA-64 потерпел неудачу, они украли и переименовали AMD64 как IA-32e, EM64T и, наконец, «Intel 64». Скажем спасибо Intel за этот беспорядок. Длинный режим (режим IA-32e в терминах Intel) защищен в смысле защиты на уровне страницы на уровне виртуальной памяти, привилегированных командах и т. Д., Но сегментация отключена, несмотря на то, что она еще должна быть настроена; и он имеет 32- и 64-разрядные подмаги, но 32-разрядный подканал отличается от старого защищенного режима. Да, все это настоящая головная боль для системных программистов. – Netch

1

Вы должны внимательно прочитать application binary interface спецификации для вашей архитектуры (вероятно x86-64), т.е. X86-64 ABI.

Вы узнаете, что %gs связан с локальным хранилищем потоков. См. this answer.

Так что ваша машинная инструкция, вероятно, загружает слово со смещением 0x14 текущего TLS.

+0

В этом документе нет объяснений.Я понимаю, что gs используется как интерфейс для локального хранилища потоков, но я просто не знаю, как он доступен в% gs: 0x14. – AuA

Смежные вопросы