2017-04-06 1 views
0

私はアセンブリ言語が初めてです。コードセグメントやデータセグメントなどのメモリセグメントを初期化するときはいつでも、OSはそのためにメモリの一部を割り当てます。しかし、私は自分の本が「記憶の一部」を意味することで本当に混乱しています。 RAMのコードセグメントは特定のものですか?アセンブリ言語:異なるセグメント....それらはRAMに格納されていますか?

+0

あなたはx86について話していますか?はいの場合は、セグメント*レジスタ*またはアセンブラで記述できるセグメント表現について話していますか?残念ながら、「セグメント」はx86の文献ではかなりオーバーロードされています。 –

+0

はい...私はx86を指しています。セグメントレジスタは、メモリセグメントのアドレスを保持する。私の質問は、例えば、データセグメントを初期化するためにアセンブラで命令を書くとき....そのデータセグメントがRAMの内部で作成されたかどうかです。 – Eliza

+1

あなたが 'mov ax、@data/mov ds、ax'のようなことをしたら?いいえ、セグメントはローダによって実行可能ファイルからロードされます。実行しているのは、正しい位置を指すようにレジスタを設定することです。 DOSのようなOSでは、すべてのメモリにアクセスすることができます。セグメントレジスタを適切に設定することで、必要なメモリをすべて "割り当てる"(またはより使いやすくする)ことができます。 –

答えて

1

はい!通常、すべてのセグメントがRAMにロードされます。効率性とセキュリティ上の理由から、さまざまなセグメントを区別しています。たとえば、テキストは実行可能だが書き込みはできないが、データは書き込み可能だが実行可能ではないため、テキストとデータを区別する。

埋め込みプラットフォームでは、RAMの代わりにEEPROMまたはフラッシュROMに存在するセクションがあるため、貴重なRAMを浪費することはありません。プログラマーにとって、唯一の違いは、特別な準備をしない限り、そのようなセクションに書き込むことができないことです。

+0

私はx86を参照しています。だから私は、例えばデータセグメントを初期化するために、アセンブラで命令を書いて....そのデータセグメントは、RAMの内部に作成されますか?または、コードセグメントを(.CODEを指定して)初期化すると... RAM内に保存される命令はありますか?質問は愚かですが、本は実際にこれを指定していません – Eliza

+1

はい!どちらも最終的なバイナリでRAMにロードされています。 – fuz

2

あなたはコメントで参照の数を持っているが、私はあなたのコアの質問に答える際に考慮すべき異なる状態があることを追加したい:

  1. あなたのコードをコンパイルしてリンクすると、それは書き込みその結果を実行可能ファイルまたはライブラリとしてディスクに保存します。
  2. ディスクイメージでは、コンパイラ/リンカがさまざまなセグメントに関する情報をエンコードします。
  3. 実行可能ファイル/ライブラリがロードされると、OSはRAMに宣言したセグメントを設定し、セグメントが適切な特権で占有するメモリページを(noted by fuzのように)マークします。
  4. セグメントの内容全体が読み込まれてRAMにロードされるかどうかは、実行しているプラ​​ットフォームによって提供される多数の要因と最適化によって決まります。あなたは他の場所でそれを調べることができます...
関連する問題