BruNews
Messages postés
21040
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
23 août 2005 à 22:23
Bon voila je vous soumets cela, ça a l'air cohérent, faudrait faire des tests:
__declspec(naked) __int64 __stdcall mymul64(__int64 x, __int64 y, int *overflow)
{
__asm {
mov eax, [esp+8] ; HIDWORD(x)
mov ecx, [esp+16] ; HIDWORD(y)
mov edx, [esp+20] ; *overflow
or ecx, eax
mov ecx, [esp+12] ; LODWORD(y)
mov dword ptr[edx], 0 ; overflow = 0
jnz short hard
mov eax, [esp+4] ; LODWORD(x)
mul ecx
jmp short mulExit
hard:
mov [esp-8], ebx
mul ecx
mov [esp-4], eax ; SAUVE RESULTAT INTERMEDIAIRE
xor ebx, ebx
mov eax, [esp+4] ; LODWORD(x)
mul dword ptr[esp+16] ; HIDWORD(y)
add [esp-4], eax
adc ebx, 0
mov eax, [esp+4] ; LODWORD(x)
mul ecx
add edx, [esp-4]
mov ecx, [esp+20] ; *overflow
adc ebx, 0
mov [ecx], ebx
mov ebx, [esp-8]
mulExit:
ret 20
}
}
int WINAPI WinMain(HINSTANCE h, HINSTANCE x, LPSTR ystr, int z)
{
char buf[24];
__int64 a, b;
int deborde;
a = 0xFFFFFFFFFFFFFFF;
b = 0xFFFFFFFFF;
a = mymul64(a, b, &deborde);
_i64toa(a, buf, 10);
MessageBox(0, buf, "R", 0);
if(deborde) MessageBox(0, "overflow", "R", 0);
return 0;
}
ciao...
BruNews, MVP VC++