7

私の知る限り、アセンブリプログラムは 1) コード 2) データの 2 つに分かれています。さて、たとえば c\c++ でコーディングすると、コードがメモリにロードされ、CPU がアセンブリ プログラムとして 1 命令ずつコードの実行を開始します。私の質問は: 1. c コードはどこに保存されていますか? つまり、Visual Studio でプログラムを実行しているとき、コードはそれらの 1 つ (ヒープ、スタックなど) にロードされますか? 2. したがって、メモリはスタック、ヒープ、および日付セグメントに仮想的に分割されますが、CPU がプログラムをアセンブリ プログラムとして実行すると、それらはすべて同じデータ領域を持つ 1 つのアセンブリ プログラムであるか、または 2 に形成されます。または、あるアセンブリから別のプログラムにジャンプする 3 つのアセンブリ プログラムはありますか?

** この質問を追加させてください。私の意図が明確になるかもしれません。C プログラムを起動すると、コード (機械語命令) がメモリにロードされます。つまり、これは 1 つのアセンブリ プログラムです。しかし、メモリ分割はどのように行われるのでしょうか? つまり、スタック、データセグメントなどのさまざまなメモリセクションがアセンブリプログラムをどのように変更するのでしょうか?

4

2 に答える 2

8

ウィキペディアから:

PC アーキテクチャは、プログラム内のいくつかの基本的な読み取り/書き込みメモリ領域、つまりスタック、データ、およびコードをサポートしています。ヒープは、プログラムで使用できるアドレス空間のもう 1 つの領域です。この領域から、malloc や free などのシステム コールに応答してオペレーティング システムがメモリを動的に割り当てたり解放したりできます。

全文を読むことをお勧めします

SOに関するこの質問もあります: ヒープ、スタック、テキストなどのさまざまなセグメントは、物理メモリにどのように関連していますか?

また、これらの記事は読む価値があるかもしれません。特に最後のもの:

質問に答えるには:

1. c コードはどこに保存されていますか?

コード セグメント内。

2. したがって、メモリは仮想的にスタック、ヒープ、および日付セグメントに分割されます。

リアル モードでは、はい。保護モードでは…依存します。非常に単純化すると、プログラムメモリは物理メモリにマップされます。各プログラムは、独自のアドレス空間に存在します。

さらに詳しく知りたい場合は、次の記事をお勧めします。

3.しかし、CPUがプログラムを実行すると、アセンブリプログラムとして、それらはすべて同じデータ領域を持つ1つのアセンブリプログラムですか、それとも、たとえば2つまたは3つのアセンブリプログラムに形成され、1つから別のプログラムにジャンプしますか?

いいえ、ジャンプはありません。プロセッサ レジスタは、次に実行する命令を指しています。他の人はスタックなどを指しています。

于 2013-04-03T16:37:37.923 に答える
7

セグメントまたはセクションは、本の章のように、オブジェクト ファイルと実行可能ファイルの連続した分割です。stack セクションと bss セクションはファイルには存在しませんが、実行時に作成されます。

セクションの主なポイントは、オペレーティング システムがさまざまな方法で保護できる領域にプログラムを分割することです。そのために、セクションがページ境界から始まり、メモリ内で連続している必要があります。

基本的な (「重要な」) セクションは...

テキストまたはコード- OS はこのセクションを書き込み禁止にし、不変であるため、同じ実行可能ファイルを実行している複数のプロセスまたはスレッド間で共有することもできます

data - OS はこの r / w をマッピングし、直接共有しません

bss - このセクションは、ゼロで初期化されたデータで構成されます。

スタック- 通常はプログラムから分離され、一般に上位アドレスから下に向かって成長します

最後の 2 つのセクションは、初期化を必要としないため、実行可能ファイルには含まれていません。

それらがどのように実装されているかについて質問されている場合は、アセンブラーとリンカーが目次を作成し、本の章のようにバイナリでセクションを書き出します。次に、OS はそれらを個別に読み取り、アドレス空間の異なるセクションに配置します。

Unix ライクなシステムと Windows では仕様と用語が異なりますが、原則は同じです。


1.そうそう、コピーオンライトでは、データの共有も可能です。

于 2013-04-03T18:29:08.983 に答える