我有这个简单的汇编程序命令:
mov eax, fs:[30h];
我的问题是我需要知道这个命令真正读取的具体地址。我发现了很多关于汇编程序寻址模式的文档,但没有关于寄存器:表示法的文档。
有人可以解释一下地址计算背后的数学吗?
答案 0 :(得分:3)
FS
是Segment Descriptors表的索引,后者又包含一个基地址,该地址被添加到地址中。在win32上,FS
用于访问线程信息块(或者更准确地说,由FS
索引的段描述符具有基地址,使得FS:[0]
是TIB的开始)和FS:[30h]
是指向进程环境块的指针的位置。在win64上,GS
用于访问TIB。
答案 1 :(得分:1)
要获取Win32中FS
段的基址,可以使用GetThreadSelectorEntry
函数(仅限x86)。
如果您正在编写调试器,则可以使用lpThreadLocalBase
/ CREATE_THREAD_DEBUG_INFO
结构中的CREATE_PROCESS_DEBUG_INFO
值,这些结构将发送到每个新线程或进程的调试器。这指向线程的TEB
并且适用于x86和x64进程(在x64上,GS
寄存器用于TEB)。
答案 2 :(得分:-1)