|
发表于 2023-10-2 16:17:42
|
显示全部楼层
之前说错了,如果仅需得到商,应是需一次乘法、一次移位运算。
Unsigned division by constant
=============================
enter divisor: 10
; dividend: register other than EAX or memory location
MOV EAX, 0xCCCCCCCD
MUL dividend
SHR EDX, 3
; quotient now in EDX
而楼主的要求,显然需要同时获得余数,则需再增加一次乘法、一次减法运算,
下面是我写的代码,请检验:
// 返回余数;u32Num 作为输入的被除数,同时作为输出的商
__declspec(naked)
CONST UINT32 DivMod10( UINT32& u32Num )
{
__asm
{
mov ecx, dword ptr[esp + 0x04];
mov edx, dword ptr[ecx];
mov eax, 0xCCCCCCCD; // [ 2^35 / 10 + 0.5 ]
push edx;
mul edx;
shr edx, 3;
mov dword ptr[ecx], edx;
imul edx, 10;
pop eax;
sub eax, edx;
ret;
}
}
附件是无符号固定除数的快速算法,输入除数,自动输出汇编指令(含源代码)。 |
|