0

它们之间有什么区别吗?我正在使用此代码从实模式跳转到保护模式。第二个有效。

4

2 回答 2

0

至少对我来说,既能工作又能产生相同的操作码。

来自ndisasm -b 32

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

前导零不会改变数值,这对于所有数字系统都是一样的,无论是二进制、十进制还是十六进制。

于 2012-09-18T08:18:13.883 回答
0

除了指令的长度(由于其中编码的绝对地址更长以及任何可能需要的指令前缀)之外,两者之间没有任何区别。

该指令的两个版本的行为相同。

您不仅可以在 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 回答