【问题标题】:strange machine code of jmp instruction from nasm compiler来自nasm编译器的jmp指令的奇怪机器代码
【发布时间】:2013-03-13 22:56:19
【问题描述】:

当我遇到这种情况时,我一直在玩弄 NASM 并研究它是如何编译 asm 代码的。我使用以下命令行编译了我的汇编代码

nasm -f bin crash_test_172.asm -o crash_test -l crash_test_172.lst

它是一个非常简单的 asm 文件,其内容是

bits 16
org 0x7c00

jmp main

Message db "Hello World", 0x0

main:
   cli
   mov ax,cs
   mov ds,ax
   mov es,ax
   mov ss,ax
   sti

当我打开列表文件 crash_test_172.lst 时,我发现了这个相当有趣的观察结果。这是列表文件的内容。

 1                                  bits 16
 2                                  org 0x7c00
 3
 4 00000000 EB0C                    jmp main
 5
 6 00000002 48656C6C6F20576F72-     Message db "Hello World", 0x0
 7 0000000B 6C6400
 8
 9                                  main:
10 0000000E FA                         cli
11 0000000F 8CC8                       mov ax,cs
12 00000011 8ED8                       mov ds,ax
13 00000013 8EC0                       mov es,ax
14 00000015 8ED0                       mov ss,ax
15 00000017 FB                         sti
16

如果我没有理解错,在第 4 行,jmp 指令指向字节 0C,而根据清单,main 中的第一条指令从 0E 开始。

我还注意到我一直在玩弄的所有其他 asm 代码中的这种差异。令人惊讶的是,它们每个都有效。

我错过了什么吗?有人可以帮我理解为什么会这样吗?第 4 行不应该是EB0E;指向字节0E,main 下的第一条指令?

【问题讨论】:

    标签: assembly x86 nasm


    【解决方案1】:

    0xEB 是一个短的相对跳转,所以它是跳转后的 IP (0x2) 加上偏移量 (0xC),使其成为 0xE。

    【讨论】:

    • 好的。现在这是我不知道的事情。非常感谢!
    【解决方案2】:

    EB 是一个短的相对跳转...

    JMP SHORT imm 的最大范围为 128 字节,因为位移 仅指定为 8 位,但占用的代码空间更少。

    这意味着操作数不是绝对地址,而是与当前地址的正或负偏移量,如500 - Internal Server Error 所述。

    【讨论】:

    • 如果使用8位指定位移,最大寻址范围不应该是256字节吗?还是我再次理解错误?
    • @grammar 可以是正数也可以是负数,所以它的范围是-127128(存储在2的补码中),所以它可以前后跳转。 :)
    • 啊,是的!不考虑向后运动是我的愚蠢:) 感谢您的帮助!
    • 实际上,它是 -128 到 127 - 吹毛求疵,我知道 :)
    • @500-InternalServerError 谢谢,我应该多考虑一下 :)
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多