テキスト セグメントには、プログラムの実際のコード、つまりコンパイラによって生成されたマシン コードが含まれます。最後のステートメントの考え方は、C プログラムと、たとえばテキスト エディターはまったく同じものであるということです。メモリから実行される機械語命令にすぎません。
たとえば、次のコードと、x86 アセンブリを思い出せないために今思いついた架空のアーキテクチャを取り上げます。
while(i != 10)
{
x -= 5;
i++;
}
これは、次の指示に変換されます
LOOP_START:
CMP eax, 10 # EAX contains i. Is it 10?
JZ LOOP_END # If it's 10, exit the loop
SUB ebx, 5 # Otherwise, subtract 5 from EBX (x)
ADD eax, 1 # And add 1 to i
JMP LOOP_START # And then go to the top of the loop.
LOOP_END:
# Do something else
これらは、プロセッサが理解できる低レベルの操作です。これらはバイナリ マシン コードに変換され、メモリに格納されます。保存されている実際のデータは、たとえば、5、2、7、6、4、9 である可能性があります。たとえば、私が考えた操作とオペコードの間のマッピングが与えられます。これが実際にどのように行われるかについて詳しくは、アセンブラーとマシン コードの関係を調べてください。
-- Ninja-edit - 上記の RBK のコメントを参考にすると、objdump または同様の逆アセンブラーを使用して、アプリケーションを構成する実際の命令を表示できます。Visual Studio のどこかにあるか、Windows で OllyDbg または IDA を使用できます。
プログラムの実際の命令は読み取り専用である必要があるため、テキスト セグメントは常に同じであるため、プログラムを複数回実行するために複製する必要はありません。
データセグメントに関する質問については、初期化子がないため、char* string
実際にはセグメントに格納されます。.bss
これは、プログラムが実行される前に (crt0 または同等のものによって) クリアされるメモリ領域です。セグメントは.bss
読み書き可能です。
はい、スタック セグメントにはローカル変数が含まれています。実際には、「スタック フレーム」と呼ばれるものが格納されます。これらの 1 つは、呼び出す関数ごとに作成され、互いに積み重ねられます。あなたが言ったように、ローカル変数のようなものと、関数が呼び出されたアドレスのような他の有用なビットと、関数が終了したときに以前の状態を復元できるようにするための他の有用なデータが含まれています。スタック フレームに実際に含まれているものについては、アーキテクチャの ABI (Application Binary Interface) を詳しく調べる必要があります。