如何告诉GCC asm输入寄存器被阻塞?

如何告诉GCC asm输入寄存器被阻塞?,c,gcc,x86,inline-assembly,C,Gcc,X86,Inline Assembly,我试图通过x86mul指令执行64=32x32乘法,但我只需要结果的高dword(edx寄存器)。因此,很自然地,我尝试将edx列为输出寄存器,并将eax列为被删除的寄存器 这对我来说似乎很自然,但是eax也是一个输入寄存器。当我试图告诉GCC,eax被撞坏时,它会给出一条错误消息 “mull\t%2”:“=d”(第10部分):%a”(UINT32\u C(0x1999999A)),“r”(数字) :“cc”、“rax”); 如果我尝试,它会抛出以下错误消息: divmod10.cpp:76:

我试图通过x86
mul
指令执行64=32x32乘法,但我只需要结果的高dword(edx寄存器)。因此,很自然地,我尝试将
edx
列为输出寄存器,并将
eax
列为被删除的寄存器

这对我来说似乎很自然,但是
eax
也是一个输入寄存器。当我试图告诉GCC,
eax
被撞坏时,它会给出一条错误消息

“mull\t%2”:“=d”(第10部分):%a”(UINT32\u C(0x1999999A)),“r”(数字)
:“cc”、“rax”);
如果我尝试,它会抛出以下错误消息:

divmod10.cpp:76:91:错误:重新加载时在类“AREG”中找不到寄存器
“asm”
divmod10.cpp:76:91:错误:“asm”操作数具有不可能的约束
省略它会编译代码,但会破坏代码。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");
这是我所知道的处理碰撞输入的最简单方法。

从文档():
不可能使用碰撞器通知编译器这些输入中的值正在更改。
使用垃圾变量作为输出:
\u asm\uuu(“mull\t%2”:“=d”(div10),“=a”(垃圾):“1”(UINT32\u C(0x19999a)),“r”(数字):“cc”)