それらの間に違いはありますか?このコードを使用して、リアル モードからプロテクト モードにジャンプしています。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 に答える