我怎么告诉GCC asm输入寄存器被破坏了?

时间:2014-11-15 03:05:35

标签: c gcc x86 inline-assembly

我正在尝试通过x86 mul指令进行64 = 32x32乘法运算,但我只需要结果的高双字(edx寄存器)。很自然地,我尝试将edx列为输出寄存器,将eax列为破坏寄存器。

这对我来说很自然,但eax 也是输入寄存器。当我试图告诉GCC eax被破坏时,它会给出错误信息。

__asm__("mull\t%2" : "=d"(div10) : "%a"(UINT32_C(0x1999999A)), "r"(number)
    : "cc", "rax");

如果我尝试这样做,则会抛出此错误消息:

divmod10.cpp:76:91: error: can’t find a register in class ‘AREG’ while reloading
‘asm’
divmod10.cpp:76:91: error: ‘asm’ operand has impossible constraints

省略它编译,但打破了代码。海湾合作委员会最终依赖eax不被破坏,这是不正确的:

        movl    $429496730, %eax
#APP
# 76 "divmod10.cpp" 1
        mull    %esi
# 0 "" 2
#NO_APP
        movl    %edx, %esi
#APP
# 78 "divmod10.cpp" 1
        mull    %edx
# 0 "" 2
#NO_APP

我如何做我想做的事?

1 个答案:

答案 0 :(得分:3)

只需为输出设置一个无用的温度,编译器就会优化它。例如:

__asm__("mull\t%2" : "=d"(div10), "=a"((int){0})
    : "a"(UINT32_C(0x1999999A)), "r"(number) : "cc");

这是我知道处理破坏性输入的最简单方法。