【发布时间】:2015-04-03 10:50:26
【问题描述】:
我在看一些汇编的练习代码,作业基本上是把一个跳转点换成另一个。
原来的jmp是SHORT jmp,这条指令无法到达我需要接近的终点。
我现在有三个选择,要么删除“SHORT”,要么插入“LONG”,或者插入“FAR”。
如果任何地方都有说明它们之间差异的文档,我还没有找到。有人可以在这里提供帮助吗?
【问题讨论】:
我在看一些汇编的练习代码,作业基本上是把一个跳转点换成另一个。
原来的jmp是SHORT jmp,这条指令无法到达我需要接近的终点。
我现在有三个选择,要么删除“SHORT”,要么插入“LONG”,或者插入“FAR”。
如果任何地方都有说明它们之间差异的文档,我还没有找到。有人可以在这里提供帮助吗?
【问题讨论】:
我假设您的问题与 x86 架构有关;你没有在你的问题中指定。
SHORT 跳转是从当前指令指针地址跳转到特定偏移量。 LONG 跳转可以使用更大的偏移值,因此可以跳转到离当前指令指针地址更远的地方。这两种跳转类型通常是 relative - 也就是说,操作数是当前指令指针的偏移量(尽管在汇编源代码中,您通常提供目标标签 - 然后汇编器或链接器计算偏移量)。它们都不会跳转到不同的代码段,因此它们都是“接近”跳转。
FAR 跳转同时指定了段和偏移量,它们都是绝对,因为它们指定了所需的代码段和指令指针,而不是相对于当前代码段的偏移量/指令指针。
总结一下,直跳分为三种:short和long,都是near的跳跃,可以跳跃不同的相对距离具有相同的代码段,而far,可以跳转到任意绝对地址(段和偏移)。
(请注意,也可以执行 indirect absolute 跳转,您可以在其中指定一个包含您希望跳转到的绝对地址的操作数。在这种情况下,跳转可以在附近或远 - 即它可以包含或不包含所需的代码段)。
如果您不指定跳转“距离”,则由汇编程序决定您是短跳转、长跳转还是远跳转。大多数现代汇编程序都是“两遍”的,如果可能,将使用短跳转,否则会使用长跳转或远跳转 - 后者仅在需要时使用。
如果您需要帮助以了解我所说的“细分”是什么意思,请参阅 wikipedia's entry on x86 memory segmentation。
有关可能的 JMP 指令寻址模式的完整详细信息,请参阅 this description of the x86 JMP instruction。
【讨论】:
SHORT 跳转:如果 jmp 是向前跳转,它们使用从 00h 到 7Fh 的相对偏移值,这使得程序执行可以跳转到另一条指令,它们之间最多有 127 个字节。如果是向后跳转,它们使用从 80h 到 FFh 的相对偏移值,这使程序执行能够跳转到另一条指令,它们之间最多有 125 个字节。LONG 跳转可以使用更大的偏移量。
一个FAR跳转,跳转到另一个代码段。
【讨论】:
LONG 跳转可以使用更大的偏移量。"这不是真的。 LONG 跳转指定一个绝对地址。即JMP 0x100跳转到当前段的地址0x100。 FAR 跳转也指定了一个绝对地址。
LONG 跳转是相对的或absolute indirect。 FAR 跳转总是指定一个绝对地址,但 LONG 跳转没有。