gpt4 book ai didi

encoding - 如何在汇编器中实现相对 JMP (x86)?

转载 作者:行者123 更新时间:2023-12-01 18:35:26 26 4
gpt4 key购买 nike

在为 x86 平台构建汇编器时,我在编码 JMP 指令时遇到了一些问题:

OPCODE   INSTRUCTION   SIZE
EB cb JMP rel8 2
E9 cw JMP rel16 4 (because of 0x66 16-bit prefix)
E9 cd JMP rel32 5
...

(来 self 最喜欢的 x86 指令网站,http://siyobik.info/index.php?module=x86&id=147 )

都是相对跳转,其中每个编码(操作+操作数)的大小在第三列。

现在我原来的(因此是错误的)设计为每条指令保留了最大(5 字节)空间。操作数尚不清楚,因为它跳转到未知位置。因此,我实现了一种“重写”机制,如果跳转的位置已知,则将操作数重写到内存中的正确位置,并用 NOP 填充其余部分。这在紧循环中是一个有点严重的问题。

现在我的问题是以下情况:

b: XXX
c: JMP a
e: XXX
...
XXX
d: JMP b
a: XXX (where XXX is any instruction, depending
on the to-be assembled program)

问题是我想要 JMP 指令的尽可能最小的编码(并且没有 NOP 填充)。

在计算操作数的 ab 之间的相对距离之前,我必须知道 c 指令的大小d。这同样适用于 c 处的 JMP:它需要知道 d 的大小,然后才能计算 e 之间的相对距离a

现有的汇编程序如何解决这个问题,或者您将如何做到这一点?

这就是我正在思考的解决问题的方法:

First encode all the instructions to opcodes between the JMP and it's target, if this region contains a variable-sized opcode, use the maximum size, e.g. 5 for a JMP. Then encode the relative JMP to it's target, by choosing the smallest possible encoding size (3, 4 or 5) and calculate the distance. If any variable-sized opcode is encoded, change all absolute operands before, and all relative instructions that skips over this encoded instruction: they are re-encoded when their operand changes to choose the smallest possible size. This method is guaranteed to end, as variable-sized opcodes only may shrink (because it uses the maximum size of them).

我想知道,也许这是一个过度设计的解决方案,这就是我问这个问题的原因。

最佳答案

在第一遍中,您将通过对所有跳转指令使用悲观字节计数来非常接近要使用的 jmp 代码。

在第二遍中,您可以使用所选的悲观操作码填充跳转。然后,很少有跳转可以被重写以使用更少的一个或两个字节,只有那些非常接近最初的 8/16 位或 16/32 字节跳转阈值的跳转。由于候选者都是许多字节的跳转,因此它们不太可能处于关键循环情况,因此您可能会发现进一步的传递比两遍解决方案提供的好处很少或没有。

关于encoding - 如何在汇编器中实现相对 JMP (x86)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2814556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com