大会中LONG和FAR跳跃之间有什么区别?

spo*_*zer 2 x86 assembly

我正在查看一些用于汇编的练习代码,并且赋值基本上是用另一个跳转点替换.

原始jmp是SHORT jmp,使用此指令无法到达我需要接近的终点.

我现在有三个选项,我要么删除'SHORT',要么插入'LONG'或者我插入'FAR'.

如果有任何文件指出它们之间的差异,我还没有找到它.任何人都可以在这里帮助吗?

dav*_*mac 11

我假设您的问题与x86架构有关; 你没有在你的问题中指明.

SHORT跳跃是相对跳转到特定从当前指令指针地址的偏移量.甲LONG跳跃使用更大的偏移值,并且因此可以跳进一步远离当前指令指针地址.这两种跳转类型通常都是相对的 - 也就是说,操作数是当前指令指针的偏移量(尽管在汇编源中,您通常提供目标标签 - 汇编器或链接器然后计算偏移量).它们都没有跳转到不同的代码段,因此它们都是"接近"跳转.

FAR跳跃同时指定段和偏移量,这两者都是绝对的意义上,它们指定所需的代码段和指令指针,而不是相对于当前代码段/指令指针的偏移量.

(注意,也可以执行间接绝对跳转,您可以在其中指定一个操作数,该操作数包含您希望跳转到的绝对地址.在这种情况下,跳转可以是近或远 - 即它可以包括或不包括所需的代码段).

如果你没有指定跳跃'距离',那么无论你是短距离,长距离还是远距离跳跃都取决于汇编程序.大多数现代装配工都是"双通",如果可能的话会使用短跳,否则会使用长跳或远跳 - 只有在需要时才会使用后者.

如果您需要帮助来理解"段"的含义,请参阅维基百科关于x86内存分段的条目.

有关可能的JMP指令寻址模式的完整详细信息,请参见x86 JMP指令的此描述.


aen*_*ood 5

SHORT跳转:如果 jmp 是向前跳转,则它们使用从 00h 到 7Fh 的相对偏移值,这使程序执行能够跳转到另一条指令,它们之间最多有 127 个字节。如果是向后跳转,则它们使用从 80h 到 FFh 的相对偏移值,这使程序执行能够跳转到另一条指令,它们之间最多有 125 个字节。
一个LONG跳转可以使用更大的偏移。
一次FAR跳转,跳转到另一个代码段。

  • @JimMischel 这不是真的,请参阅我在上面的回答中提供的 JMP 指令详细信息的链接。“LONG”跳转是相对的或“绝对间接”的。`FAR` 跳转总是指定绝对地址,但 `LONG` 跳转不会。 (2认同)