home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / aspisrc.zip / dev / MATH.ASM < prev   
Assembly Source File  |  1998-11-29  |  3KB  |  92 lines

  1.               .386p
  2.  
  3.  
  4. _TEXT         segment word public use16 'CODE'
  5.               assume cs:_TEXT, ds:DGROUP, es:NOTHING, ss:NOTHING
  6.  
  7.               public __U4M
  8.               public __I4M
  9.               public __U4D
  10.               public __I4D
  11.  
  12.  
  13. ;; Long multiply routine
  14. ;;
  15. ;; Arguments (from reverse engineering calls generated by the compiler):
  16. ;;    DX:AX * CX:BX
  17. ;; Returns
  18. ;;    DX:AX = product
  19. ;; Notes
  20. ;;    Trashes high words of 32-bit registers EAX and EDX
  21. __U4M         proc near
  22. __I4M:        shl      edx,10h            ;; Load dx:ax into eax
  23.               mov      dx,ax
  24.               mov      eax,edx
  25.               mov      dx,cx              ;; Load cx:bx into edx
  26.               shl      edx,10h
  27.               mov      dx,bx
  28.               mul      edx                ;; Multiply eax*edx into edx:eax
  29.               mov      edx,eax            ;; Load eax into dx:ax
  30.               shr      edx,10h
  31.               ret
  32. __U4M         endp
  33.  
  34.  
  35. ;; Long unsigned divide routine
  36. ;;
  37. ;; Arguments (from reverse engineering calls generated by the compiler):
  38. ;;    DX:AX / CX:BX
  39. ;; Returns
  40. ;;    DX:AX = quotient
  41. ;;    CX:BX = remainder
  42. ;; Notes
  43. ;;    Trashes high words of 32-bit registers EAX, ECX and EDX
  44. __U4D         proc near
  45.               shl      edx,10h            ;; Load dx:ax into eax
  46.               mov      dx,ax
  47.               mov      eax,edx
  48.               cdq                         ;; Sign extend eax into edx
  49.               shl      ecx,10h            ;; Load cx:bx into ecx
  50.               mov      cx,bx
  51.               div      ecx                ;; Divide eax/ecx into eax
  52.               mov      ecx,edx            ;; Load edx into cx:bx
  53.               shr      ecx,10h
  54.               mov      bx,dx
  55.               mov      edx,eax            ;; Load eax into dx:ax
  56.               shr      edx,10h
  57.               ret
  58. __U4D         endp
  59.  
  60.  
  61. ;; Long signed divide routine
  62. ;;
  63. ;; Arguments (from reverse engineering calls generated by the compiler):
  64. ;;    DX:AX / CX:BX
  65. ;; Returns
  66. ;;    DX:AX = quotient
  67. ;;    CX:BX = remainder
  68. ;; Notes
  69. ;;    Trashes high words of 32-bit registers EAX, ECX and EDX
  70. __I4D         proc near
  71.               shl      edx,10h            ;; Load dx:ax into eax
  72.               mov      dx,ax
  73.               mov      eax,edx
  74.               cdq                         ;; Sign extend eax into edx
  75.               shl      ecx,10h            ;; Load cx:bx into ecx
  76.               mov      cx,bx
  77.               idiv     ecx                ;; Divide eax/ecx into eax
  78.               mov      ecx,edx            ;; Load edx into cx:bx
  79.               shr      ecx,10h
  80.               mov      bx,dx
  81.               mov      edx,eax            ;; Load eax into dx:ax
  82.               shr      edx,10h
  83.               ret
  84. __I4D         endp
  85.  
  86.  
  87. _TEXT         ends
  88.  
  89.  
  90.  
  91.               end
  92.