c - Gcc 内联汇编 "' asm' operand has impossible constraints"是什么意思?

标签 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 代码获取到内联汇编 block 的正确方法。

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

最佳答案

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

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

关于c - Gcc 内联汇编 "' asm' operand has impossible constraints"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25579759/

相关文章:

gcc - 将 Binutils 从 2.16.1 升级到 2.19 是否有优势?为什么?

c - (C 中的内联汇编)有趣的内存段错误

c - 如何使用 asm 程序并在 C 中获取返回值

C - 数组函数求值

无法在 Windows 7 上使用管理员帐户创建原始套接字

c - gcc objdump 程序集调试

被调用对象不是函数或函数指针

performance - 是什么导致在 Cortex-A72 上使用 -O0 而不是 -O3 的简单紧密循环的周期变化如此之大?

c - 字符串文字是否在 C 的编译时自动转换为 char*?

C语言: Error in implementing binary search tree using structures