2017-07-14 3 views
1

私はこれをBarry B. Breyの "INTEL MICROPROCESSORS"という本で見つけました。本当ですか?しかし、なぜ?私は実際の8086マイクロプロセッサのリアルモードでは、32ビットレジスタがないことを知っています。 32ビットレジスタにも同じ制限が課されるはずです。32ビットレジスタを使用してリアルモードのメモリをアドレス指定する場合、レジスタの内容は決して0000FFFFHを超えてはなりません。どうして?

+1

リアルモードとは何ですか?あなたは知っていますか? – Marichyasana

+3

32ビットプロセッサ(386+)では、32ビットレジスタと32ビットアドレッシングをリアルモードで使用できます。 [unrealモード](https://en.wikipedia.org/wiki/Unreal_mode)の場合、アドレスは0xFFFFを超えることができます。従来のリアルモードでは、制限は0xFFFFに制限されています。 –

+0

これはすでに、この本の中で誤解を招く2番目のものです。 – harold

答えて

5

私は、レジスタの内容は無関係であると言います。実効アドレスが0xFFFFのを超えてはならない。

  • EBPが値0xFFFFFFF0を持っており、あなたはアドレスが0x10でメモリにアクセスする命令mov EBX, [EBP+0x20]を使用している場合。レジスタの値が0xFFFFを超えていても、これは完全に動作するはずです。

  • EBPの値が0xFFF0で、同じ命令を使用する場合は、0x10010のメモリにアクセスします。レジスタは0xFFFFより小さい値を持っていますが、これは動作しません。

マイケル・ペッシュはすでに彼のコメントに理由のヒントを与えた:

メモリ・セグメントは、リアルモードでのセグメント制限を持っています!

リアルモードでは、セグメントの限界チェックは望ましくありません。 286の開発者は、セグメント・リミット・チェックがリアル・モードでスイッチオフされるように回路を開発することができました。これは、回路をより複雑かつ高価にしていたであろう。そこで、セグメント限界を0xFFFFに単純に初期化して、セグメント限界チェックがオンになっているにもかかわらず、実際にセグメント限界チェックを無効にすることにしました。

Intelでは明らかにこの初期値を0xFFFFから0xFFFFFFFFに変更しませんでした。

386では、Michael Petch'esのコメントに記載されている「非現実的なモード」を使用してこの制限を変更することができます。しかし、私が知る限り、インテルの公式文書では、この方法は「正式に」許されていると言います。つまり、この方法は将来のすべてのインテルCPUで動作するとは言いません。

たとえば、386+の「仮想モード」(このモードは保護モードOSがアクティブな間にリアルモードプログラムを実行するために使用されます)では、制限は0xFFFFに固定されます。

関連する問題