3

16ビットアセンブリでCポインタをシミュレートするにはどうすればよいですか。

int var = 10;
int * ptr = &var;

組み立てでは、

mov dword ptr [ebp-x], 10
lea eax, dword ptr [ebp-x]
mov dword ptr [ebp-x+4], eax

[bp-x]16アセンブリで変数の物理アドレスを取得する方法はありますか?例:フロッピーからセクターを読み取るプログラムがあり、ジャンプしsegment:0て実行します。ロードされているプログラムはシンプルなテキストエディタです。エディターで、単一変数の物理アドレスを取得し、それをに変換してsegment:offset、テキストファイルのロードに使用する必要があります。DS:SI出口にジャンプする前に設定しようとしましたが、あまり良い解決策ではありません。誰かがそれをどのように解決できるか知っていますか?助けてください。

4

2 に答える 2

2

実際のアドレッシングモードでは、メモリの1バイトの物理アドレスはセグメント*16+オフセットに等しくなります。

[(e)bp+...]またはを介してメモリを参照する場合[esp+...]、関連するデフォルトのセグメントはですss。それ以外の場合はdsです。オプションのセグメントオーバーライドプレフィックスは、デフォルトのセグメントレジスタを変更します。

したがって、たとえば、変数がとしてアドレス指定されている[bp-8]場合、その物理アドレスはss*16+bp-8です。

于 2012-08-17T11:35:16.297 に答える
1

これはあなたの要件です: -

mov word ptr [bp-x], 10
lea ax, word ptr [bp-x] 
mov word ptr [bp-x+4], ax 

古いコンパイラ、おそらくその美しい TCC (Turbo C Compiler、16 ビット) を使用できます。そして、それはあなたが必要とするものを出力します。

さらに、16 ビット ポインターが表示されたとしても、その仮想アドレスと実際のアドレスはアーキテクチャに従って変換されます (32 ビット OS が 64 ビット アーキテクチャ上で互換モードで実行されている場合でも同様です)。

ただし、これらの種類の処理に非常に興味がある場合は、cmd-->type debug--> 次にa--> を開いて、そこにアセンブリを少し書くことができます。

于 2012-08-17T11:33:36.890 に答える