0

アセンブリについてしばらく勉強し、それに関する多くの優れたチュートリアルを確認して、非常に困惑しています。

完全に理解していないことを行うためのいくつかの指示を覚えることは別として、その有用性のスキーム全体を完全に理解することは驚くほど難しいと言わざるを得ません.

私はオペレーティング システムの開発者および設計者になることを目指しているため、低レベルのハードウェア データ処理、メモリ管理、プロセッサのフェッチ、デコード、およびメモリ セグメンテーション、メモリの使用、ビットとバイトの使用、コール スタックとハードウェア スタック、およびハードウェア自体からの機械レベルのプログラムの仕組み。

私が混乱している主な質問は次のとおりです。

プロセッサは RAM からバイトをフェッチします。ブートローダを書き込むときは、命令を書き込む前にアドレスに「ジャンプ」します。メモリ内のアドレスにジャンプした後に実行される最初の命令 (移動/データ コピーMOV AL, MOV BLのような命令など) は、メモリ内で直接使用されない CPU のパイプライン上のデータを取得します。しかし、命令がメモリからロード/フェッチされる場合、プロセッサはパイプライン上でコード データ セグメントをどのように生成できるでしょうか? それとも、ここですべて間違っていますか?マイクロプロセッサがブートローダーで実行する基本的な手順は何ですか? また、命令がすべてメモリからフェッチされると想定される場合 (たとえば、アセンブリのコード セグメントですが、データ セグメントとテキスト セグメントはすべて命令です)、CPU はメモリを使用せずにパイプラインからコード データを生成する方法を教えてください。プロセッサー用)?

また、私の次の主な質問は、おそらく私よりも経験豊富な人にとっては非常に簡単に答えることができます。

x86 およびその他のアーキテクチャのメモリ/RAM がオフセット付きの「セグメント」として格納されるのはなぜですか? 私にとって、これは必要以上に複雑です。すべてのメモリをより簡単な方法で、線形、アドレス指定、フェッチ、格納、計算、およびレジスタの内外でメモリ セルに移動できないのはなぜですか? これにより、アーキテクチャの説明と理解がより理解しやすくなり、多数のレジスタがメモリベースのデータ ストレージとアクセスの 2 次元セグメントを処理するよりも直接的なものになるのではないでしょうか?

4

1 に答える 1

0

それは「アセンブリ」と「高級言語」以上のものです。

本当の問題は、「リアル」モードと「保護」(仮想メモリ) モードの違いです。

残念なことに、ほとんどの x86 アセンブリの例はたまたまDOSの例です。私見ですが、現代の32/64ビット仮想メモリアーキテクチャ(x86を含むがこれに限定されません)とはほとんど/まったく関連性がありません。

優れたプライマー:

ゼロからのプログラミング

PS:ほとんどの最新の OS (Windows、Linux、Mac OS を含む) では、x86 の場合、アドレス空間は事実上線形です。x86 セグメント レジスタの大部分は、DOS 時代からの時代錯誤です。

興味がある場合は、Linux の起動プロセスの概要を以下に示します。

于 2013-01-08T23:15:42.847 に答える