在内联汇编中编码条件跳转(jecxz)

时间:2016-09-29 02:17:56

标签: gcc x86 inline-assembly

我正在尝试在内联汇编中编码jecxz指令。 jexcz应跳转到下一个立即指令(即:nop)。

int main() {
  asm("lea -24(%rdi), %rcx");
  asm("jecxz $0x00");
  asm("nop");
}

但是我收到以下错误。

gcc -o t main.c main.c: Assembler messages: main.c:7: Error: operand type mismatch for `jecxz'

这里需要解决什么?

2 个答案:

答案 0 :(得分:3)

最兼容的解决方案是按如下方式编写该行:

asm("jecxz nextline; nextline:");

关于asm("jecxz .+3")解决方案:

在16位模式下,jcxz编码为e3 XXjecxz编码为67 e3 XX

在32位模式下,jecxz编码为e3 XXjcxz编码为67 e3 XX

在64位模式下,jrcxz编码为e3 XXjecxz编码为67 e3 XXjcxz不可用)

(其中XX是指向跳转目标的指令的 end 的有符号字节偏移量)

那么,行asm("jecxz .+3");将在16位和64位代码中汇编为67 e3 00,在32位代码中汇编为e3 01 32位大小写不正确,因为它会跳过指令末尾一个字节,因为32位格式只有两个字节宽。

如果我们使用标签,我们将涵盖所有三种情况。

答案 1 :(得分:1)

根据Micheal Petch的评论,正确的用法是

asm("jecxz .+3");

编码与下一个立即指令的相对距离。