汇编程序:使用寄存器库计算内存地址

时间:2013-06-20 09:53:08

标签: assembly ida addressing

我有这个简单的汇编程序命令:

mov eax, fs:[30h];

我的问题是我需要知道这个命令真正读取的具体地址。我发现了很多关于汇编程序寻址模式的文档,但没有关于寄存器:表示法的文档。

有人可以解释一下地址计算背后的数学吗?

3 个答案:

答案 0 :(得分:3)

FSSegment 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)

最好的解释(甚至包括图片)放在这里:

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

第4章是你应该阅读的内容。