71 lines
1.8 KiB
NASM
71 lines
1.8 KiB
NASM
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,<PUBLIC,FAR,PASCAL>,<>
|
|
; 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
|