Ассемблер: вычисление адреса памяти с регистровой базой

У меня есть эта простая команда ассемблера:

mov eax, fs:[30h];

Моя проблема в том, что мне нужно знать, какой конкретный адрес действительно читается этой командой. Я нашел много документации о режимах адресации ассемблера, но ничего о нотации register:.

Может ли кто-нибудь объяснить мне математику расчета адреса?


person Robert    schedule 20.06.2013    source источник
comment
О каком конкретно ассемблере вы говорите?   -  person bash.d    schedule 20.06.2013
comment
Тот, который используется Ida Pro. Есть ли разница?   -  person Robert    schedule 20.06.2013
comment
У разных ассемблеров разный синтаксис, так что да.   -  person bash.d    schedule 20.06.2013
comment
Защищенный или реальный режим?   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 07.11.2015
comment
Возможный дубликат Что означает DS:[40207A] в сборке?   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 07.11.2015


Ответы (3)


FS — это индекс в таблице дескрипторов сегментов, которые, в свою очередь, содержат базовый адрес, который добавлено в адрес. В win32 FS используется для доступа к блоку информации о потоке (или, точнее, дескриптор сегмента, индексируемый FS, имеет базовый адрес, так что FS:[0] является началом TIB), а FS:[30h] — это расположение указателя на блок среды процесса. . В win64 для доступа к TIB используется GS.

person harold    schedule 20.06.2013
comment
Спасибо за описание, но я знаю, что делает код. Мне нужно рассчитать адреса памяти, чтобы я мог получить доступ к TIB вручную без кода... - person Robert; 20.06.2013
comment
@ Роберт без кода..? Ну, вы можете запустить VMMap и посмотреть, где находятся TIB (они находятся на более высоких адресах). - person harold; 20.06.2013
comment
Спасибо за подсказку VMMap, теперь я знаю адрес, где искать TIB. В любом случае было бы интересно понять вычисление адреса ассемблера x86. - person Robert; 21.06.2013

Чтобы получить базовый адрес сегмента FS в Win32, вы можете использовать функцию GetThreadSelectorEntry (только для x86).

Если вы пишете отладчик, вы можете использовать значение lpThreadLocalBase из структур CREATE_THREAD_DEBUG_INFO/CREATE_PROCESS_DEBUG_INFO, которые отправляются отладчику для каждого нового потока или процесса. Это указывает на TEB потоков и работает для процессы как x86, так и x64 (на x64 регистр GS используется для TEB).

person Igor Skochinsky    schedule 20.06.2013

Лучшее объяснение (и даже с картинками) размещено здесь:

http://flint.cs.yale.edu/cs422/doc/art-of-asm/pdf/

Глава 4 - это то, что вам следует прочитать.

person icbytes    schedule 20.06.2013
comment
Регистр fs является 16-битным регистром, поэтому простое добавление смещения не дает корректного указателя. - person Robert; 20.06.2013
comment
Хорошо, я отредактировал его, чтобы сохранить ссылку на самую мощную книгу по ассемблеру, которую я когда-либо читал (и до сих пор читаю). - person icbytes; 21.06.2013