鉴于此代码:
int main(void)
{
__asm volatile ("jmp %eax");
return 0;
}
32位TCC会抱怨:
test.c:3: error: unknown opcode 'jmp'
但64位版本将编译得很好。
32位代码有什么问题?
解决方案是在寄存器前添加一个星号(*),如下所示:
__asm volatile ("jmp *%eax");
我不确定明星是什么意思。根据this SO帖子:
这个星是一些语法糖,表明控制是通过引用/指针间接传递的。
至于为什么它适用于64位TCC,我认为它是一个bug; 64位海湾合作委员会应该与Error: operand type mismatch for 'jmp'
抱怨。