我正在尝试通过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
我如何做我想做的事?
答案 0 :(得分:3)
只需为输出设置一个无用的温度,编译器就会优化它。例如:
__asm__("mull\t%2" : "=d"(div10), "=a"((int){0})
: "a"(UINT32_C(0x1999999A)), "r"(number) : "cc");
这是我知道处理破坏性输入的最简单方法。