我正在尝试在内联汇编中编码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'
这里需要解决什么?
答案 0 :(得分:3)
asm("jecxz nextline; nextline:");
asm("jecxz .+3")
解决方案:在16位模式下,jcxz
编码为e3 XX
,jecxz
编码为67 e3 XX
在32位模式下,jecxz
编码为e3 XX
,jcxz
编码为67 e3 XX
在64位模式下,jrcxz
编码为e3 XX
,jecxz
编码为67 e3 XX
(jcxz
不可用)
(其中XX
是指向跳转目标的指令的 end 的有符号字节偏移量)
那么,行asm("jecxz .+3");
将在16位和64位代码中汇编为67 e3 00
,在32位代码中汇编为e3 01
。 32位大小写不正确,因为它会跳过指令末尾一个字节,因为32位格式只有两个字节宽。
如果我们使用标签,我们将涵盖所有三种情况。
答案 1 :(得分:1)
根据Micheal Petch的评论,正确的用法是
asm("jecxz .+3");
编码与下一个立即指令的相对距离。