home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / pcmag / vol8n19.zip / DDIV386.ASM < prev    next >
Assembly Source File  |  1989-10-02  |  2KB  |  70 lines

  1.   
  2.  
  3.         title   DDIV386.ASM Double Precision Unsigned Divide
  4.         page    55,132
  5.         .386
  6.  
  7. ; DDIV386.ASM   Double Precision Unsigned Divide
  8. ;               for 80386 32-bit protected mode
  9. ;
  10. ; Copyright (C) 1989 Ziff Communications Co.
  11. ; PC Magazine * Ray Duncan
  12. ;
  13. ; Call with:    EDX:ECX:EBX:EAX = quad-precision dividend
  14. ;               ESI:EDI         = double-precision divisor
  15. ;
  16. ; Returns:      EDX:EAX         = double-precision quotient     
  17. ;               ECX:EBX         = double-precision remainder
  18. ;
  19. ; Destroys:     ESI, EDI
  20.  
  21. _TEXT   segment dword public use32 'CODE'
  22.  
  23.         assume  cs:_TEXT
  24.  
  25.         public  ddiv
  26. ddiv    proc    near
  27.  
  28.         push    ebp             ; save register
  29.         mov     ebp,ecx         ; EBP = 3sw of dividend
  30.         mov     ecx,64          ; initialize loop counter
  31.         clc                     ; carry flag initially clear
  32.  
  33. ddiv1:  rcl     eax,1           ; test this bit of dividend
  34.         rcl     ebx,1
  35.         rcl     ebp,1
  36.         rcl     edx,1
  37.         jnc     ddiv3           ; jump if bit was clear
  38.  
  39. ddiv2:  sub     ebp,edi         ; subtract divisor from dividend
  40.         sbb     edx,esi
  41.         stc                     ; force carry flag set and
  42.         loop    ddiv1           ; shift it into forming quotient
  43.         jmp     ddiv5
  44.  
  45. ddiv3:  cmp     edx,esi         ; dividend > divisor?
  46.         jc      ddiv4           ; no, jump
  47.         jne     ddiv2           ; yes, subtract divisor
  48.         cmp     ebp,edi
  49.         jnc     ddiv2           ; yes, subtract divisor
  50.  
  51. ddiv4:  clc                     ; force carry flag clear and
  52.         loop    ddiv1           ; shift it into forming quotient
  53.  
  54. ddiv5:  rcl     eax,1           ; bring last bit into quotient
  55.         rcl     ebx,1
  56.  
  57.         mov     ecx,ebp
  58.         xchg    edx,ebx         ; put quotient in EDX:EAX
  59.         xchg    ecx,ebx         ; put remainder in ECX:EBX
  60.  
  61.         pop     ebp             ; restore register
  62.         ret                     ; and exit
  63.         
  64. ddiv    endp
  65.  
  66. _TEXT   ends
  67.  
  68.         end
  69.  
  70.