0

それらの間に違いはありますか?このコードを使用して、リアル モードからプロテクト モードにジャンプしています。2番目のものは機能します。

4

2 に答える 2

0

命令の長さ(エンコードされている絶対アドレスが長いことと、必要になる可能性のある命令プレフィックスのため)を除いて、2つの間に違いはありません。

命令の2つのバージョンは同じように動作します。

16ビットモードで短いバージョンのみを使用したり、32ビットモードで長いバージョンのみを使用したりすることに制限されていません。アドレスが有効である限り(GDTの関連するセグメント記述子、および基になるページテーブル(存在する場合)ごと)、ジャンプは正常に機能します。

更新:実際には(試行錯誤で見つかりました:)、オフセットが16ビットに収まらない場合は、特に適切なオペランドサイズを要求する必要があります。

サンプルコード:

bits 16
jmp 8:0
jmp dword 8:0
jmp 8:0x12345678 ; warning: jmpabs.asm:4: warning: word data exceeds bounds
bits 32
jmp 8:0
jmp word 8:0
jmp 8:0x1234

としてアセンブルするとnasm -f bin -l jmpabs.lst jmpabs.asm -o jmpabs.bin、次のリストファイルが生成されます。

 1                                  bits 16
 2 00000000 EA00000800              jmp 8:0
 3 00000005 66EA000000000800        jmp dword 8:0
 4 0000000D EA78560800              jmp 8:0x12345678
 5          ******************       warning: word data exceeds bounds
 6                                  bits 32
 7 00000012 EA000000000800          jmp 8:0
 8 00000019 66EA00000800            jmp word 8:0
 9 0000001F EA341200000800          jmp 8:0x1234
于 2012-09-18T08:32:56.063 に答える
0

少なくとも私にとっては、動作し、同一のオペコードを生成します。

からndisasm -b 32:

000000B5  EA000000000800    jmp dword 0x8:0x0
000000BC  EA000000000800    jmp dword 0x8:0x0

先行ゼロは数値を変更しません。これは、2 進数、10 進数、16 進数のすべての数値システムで同じです。

于 2012-09-18T08:18:13.883 に答える