编写 AT&T 程序集以使用奇偶校验标志和偏移量



我在x64上有一组特定的指令,它们最终要么设置奇偶校验标志,要么取消它。我想编写一些程序集,跳过奇偶校验标志设置的指令。从我从在线手册中读到的jpe是一个指令,如果奇偶校验标志被设置,jpo是一个指令,如果奇偶校验标志未设置,则需要跳转。

如果设置了奇偶校验位,我要求执行提前3个字节。最初我尝试了以下操作,但它只是跳转到地址0x3,而不是RIP的偏移量。

jpe 0x3

我意识到,如果我使用英特尔语法,我可以做以下事情。

jpe $+0x3

然而,这似乎对at&t不起作用,我得到以下错误消息:

test.c: Assembler messages:
test.c:46: Error: operand type mismatch for `jpe'

我该如何解决这个问题?

GAS总是希望控制跳跃,参见官方文档。

正如Jester所提到的,您可以使用.+3作为一种标签,其中的点表示实际行的地址(就像其他汇编程序中的'$'一样)。GAS将计算相对距离和适当的跳跃。有一点需要注意:虽然点是实际行的地址,但相对跳转是从下一条指令的地址计算的。因此jpe .+3产生7A 01 = jpe short 1

另一个选择是使用标签。我建议使用可重新定义的本地标签:

mov $0b110, %eax        # Parity = even
test %eax, %eax         # Set PF
jpe 0f                  # Jump forward to the next "0:"
.byte 0,0,0
0:                      # Local label

最新更新