编写 AT&T 程序集以使用奇偶校验标志和偏移量
Posted
技术标签:
【中文标题】编写 AT&T 程序集以使用奇偶校验标志和偏移量【英文标题】:Writing AT&T assembly to work with parity flag and offsets 【发布时间】:2015-10-08 15:06:59 【问题描述】:我在 x64 上有一组特定的指令,最终要么设置奇偶校验标志,要么取消设置它。我想编写一些程序集,跳过设置奇偶校验标志的指令。根据我从在线手册中阅读的内容,jpe
是一条在设置奇偶校验标志时进行跳转的指令,jpo
是一条在未设置奇偶校验标志时进行跳转的指令。
如果设置了奇偶校验位,我需要执行向前跳转 3 个字节。最初我尝试了以下操作,但它只是跳转到地址0x3
,而不是与 RIP 的偏移量。
jpe 0x3
我意识到,如果我使用 Intel 语法,我可以执行以下操作。
jpe $+0x3
但是,这似乎不适用于 AT&T,我收到以下错误消息。
test.c: Assembler messages:
test.c:46: Error: operand type mismatch for `jpe'
我该如何解决这个问题?
【问题讨论】:
为什么不使用标签?无论如何jpe .+3
应该可以工作。
@Jester:请注意:jpe .+3
产生 7A 01
= jpe short 0x01
。您必须添加 jpe
消耗的字节数 (=2)。
@rkhb 我知道它会产生什么,不清楚 OP 想要什么。由于$+0x3
也 产生了这个(在使用$
的汇编程序中,例如nasm
)无论如何,我相信他可以自己解决这个问题:)
相同指令的jp
/ jnp
名称可能会使您的代码更清晰,如果您的奇偶校验条件不能真正反映某些事物的奇偶校验。 (例如,如果标志由 SAHF 设置)。
【参考方案1】:
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
【讨论】:
以上是关于编写 AT&T 程序集以使用奇偶校验标志和偏移量的主要内容,如果未能解决你的问题,请参考以下文章