编写 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 程序集以使用奇偶校验标志和偏移量的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何理由使用 (nr & 1 == 0) 而不是 (nr % 2 == 0) 来检查奇偶校验?

C指针原理-AT&T汇编

英特尔 AT&T 汇编程序的逐步执行?

试图在汇编 at&t 中编写 strcpy,没有输出

校验一个奇偶数最高效的方式:按位与&

反向数组 X86 AT&T 语法