2011-11-24 11 views
2

在微软的网站上可以找到的__addgs *如何使用,什么是GS?

__addgsbyte (offset, data) 
__addgsword (offset, data) 
__addgsdword (offset, data) 
__addgsqword (offset, data) 

内在功能some details。据称,

offset 

从GS开始的偏移量。我推测GS是指处理器寄存器。

GS如何与堆栈相关?另外,我怎样才能计算一个偏移量与GS

(而且,还有什么 '陷阱' 关于这一点,具体的调用约定,如

__fastcall 

?)

感谢。

回答

1

GS寄存器根本不涉及堆栈,因此与呼号对流无关。在Windows的64位版本,它是用来指向操作系统数据:

wikipedia

而是在Windows NT 家庭的86版本的FS段描述符,GS段描述符是用来指向到两个操作系统 定义的结构:用户模式下的线程信息块(NT_TIB)和内核模式下的处理器控制区域(KPCR) 。因此,例如,在 用户模式下GS:0是线程 信息块的第一个成员的地址。保持这种约定使得x86-64端口更容易,但要求AMD在长模式下保留FS和GS段的功能 - 尽管分段寻址本身并不是 真正用于任何现代操作系统。

请注意,这些内在函数仅在内核模式下可用(例如设备驱动程序)。要计算偏移量,您需要知道GS所指向的内存段。所以在内核模式下,您需要知道处理器控制区域的布局。

我个人不知道这些用法是什么。

+0

感谢(所有)的信息。即使在否定的情况下也有答案。现在我将专注于解决我的问题的其他方法(例如,外部装配,更高级别的内部函数,内部'直接'翻译......)。 – Rhubbarb

+0

我意识到这是一个迟到的评论,但似乎[有关内部函数的声明仅适用于内核模式](http://msdn.microsoft.com/en-us/library/htss0hyy(v = vs80) .aspx)是_false_。我刚刚使用'__readgsdword'创建了一个用户模式应用程序,并且使用Visual Studio 2010和Windows Server 2008 DDK为x64编译。 – user1354557

1

这些内在函数,除了访问操作系统特定的数据外,其他同行都没有真正的用途,因此它最有可能是纯粹为了让Windows开发人员更加容易生活而已(我个人曾将其用于内联TLS访问)

相关问题