2012-02-11 20 views
0

私は32ビットに移植したい古い16ビットアセンブラアプリケーションを持っています。問題は、セグメントds、es、およびgsを大量に使用することです。だから私はフラットなモデルを使うことはできません。だから私はそれらをセレクタに移植することができました。VS2010でasmでセレクタを使用

VS2010は、32ビットモードのユーザーレベルアプリケーションでセレクタをサポートできますか?

+4

16ビットコードでフラットメモリモデルはありません。セグメントレジスタを32ビットコードで混乱させることはありません。明らかにコードを書き直す必要があります。 –

+0

32ビットモードでは、セレクタを使用するセグメントは使用されません。 16ビットモードのアプリケーションはフラットメモリを使用しません。 ES、GS、FSを使用し、32ビットモードの場合はセレクタになります。私が知る必要があるのは、vs2010 asmがセレクタを使用できるかどうかです(セグメントレジスタではなく)。 – eddyq

+0

セレクタを使用するアセンブリコードを書くことができますが、それが本当に知りたいのであればもちろんです。 Windowsでコードが実行されないという追加情報を無視することができます – hirschhornsalz

答えて

1

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])は不要です。

+2

実際には16ビットコードでフラットモデルが存在します。保護モードに入るだけで、粒度を4Kに設定してからリアルモードに戻り、32ビットレジスタを使用してメモリにアクセスするだけです。 BIOSで使用していたすべてのメモリをすばやくテストするのは少しおかしなことです。 – eddyq

+0

ここに答えがあります:http://stackoverflow.com/questions/9245108/is-there-an-api-for-win32-which-will-allow-me-to-use-es-gs-fs – eddyq

関連する問題