Gcc内联汇编"' asm'操作数有不可能的限制"意思?

时间:2014-08-30 06:42:44

标签: c gcc assembly inline-assembly cpu-registers

我在函数中有以下代码:

void makeSystemCall(uint32_t num, uint32_t param1, uint32_t param2, uint32_t param3){
    asm volatile (
        "mov %0, %%eax\n\t"//Move num to eax
        "mov %1, %%ebx\n\t"//Move param1 to ebx
        "mov %2, %%ecx\n\t"//Move param2 to ecx
        "mov %3, %%edx\n\t"//Move param3 to edx
        "int $0x80"//Call interrupt. Data in eax, ebx, ecx and edx
        : //No output params
        : "r" (num), "r" (param1), "r" (param2), "r" (param3)//Input params
        : "%eax", "%ebx", "%ecx", "%edx" //This handles register state pushing and popping?
    );
}

现在我不知道为什么这不起作用。 Gcc说:“错误:'asm'操作数有不可能的限制”我一直在关注gcc内联汇编教程,我认为这是将参数从c代码转换为内联汇编块的正确方法。

我也使用为32位x86构建的gcc交叉编译器。

1 个答案:

答案 0 :(得分:9)

使用“r”约束强制编译器在将该临时寄存器用于mov指令之前将参数加载到暂存寄存器中。根本没有4个临时寄存器。

改为使用“g”约束。无论如何,这样更有效率,因为编译器将能够使用帧指针偏移内存访问到目标寄存器,直接在mov指令中访问参数,而不是将其作为暂存寄存器,然后将暂存寄存器移入最终目的地。