我有以下的功能,涉及的i386装配的气体语法的一个片段:气体装置片段由0分,不知道为什么
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时,返回除法运算结果的两个分量。任何人都可以对此有所了解吗?
单步执行调试器中的代码,查看每条指令之前的寄存器值。 – Michael 2013-03-13 09:57:10