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

时间:2015-10-08 15:07:00

标签: assembly x86-64 gas

我在x64上有一组指令,最终设置奇偶校验标志或取消设置。我想编写一些跳过Parity标志指令的程序集。从我在线手册中读到的jpe是一条指令,如果设置了奇偶校验标志则跳转,jpo是一个在未设置奇偶校验标志时跳转的指令。

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

jpe 0x3

我意识到,如果我使用的是英特尔语法,我可以执行以下操作。

jpe $+0x3

然而,这似乎不适用于AT& T,我收到以下错误消息。

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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

GAS总是希望控制跳转,请参阅the official documentation

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

另一种选择是使用标签。我建议local label甚至可以重新定义:

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