2016-11-25 4 views
0

このコードはリアルモードで動作します。 私はそのような例を持っています: このコードは0x001FFD50アドレスに行きます。その後REALモードのアセンブラを32ビットアドレスに戻す方法は?

... 
001F066F: push  es 
001F0670: push  0FD50 
001F0673: retf ^^^^^^ 
001F0674: push  00051 
... 

、私はそのようなコードを持っている:

私は戻って0x001F0674アドレスに取得する必要があります。

... 
001FFE91: push  00674 
001FFE94: retn ^^^ 
... 

代わりに、私は0x0674アドレスに行きます。リアルモードで0x001F0674アドレスに戻るにはどうすればよいですか?

+3

セグメントを切り替えるには、 'retf'を使う必要があります。あなたの最初の例を使ってくださいが、明らかに 'es'ではなく' push 0x001F'を使います。あるいは、 'es'に' 0x001F'がまだ含まれていれば、それを保持することさえできます。 – Jester

+3

セカンドルックでは、同じセグメントにいるように見えるので、実際にはセグメントを切り替える必要がないため、コードが実際に機能するはずです。 – Jester

+1

私はあなたが '0x001FFD50'のようなものをどこにでも置いていると仮定します。本当に' 0x001F:0xFD50'を意味しています。そういう場合は32ビットアドレスではなく、セグメント:オフセット(物理アドレス=セグメント* 16 +オフセット) –

答えて

0

ありがとうございます。

あなたはセグメントとオフセットについて正しいものでした。しかし、アドレス0x001F0674がファイルにあり、メモリからダンプを取ったとき、そこのセグメントが0x001F0674以外のものであることがわかりました。それは0x0018 * 16 + 0674でした。

ありがとう、@Jester、@Michael Petch、@ Ped7g。

関連する問題