它们之间有什么区别吗?我正在使用此代码从实模式跳转到保护模式。第二个有效。
问问题
562 次
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 回答