私は32ビットに移植したい古い16ビットアセンブラアプリケーションを持っています。問題は、セグメントds、es、およびgsを大量に使用することです。だから私はフラットなモデルを使うことはできません。だから私はそれらをセレクタに移植することができました。VS2010でasmでセレクタを使用
VS2010は、32ビットモードのユーザーレベルアプリケーションでセレクタをサポートできますか?
私は32ビットに移植したい古い16ビットアセンブラアプリケーションを持っています。問題は、セグメントds、es、およびgsを大量に使用することです。だから私はフラットなモデルを使うことはできません。だから私はそれらをセレクタに移植することができました。VS2010でasmでセレクタを使用
VS2010は、32ビットモードのユーザーレベルアプリケーションでセレクタをサポートできますか?
2つの異なる用語を混在させています。 REALモードでは、x86のセグメント・レジスタを使用し、このような20ビット・アドレス計算:
address = (segment_register << 4) + Offset
保護モードでは(16ビットと32ビットの両方)、セグメント・レジスタは64K/4GBのブロックセレクタを保持しますメモリおよびアドレスは次のように計算される:32ビットおよび64ビット保護モードを使用するオペレーティングシステムで
address = selector_table[segment_register] + offset
、OSは、典型的には、SS = ESの= DSの=のGSを保持し、のみ32またはを使用して64アドレスメモリへのビットオフセット。
あなたのコードがリアルモードのアドレス計算に依存している場合は、保護モードのために完全に書き直す必要があります。ただし、16ビット保護モード用に書かれていた場合は、大きな変更が必要ですが、最初のケースよりは少なくなります。
あなたの質問に戻るには - VS2010はコードの書き方を制限するものではありませんが、OSはそうします。保護モードでセグメントレジスタの値を変更すると、特権違反が発生する可能性があります。また、すべてのセグメントレジスタに同じ値が含まれているため、セグメントオーバーライド(例:ES:[DI])は不要です。
16ビットコードでフラットメモリモデルはありません。セグメントレジスタを32ビットコードで混乱させることはありません。明らかにコードを書き直す必要があります。 –
32ビットモードでは、セレクタを使用するセグメントは使用されません。 16ビットモードのアプリケーションはフラットメモリを使用しません。 ES、GS、FSを使用し、32ビットモードの場合はセレクタになります。私が知る必要があるのは、vs2010 asmがセレクタを使用できるかどうかです(セグメントレジスタではなく)。 – eddyq
セレクタを使用するアセンブリコードを書くことができますが、それが本当に知りたいのであればもちろんです。 Windowsでコードが実行されないという追加情報を無視することができます – hirschhornsalz