代码之家  ›  专栏  ›  技术社区  ›  The amateur programmer

Gcc内联程序集“asm”操作数具有不可能的约束”是什么意思?

  •  8
  • The amateur programmer  · 技术社区  · 10 年前

    我在函数中有以下代码:

    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 回复  |  直到 10 年前
        1
  •  10
  •   Michael Burr    10 年前

    使用“r”约束会强制编译器将参数加载到临时寄存器中,然后再将该临时寄存器用于 mov 说明书根本没有4个临时寄存器可用。

    改用“g”约束。无论如何,这是更有效的,因为编译器将能够直接访问 压敏电阻 使用帧指针偏移内存访问目标寄存器的指令,而不是将其写入暂存寄存器,然后将暂存寄存器移动到最终目的地。