1

私はこれについて混乱しています。どちらの場合も違いはないと思いますが、プログラムは最終的にexeファイルになります。違うと思ったら助けてください....

私の質問を明確にさせてください:
アセンブリ プログラムを「スタンドアロン」で作成する場合と、Cプログラムからアセンブリ ルーチンを呼び出す場合とで、データ セグメントの定義または処理に違いはありますか?

どちらの場合も、日付セグメントの位置またはサイズを定義しているのは誰ですか? これはコンパイラですか、それともオペレーティング システムですか? どちらの場合も、データ セグメントの値はどのように決定されたのでしょうか?

4

1 に答える 1

0

オペレーティングシステムに依存!

IA32 の下で Windows オペレーティング システムを探している場合、API はいくつかのアプリケーションの仮想メモリ アドレス空間を予約します。

  • CS セグメントは、プログラムまたはコード メモリの先頭を指します。
  • DS セグメントは、変数またはデータ メモリの先頭を指します。
  • SS セグメントは、スタック メモリの先頭を指し、DS と同じです。
  • 追加セグメントとしての ES は通常、文字列転送命令 (lodsb、stosw、...) に使用され、DS と同じです。
  • Win32 Thread Information Blockのような OS カーネル データ上の別の追加セグメント ポイントとしての FS 。
  • 別の余分なセグメントとしての GS は、ロードされたアプリケーションの割り当てられた仮想メモリ アドレス空間の先頭として 0 です。

FS セグメント経由で「Win32 スレッド情報ブロック」にアクセスする例:

function GetThreadId: integer;
//result := GetCurrentThreadId;
asm
  mov   eax, fs:[$18]      //eax := thread information block
  mov   eax, [eax + $24]   //eax := thread id
end; { GetThreadId }

Sheck また: x86 メモリ セグメンテーション

于 2010-04-25T07:57:30.413 に答える