2

Microsoftのサイト

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

組み込み関数。それはであると述べられていoffsetます

GSの先頭からのオフセットGSはプロセッサレジスタを参照していると思います。

GSは、スタックとどのように関連していますか?または、 GSに関するオフセットを計算するにはどうすればよいですか?

(そして、これや特定の呼び出し規約に関連する「落とし穴」はあります__fastcallか?)

4

3 に答える 3

1

GSレジスタはスタックとはまったく関係がないため、callignconvensionsとは関係がありません。x64バージョンのWindowsでは、オペレーティングシステムデータを指すために使用されます。

ウィキペディアから:

Windows NTファミリのx86バージョンのFSセグメント記述子の代わりに、GSセグメント記述子は、ユーザーモードのスレッド情報ブロック(NT_TIB)とカーネルモードのプロセッサ制御領域(KPCR)の2つのオペレーティングシステム定義の構造を指すために使用されます。したがって、たとえば、ユーザーモードでは、GS:0はスレッド情報ブロックの最初のメンバーのアドレスです。この規則を維持すると、x86-64ポートが簡単になりますが、セグメント化されたアドレス指定自体は最新のオペレーティングシステムでは実際には使用されていませんが、AMDはFSおよびGSセグメントの機能をロングモードで維持する必要がありました。

これらの組み込み関数は、カーネルモード(デバイスドライバーなど)でのみ使用できることに注意してください。オフセットを計算するには、GSが指しているメモリのセグメントを知る必要があります。したがって、カーネルモードでは、プロセッサ制御領域のレイアウトを知る必要があります。

個人的には、これらの用途がどうなるかわかりません。

于 2011-11-24T18:05:41.143 に答える
1

これらの組み込み関数は、対応する fs とともに、OS 固有のデータにアクセスする以外には実際には使用されません。そのため、これらは純粋に Windows 開発者の生活を楽にするために追加された可能性が最も高いです (私はこれをインライン TLS アクセスに個人的に使用しました)。

于 2011-11-24T20:08:52.853 に答える