【问题标题】:jmp 0x0008:0x0000 vs jmp 0x00000008:0x00000000 in NASMNASM 中的 jmp 0x0008:0x0000 与 jmp 0x00000008:0x00000000
【发布时间】:2012-09-18 08:00:30
【问题描述】:

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

【问题讨论】:

    标签: assembly x86 nasm


    【解决方案1】:

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

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

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

    【讨论】:

    • 16位还是32位都一样?
    • 我可以编译JMP 0x00000008:0x00000000 没有警告,这是否意味着我默认在32位模式下编译?我使用:nasm -f bin boot.s -o boot.bin
    • 我不记得 bits 的默认值在 NASM 中是什么。您可以在两种模式下编译JMP 0x00000008:0x00000000,您将获得不同的指令长度,如上面的清单文件所示。 NASM 不会在这里发出任何警告,因为在任何一种模式下都没有偏移截断,这与 jmp 8:0x12345678 的情况不同。
    • 我认为 jmp 8:0x12345678 与 jmp 0x00000008:0x12345678 相同,是吗?
    • 正确。顺便说一句,段选择器总是 16 位的。
    【解决方案2】:

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

    来自ndisasm -b 32

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

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

    【讨论】:

    • 谢谢。我想知道 NASM 处理它们的区别是什么。
    • 我使用nasm -f elf32 测试并生成相同的操作码。所以没有区别。
    • 也许它们在 16 位或 32 位上有所不同?你能试试 nasm -f elf16 吗?
    • @sangwf 至少我的nasm 没有-f elf16。有-f elf64-f elf32,最后是-f elf,这是elf32 的简称。您可以通过运行nasm -hf 来检查可用的格式。
    猜你喜欢
    • 1970-01-01
    • 2018-05-25
    • 2022-01-07
    • 1970-01-01
    • 2015-07-06
    • 2016-11-27
    • 2023-04-04
    • 2015-05-11
    相关资源
    最近更新 更多