アセンブリ言語では、セグメントレジスタに保存された値に10が掛け算されるのはなぜですか?私は非常に多くの本で答えを見つけようとしましたが、私は答えませんでした。セグメントレジスタに保存された値に10を掛けたのはなぜですか?
答えて
最初に、アセンブリは単一の言語でも、実装が単一のものでもありません。あなたは誰が適切な答えを出すためにどのアーキテクチャについて話しているかを言わなければならないでしょう。
第2に、セグメントレジスタには常に10が乗算されません。 10が2進数のシステムの自然数ではないので、10倍しないと言っています。
x86アーキテクチャで物理アドレスを取得する理由について質問している場合、CPUは0x10(16進数)でセグメントレジスタを掛け、オフセットを追加します。これは設計者が選択したためです。
次に、なぜ彼らはそれを選んだのですか? 16ビットセグメントレジスタは0〜65535の値を保持できます。これを16倍して0〜1048575のアドレスを取得します。これは1MBです。 1MBは、アクセスするのに最適なメモリ量です。
他のアーキテクチャは、定数でなくても、異なる乗数を持つことがあります。しかし、ほとんどの場合、常に2のべき乗になるでしょう。
デザインの決定は1974年に戻る必要があることを理解するために。
当時、私たちは今日の小型化はできませんでした。パッケージで製造されることは非常に小さかった。
1974年は、インテルが64ビットのアドレスバスを搭載したチップである8080を導入した年であり、最大64KBのメモリがアドレス可能であったことを意味します。
しかし8080はほとんど8ビットのレジスタを持っていたので、プログラマは通常2つのレジスタをペアにして16ビットのアドレスを形成する必要がありました。
一方、1976年には新しいチップの設計、8086が始まりました。
デザイナーは、メモリの64 KiBが低すぎることを認識したので、メモリアドレッシング専用のピン数を増やすことに決めましたが、チップパッケージのピン数には依然として大きな制限がありました。
この新しいチップでは、20ビットのアドレス、または1 MiBのアドレス指定可能なメモリをセトリングしました。
- ピン数:我々は原因-効果のサイクルに入り、なぜ20ビットを考慮すると
、我々は他の二つの重要な要因の中で、検討する必要があります。それは可能な限り低くなければなりません。 - レジスタのサイズ。 16ビットの数値で20ビットの数値をどうやって作るのですか?
16ビットでは足りなかったので、より多くのビットが必要でしたが、最も簡単な解決策は2つのレジスタをペアにする32ビットを使用することでした。
しかし、32ビットは多すぎました!
次の明白な選択肢は、8(倍数)の倍数である24、16 + 8でした。
しかし、まだ24ビットが多すぎました。 Intel 8008 to 8086 by Stephen P. Morse et a, Pag. 17によれば、彼らはこの仮説を考慮しましたが、拒否されました。
8の倍数を持つことができない場合、少なくとも4の倍数(ニブル)を持つことができます。
こうして彼らは20ビットに収まった。
質問が発生しました:どのようにして16ビットの数値で20ビットの数値を作りますか? インテルの設計者は、よく知られているセグメンテーションの仕組みを選択しました。数値(セグメント)の1つが4だけ左にシフト(16または10hを乗算)されてから両方が加算されます。
より簡単な方法は、セグメントレジスタの下位ニブルからアドレスの余分な4ビットを直接取ることでした。
これらは、例えば、様々な理由のためにこれを拒否したことがあります。A)それはセグメントの12ビットBを浪費)多分それは、任意のALUコンポーネントCを再利用することができなかった)はアドレスエイリアシングを許可しません。
いずれかの方法が選択され、その結果、x86互換CPUはすべてこのセグメンテーションモデルを実装する必要があります。これは歴史的遺産です。
このモデルは80286以降に拡張され、x64プロセッサでは非推奨です。
- 1. onPause()のSharedPreferencesに保存された値がonResume()に復元されないのはなぜですか?
- 2. 保存された値が常に私のプログラムで消去されるのはなぜですか?
- 3. セグメントレジスタの値を変更できないのはなぜですか? (MASM)
- 4. タイプ消去後に情報が保存されたのはなぜですか?
- 5. Googleのスプレッドシートのセルに保存されている値にテキストボックス値を掛ける
- 6. アップロードされた画像が春に特定のフォルダに保存されないのはなぜですか?
- 7. 1列の値によって、10列内の行を掛け
- 8. Rails:関連付け値を保存できないのはなぜですか?
- 9. 関連付けられたオブジェクトが保存されないのはなぜですか?
- 10. Neo4j - ブラウザインターフェイスに保存されたスクリプトが保存されない
- 11. 保存または表示されないタグは、なぜですか?
- 12. 生成された各要素の値を掛ける
- 13. マーシャルされたオブジェクトがネイティブコード内で変更された値を保持しないのはなぜですか?
- 14. ボタンをクリックして保存されたEdittext値(保存されたファイル)をクリアするには?
- 15. ネストされたtry-catchを掛ける
- 16. v8で生成されたバイナリにネイティブのjavascriptのソースコードが保存されるのはなぜですか?
- 17. アップロードされた画像がデータベースに保存されないのはなぜですか?
- 18. 異なる種類のSQLデータベースに保存された値
- 19. テーブル内でフォームまたはスプレッドシートに保存されたオプションを保存する
- 20. ファイルが保存されないのはなぜですか?
- 21. なぜfoo:{bar:10}はクロムコンソールで実行されたときに10を出力するのですか? Javascript
- 22. mysqlはデータベースに保存された日付の値を返さない
- 23. レコードの一時的なスケールまたは掛け算の値は?
- 24. インポートされたCSSファイルがlocalstorageに保存され、リンクされたCSSファイルのように更新されないのはなぜですか?
- 25. ViewStateがデフォルトでサーバーに保存されないのはなぜですか?
- 26. なぜこの単純なMongoose.jsプログラムは、「入れ子にされた」保存中にフリーズしますか?
- 27. データが自分のデータベースに保存されないのはなぜですか?
- 28. 私のタイムゾーンがNSDateに保存されないのはなぜですか?
- 29. 一部のデータがデータベースに保存されないのはなぜですか?
- 30. firefoxは保存されたパスワードをどのように保存しますか?
リアルモードのプログラミングについてお話ししていますか?それらは10で乗算されません。それらはもともとは24ビットアドレッシングをサポートする16ビットアーキテクチャであったため、左に8ビットシフトされます。 –