page ,132 ;---------------------------Module-Header-------------------------------; ; Module Name: MULDIV32 ; ; Copyright (c) 1987 Microsoft Corporation ;-----------------------------------------------------------------------; ?WIN = 0 ?PLM = 1 ?NODATA = 0 .xlist include cmacros.inc .list ifndef SEGNAME SEGNAME equ <_TEXT> endif createSeg %SEGNAME, CodeSeg, word, public, CODE sBegin CodeSeg .386 assumes cs,CodeSeg assumes ds,nothing assumes es,nothing ;---------------------------Public-Routine------------------------------; ; muldiv32 ; ; multiples two 32 bit values and then divides the result by a third ; 32 bit value with full 64 bit presision ; ; lResult = (lNumber * lNumerator) / lDenominator ; ; Entry: ; lNumber = number to multiply by nNumerator ; lNumerator = number to multiply by nNumber ; lDenominator = number to divide the multiplication result by. ; ; Returns: ; EAX and DX:AX = result of multiplication and division. ; Error Returns: ; none ; Registers Preserved: ; DS,ES,ESI,EDI ;-----------------------------------------------------------------------; assumes ds,nothing assumes es,nothing cProc muldiv32,,<> ; ParmD ulNumber ; ParmD ulNumerator ; ParmD ulDenominator cBegin pop edx ; return addr pop ebx ; ulDenominator pop ecx ; ulNumerator pop eax ; ulNumber push edx ; put back return addr imul ecx ; edx:eax = (lNumber * lNumerator) idiv ebx ; eax = (lNumber * lNumerator) / lDenominator shld edx,eax,16 ; move HIWORD(eax) to dx cEnd sEnd CodeSeg end