Tiny C编译器:“错误:未知操作码'jmp'”

时间:2013-08-29 17:43:14

标签: c assembly x86 tcc

鉴于此代码:

int main(void)
{
    __asm volatile ("jmp %eax");

    return 0;
}

32位TCC会抱怨:

test.c:3: error: unknown opcode 'jmp'

但是64位版本编译得很好。

32位代码的问题是什么?

1 个答案:

答案 0 :(得分:1)

解决方案是在寄存器前添加一个星号(*),如下所示:

__asm volatile ("jmp *%eax");

我不确定明星是什么意思。根据{{​​3}} SO帖子:

  

星形是一些语法糖,表示控制是通过引用/指针间接传递的。

至于为什么它适用于64位TCC,我认为它是一个bug; 64位GCC抱怨Error: operand type mismatch for 'jmp',应该这样做。