Assembly 装配中的长距离跳跃和远距离跳跃之间有什么区别(如果有的话)?

Assembly 装配中的长距离跳跃和远距离跳跃之间有什么区别(如果有的话)?,assembly,x86,Assembly,X86,我正在看一些汇编的实践代码,任务基本上是用另一个跳转点替换一个跳转点 最初的jmp是一个简短的jmp,使用此指令无法达到我需要接近的终点 我现在有三个选择,要么删除“短”,要么插入“长”,要么插入“远” 如果任何地方都有文档表明它们之间的差异,我还没有找到。这里有人可以帮忙吗?我假设您的问题与x86体系结构有关;你的问题中没有具体说明 SHORT跳转是从当前指令指针地址跳转到特定偏移量。LONG跳转可以使用更大的偏移量值,因此可以跳转到离当前指令指针地址更远的地方。这两种跳转类型通常都是相对的,

我正在看一些汇编的实践代码,任务基本上是用另一个跳转点替换一个跳转点

最初的jmp是一个简短的jmp,使用此指令无法达到我需要接近的终点

我现在有三个选择,要么删除“短”,要么插入“长”,要么插入“远”


如果任何地方都有文档表明它们之间的差异,我还没有找到。这里有人可以帮忙吗?

我假设您的问题与x86体系结构有关;你的问题中没有具体说明


SHORT
跳转是从当前指令指针地址跳转到特定偏移量。
LONG
跳转可以使用更大的偏移量值,因此可以跳转到离当前指令指针地址更远的地方。这两种跳转类型通常都是相对的,也就是说,操作数是当前指令指针的偏移量(尽管在汇编源代码中,您通常提供目标标签,然后汇编程序或链接程序计算偏移量)。它们都不会跳转到不同的代码段,因此它们都是“接近”跳转

FAR
跳转同时指定了段和偏移量,这两者都是绝对的,因为它们指定了所需的代码段和指令指针,而不是相对于当前代码段/指令指针的偏移量

总之,有三种类型的直接跳转:短跳转和长跳转,它们都是近跳转,能够用相同的代码段跳转不同的相对距离;远跳转,可以跳转到任何绝对地址(段和偏移)

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

如果您没有指定跳转“距离”,则由汇编器决定您是跳转短距离、长距离还是远距离。大多数现代汇编器都是“两通”的,如果可能的话,会使用短跳转,否则会使用长跳转或远跳转——后者只有在需要时才使用

看看你是否需要帮助来理解我所说的“段”是什么意思


有关可能的JMP指令寻址模式的完整详细信息,请参阅。

SHORT
跳转:如果JMP是向前跳转,则它们使用从00h到7Fh的相对偏移量值,这使程序执行能够跳转到另一条指令,其间的最大偏移量为127字节。如果是向后跳转,它们使用从80h到FFh的相对偏移量值,这使得程序执行可以跳转到另一条指令,它们之间的最大值为125字节。

LONG
跳转可以使用更大的偏移量。

一个
FAR
跳转,跳转到另一个代码段。

“一个
LONG
跳转可以使用更大的偏移量。”这不是真的。长跳转指定一个绝对地址。也就是说,
JMP 0x100
跳转到当前段中的地址0x100。
FAR
跳转也指定了一个绝对地址。@JimMischel这不是真的,请参阅我在上面的回答中给出的指向JMP指令详细信息的链接。
LONG
跳跃是相对的或
绝对间接的
FAR
跳转总是指定绝对地址,而
LONG
跳转则不指定绝对地址。TL:DR短跳转是添加到EIP/RIP的rel8有符号8位位移。完全忘记了选择此问题的答案。哦。谢谢你的解释,这很有帮助!