繁体   English   中英

我如何告诉GCC asm输入寄存器被破坏?

[英]How do I tell GCC asm that an input register is clobbered?

我正在尝试通过x86 mul指令执行64 = 32x32乘法,但是我只需要结果的高dword( 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

省略它可以编译,但是会破坏代码。 GCC最终依赖于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

我该怎么做?

只是对输出进行一个无用的临时设置,编译器就会对其进行优化。 例如:

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

这是我知道的处理输入中断的最简单方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM