在引用jmp指令后,x86的声明是如何获得标签的地址的?

Yen*_*nvY 7 x86 assembly

例如:

jmp LABEL

...  # loads of instructions

jmp LABEL

.... # loads of instructions

LABEL:

.....
Run Code Online (Sandbox Code Playgroud)

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

汇编程序如何解决它?

Han*_*ant 7

这取决于您使用的汇编程序的类型.一个简单的2遍汇编程序(如MASM)使它成为您的问题.他们会选择一个长跳,你必须JMP SHORT LABEL明确写出来获得短期跳远.当你猜错了时,婊子骂你.

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

你可以很容易地说出你有什么样的味道.只要查看它生成的代码列表,如果你得到5字节的长跳跃,那么你就有了2遍的类型.


Ano*_*ous 1

您始终可以使用 5 个字节(操作码 + 远地址),因此这就是汇编器最初执行的操作。然后它运行(可能多次)缩减算法以查看是否可以改进代码。一旦发现无法改进,它就会停止并完成代码。