x86的汇编程序如何在引用jmp指令后获得定义的标签地址?

时间:2014-12-18 17:36:04

标签: assembly x86

例如:

jmp LABEL

...  # loads of instructions

jmp LABEL

.... # loads of instructions

LABEL:

.....

如果没有jmp LABEL指令的大小,则无法确定LABEL的地址,因为两种形式的jmp指令(短(2字节),近(3或5字节))具有不同的大小。鉴于不知道LABEL的地址,您无法确定使用哪种表格。

汇编程序如何解决它?

2 个答案:

答案 0 :(得分:7)

这取决于您使用的汇编程序的类型。一个简单的2遍汇编程序(如MASM)使它成为您的问题。他们会选择一个跳远,你必须明确地写JMP SHORT LABEL以获得短跳。当你猜对了,就婊子对你说。

优化的n-pass汇编程序(如TASM)自行对其进行排序。它假定短跳,如果它发现它无法达到,那么它会重新开始组装,现在是一个长跳跃。

您可以轻松辨别出您的口味。只要查看它生成的代码列表,如果你得到5字节的长跳跃,那么就有2遍传递。

答案 1 :(得分:1)

你总是可以使用5个字节(操作码+远地址),所以这就是汇编程序初始化的地方。 之后它运行(可能多次)减少算法,看它是否可以改善代码。一旦它看到没有任何改进就可以停止并且代码完成。