它们之间有什么区别吗?我正在使用此代码从实模式跳转到保护模式。第二个工作。
答案 0 :(得分:0)
至少对我来说,工作和生产相同的操作码。
来自ndisasm -b 32
:
000000B5 EA000000000800 jmp dword 0x8:0x0
000000BC EA000000000800 jmp dword 0x8:0x0
前导零不会更改更改数值,这对于所有数字系统都是相同的,无论是二进制,十进制还是十六进制。
答案 1 :(得分:0)
除了指令的长度(由于其中编码的绝对地址较长以及任何可能需要的指令前缀),两者之间没有任何区别。
指令的两个版本表现相同。
您不仅限于在16位模式下使用较短版本,或在32位模式下仅使用较长版本。只要地址有效(根据GDT中的相关段描述符,然后是基础页表,如果有的话),跳转就可以了。
UPDATE :实际上(通过试验和错误:)找到,如果偏移量不符合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