32 ビット x86 は、16 ビット x86 のスーパーセットです。16 ビット x86 でコードを書いたとします。理想的には、32 ビット x86 のシステムで問題なく動作するはずです。しかし、そうではありません。ここで問題になるのは互換性です。しかし、なぜ正確に?32 ビット x86 マシンにインストールされた 32 ビット OS は、プログラムをメモリに別の方法でロードし、別の方法でメモリを管理するためでしょうか? メモリ管理要件の違いが、16 ビット アプリケーションと 32 ビット アプリケーションの本当の違いですか?
3 に答える
Windows の場合:
32 ビット OS で 16 ビット プログラムを実行する際の主な問題は、ほとんどの 16 ビット プログラムがリアル モードで実行されていたため、(OS によって) サポートされなくなったことです。これらのモードは根本的に異なるため、ソフトウェア エミュレーションが必要です。また、すべての 16 ビット API スタブ、DOS 関数、および BIOS 呼び出しが利用できないため、プログラムは実際にはオペレーティング システムと対話できず、何らかのエミュレーションなしでは使用できなくなります。Windows の場合、Windows NT3.1 から NTVDM がすべてのエミュレーションを行います。
もちろん、プログラムが OS との対話を必要としない場合は、実行できるはずです。オペコードと命令セットに関しては、32 ビット x86が16 ビット x86のスーパーセットであることは事実です。コードが通常実行される環境がまったく異なるだけです。
32 ビットと 16 ビットのアドレスモードの唯一の違いは、これらのオペランドサイズとアドレスサイズのプレフィックスの意味と使用法です。
関連する (64 ビット OS 上の 16 ビット) ディスカッションがスーパーユーザーhereにあります。