您链接的文档说:
将值添加到由相对于 GS 段开头的偏移量指定的内存位置。
这意味着它是这个 asm 指令的内在属性:(具有 GS 段覆盖add gs:[offset], data
的普通内存目标add
)与您选择的操作数大小。
编译器大概可以为offset
部件选择任何寻址模式,并且data
可以是寄存器或立即数,因此偏移量和数据中的一个或两个可以是运行时变量或常量。
实际访问的线性(虚拟)地址将是gs_base + offset
,其中 gs_base 通过 MSR 设置为任何地址(由操作系统自行设置,或由您进行系统调用)。
至少在用户空间中,Windows 通常将 GS 用于 TLS(线程本地存储)。声称此内在函数仅适用于内核代码的答案是错误的。它不会添加到GS 基址,它会在相对于现有 GS 基址的地址处添加到内存中。
MS 似乎只记录了 x64 的这种内在特性,但它也是 32 位模式下的有效指令。IDK 为什么他们会费心限制它。(当然除了 qword 形式:64 位操作数大小在 32 位模式下不可用。)
也许编译器不知道如何将__readgsdword
/ (对该数据的操作) /优化__writegsdword
为具有相同 gs:offset 地址的内存目标指令。如果是这样,这个内在将只是代码大小的优化。
但也许有时强制编译器将其作为一条指令执行以使其成为原子 wrt 有时是相关的。此内核上的中断(但不包括其他 CPU 内核的访问)。IDK 如果这是一个预期的用例;这个答案只是解释了一行文档在 x86 asm 和内存分段方面的含义。