在NASM中,jmp 0x0008:0x0000 vs jmp 0x00000008:0x00000000

时间:2012-09-18 08:00:30

标签: assembly x86 nasm

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

2 个答案:

答案 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