我正在查看一些用于装配的练习代码,并且分配基本上是用另一个跳转点替换。
原始jmp是一个SHORT jmp,使用此指令无法达到我需要接近的终点。
我现在有三个选项,我要么删除'SHORT',要么插入'LONG'或者插入'FAR'。
如果有任何文件指出它们之间的差异,我还没有找到它。有人可以帮忙吗?
答案 0 :(得分:10)
我假设您的问题与x86架构有关;你没有在你的问题中指明。
SHORT
跳转是与当前指令指针地址的特定偏移的相对跳转。 LONG
跳转使用较大的偏移值,因此可以进一步远离当前指令指针地址。这两种跳转类型通常都是 relative - 也就是说,操作数是当前指令指针的偏移量(尽管在汇编源中,您通常提供目标标签 - 然后汇编器或链接器计算偏移量)。它们都没有跳转到不同的代码段,因此它们都是“接近”跳转。
FAR
跳转指定段和偏移量,它们都是绝对,因为它们指定了所需的代码段和指令指针,而不是相对于当前的偏移量代码段/指令指针。
(注意,也可以执行间接绝对跳转,您可以在其中指定一个操作数,该操作数包含您希望跳转到的绝对地址。在这种情况下,跳转可以接近或远 - 即它可以包括或不包括所需的代码段。)
如果你没有指定跳跃'距离',那么无论你得到短距离,长距离还是远距离跳跃都取决于汇编程序。大多数现代装配工都是“双通”,如果可能的话会使用短跳,否则会使用长跳或远距离 - 只有在需要时才会使用后者。
如果您需要帮助以了解'段'的含义,请参阅wikipedia's entry on x86 memory segmentation。
有关可能的JMP指令寻址模式的完整详细信息,请参见this description of the x86 JMP instruction。
答案 1 :(得分:2)
SHORT
跳转:如果jmp是正向跳转,它们使用从00h到7Fh的相对偏移值,这使得程序执行能够跳转到另一条指令,它们之间最多有127个字节。如果是向后跳转,它们使用从80h到FFh的相对偏移值,这使得程序执行能够跳转到另一条指令,它们之间最多有125个字节。
LONG
跳转可以使用更大的偏移量
FAR
跳转,跳转到另一个代码段。