编写 AT&T 程序集以使用奇偶校验标志和偏移量
Writing AT&T assembly to work with parity flag and offsets
我在 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'
我该如何解决这个问题?
GAS 总是想要控制跳跃,参见 the official documentation。
正如 Jester 提到的,您可以使用 .+3
作为一种标签,其中点代表实际行的地址(如其他汇编程序中的“$”)。 GAS会计算出相对距离和合适的跳跃。有一个警告:虽然点是实际行的地址,但相对跳转是根据下一条指令的地址计算的。所以 jpe .+3
产生 7A 01
= jpe short 1
.
另一种选择是使用标签。我建议 local label 甚至可以重新定义:
mov [=10=]b110, %eax # Parity = even
test %eax, %eax # Set PF
jpe 0f # Jump forward to the next "0:"
.byte 0,0,0
0: # Local label
我在 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'
我该如何解决这个问题?
GAS 总是想要控制跳跃,参见 the official documentation。
正如 Jester 提到的,您可以使用 .+3
作为一种标签,其中点代表实际行的地址(如其他汇编程序中的“$”)。 GAS会计算出相对距离和合适的跳跃。有一个警告:虽然点是实际行的地址,但相对跳转是根据下一条指令的地址计算的。所以 jpe .+3
产生 7A 01
= jpe short 1
.
另一种选择是使用标签。我建议 local label 甚至可以重新定义:
mov [=10=]b110, %eax # Parity = even
test %eax, %eax # Set PF
jpe 0f # Jump forward to the next "0:"
.byte 0,0,0
0: # Local label