【发布时间】:2014-06-13 13:09:37
【问题描述】:
我试图从以下内容中获得结果...
Inputs EAX, EDX
IMUL EDX
Return EAX:EDX as full 64-bit result
static inline long mulshr16 (long a, long d)
{
#if defined(__GNUC__) && defined(__i386__) && !defined(NOASM)
__asm__ __volatile__
(
"imul %[d]\n"
"shrd $16, %%edx, %[a]\n"
: [a] "+a" (a)
: [d] "r" (d)
: "edx"
);
return a;
#else // C Default
return (long)(((int64_t)a * (int64_t)d) >> 16);
#endif
}
我只想要位于 EAX:EDX 中的完整 64 位结果,而不是移位的结果,但是我不确定如何使用内联汇编器将其传递回 GCC。
【问题讨论】:
-
您知道,如果您将 32 位整数转换为 64 位,将它们相乘,然后将它们存储在 64 位变量中,GCC 将为您完成所有这些工作。
-
请注意您想要什么,这不是链接中的
mul64吗?请注意,正如@Sneftel 所说,确实没有理由为此使用 asm。
标签: c gcc assembly x86 inline-assembly