2016-04-06 1 views
0

アセンブリ言語では、セグメントレジスタに保存された値に10が掛け算されるのはなぜですか?私は非常に多くの本で答えを見つけようとしましたが、私は答えませんでした。セグメントレジスタに保存された値に10を掛けたのはなぜですか?

+1

リアルモードのプログラミングについてお話ししていますか?それらは10で乗算されません。それらはもともとは24ビットアドレッシングをサポートする1​​6ビットアーキテクチャであったため、左に8ビットシフトされます。 –

答えて

3

最初に、アセンブリは単一の言語でも、実装が単一のものでもありません。あなたは誰が適切な答えを出すためにどのアーキテクチャについて話しているかを言わなければならないでしょう。

第2に、セグメントレジスタには常に10が乗算されません。 10が2進数のシステムの自然数ではないので、10倍しないと言っています。

x86アーキテクチャで物理アドレスを取得する理由について質問している場合、CPUは0x10(16進数)でセグメントレジスタを掛け、オフセットを追加します。これは設計者が選択したためです。

次に、なぜ彼らはそれを選んだのですか? 16ビットセグメントレジスタは0〜65535の値を保持できます。これを16倍して0〜1048575のアドレスを取得します。これは1MBです。 1MBは、アクセスするのに最適なメモリ量です。

他のアーキテクチャは、定数でなくても、異なる乗数を持つことがあります。しかし、ほとんどの場合、常に2のべき乗になるでしょう。

2

デザインの決定は1974年に戻る必要があることを理解するために。
当時、私たちは今日の小型化はできませんでした。パッケージで製造されることは非常に小さかった。

1974年は、インテルが64ビットのアドレスバスを搭載したチップである8080を導入した年であり、最大64KBのメモリがアドレス可能であったことを意味します。
しかし8080はほとんど8ビットのレジスタを持っていたので、プログラマは通常2つのレジスタをペアにして16ビットのアドレスを形成する必要がありました。

一方、1976年には新しいチップの設計、8086が始まりました。
デザイナーは、メモリの64 KiBが低すぎることを認識したので、メモリアドレッシング専用のピン数を増やすことに決めましたが、チップパッケージのピン数には依然として大きな制限がありました。
この新しいチップでは、20ビットのアドレス、または1 M​​iBのアドレス指定可能なメモリをセトリングしました。

  1. ピン数:我々は原因-効果のサイクルに入り、なぜ20ビットを考慮すると
    、我々は他の二つの重要な要因の中で、検討する必要があります。それは可能な限り低くなければなりません。
  2. レジスタのサイズ。 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プロセッサでは非推奨です。

関連する問題