我有以下功能,涉及 GAS 语法中的 i386 程序集片段:
inline int MulDivRound(
int nNumber,
int nNumerator,
int nDenominator )
{
int nRet, nMod;
__asm__ __volatile__ (
"mov %2, %%eax \n"
"mull %3 \n"
"divl %4 \n"
"mov %%eax, %0 \n"
"mov %%edx, %1 \n"
: "=m" (nRet),
"=m" (nMod)
: "m" (nNumber),
"m" (nNumerator),
"m" (nDenominator)
: "eax", "edx"
);
return nRet + nMod*2 / nDenominator;
}
我注意到,在某些情况下,我在EXC_I386_DIV
使用此功能时会崩溃。以下调用会产生这样的崩溃:
int res = MulDivRound( 4096, -566, 400 );
我无法清楚地看到导致此函数除以 0 的原因:它肯定只是将 4096 移动到eax
,然后将其乘以 -566,然后将其除以 400,返回除法运算结果的两个分量。任何人都可以对此有所了解吗?