为什么汇编调用地址要添加0xFBFFFFFF?

use*_*902 1 assembly call object-code

好吧,我正在为我正在开发的操作系统编写一个汇编程序。它进展顺利,我已经掌握了所有 mov 指令,现在我想实现 call 和 jmp 等指令。我确实没有好的文档,所以我正在查看 NASM 生成的机器代码来查找操作码等。我想看看调用的操作码是什么,所以我编译了一些以标签开头的代码。我预计调用操作码后的地址是 00 00 00 00,但它是 FB FF FF FF。我认为这与符号有关,因此我使用 call 0x000000 编译代码以查看发生了什么,并且地址完全相同(0xFBFFFFFF)。有人可以向我解释一下吗,我很困惑。

Mar*_*nen 5

显示您正在反汇编的实际代码会很有用。该数字很可能是小端负偏移量。0xFFFFFFFB = -5(2 补码)。你写过吗:

Label: call Label
Run Code Online (Sandbox Code Playgroud)

如果 call 是一个具有 4 字节相对偏移量的 1 字节操作码,那就有意义了。