home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9303 / asmtrick / mylong.asm < prev    next >
Encoding:
Assembly Source File  |  1993-06-03  |  10.3 KB  |  482 lines

  1. ;* ------------------------------------------------------- *
  2. ;*                       MYLONG.ASM                        *
  3. ;*           schnelle Long-Berechnungen auf dem 386        *
  4. ;*          (c) 1992, 1993 Holger Suhr & DMV-Verlag        *
  5. ;* ------------------------------------------------------- *
  6.  
  7. .MODEL SMALL
  8.  
  9. ;* ------------------------------------------------------- *
  10. ;* Die Angabe des Speichermodells ist nicht wichtig,       *
  11. ;* da alle Calls und Procs explizit definiert werden.      *
  12. ;* Daher ist »mylong.obj« mit allen Modellen verwendbar    *
  13. ;* ------------------------------------------------------- *
  14.  
  15. .DATA
  16.  
  17. EXTRN   __cpu386:WORD
  18.  
  19. ;* ------------------------------------------------------- *
  20. ;* externe Variable zur Erkennung eines 386-Prozessors     *
  21. ;* ------------------------------------------------------- *
  22.  
  23. .CODE
  24.  
  25. PUBLIC N_LXMUL@, F_LXMUL@
  26. PUBLIC N_LDIV@ , F_LDIV@
  27. PUBLIC N_LMOD@ , F_LMOD@
  28. PUBLIC N_LUDIV@, F_LUDIV@
  29. PUBLIC N_LUMOD@, F_LUMOD@
  30. PUBLIC N_LXLSH@, F_LXLSH@
  31. PUBLIC N_LXRSH@, F_LXRSH@
  32.  
  33. ;* ------------------------------------------------------- *
  34. ;* Multiplikation von unsigned long, near call version     *
  35. ;* ------------------------------------------------------- *
  36.  
  37. N_LXMUL@  PROC NEAR
  38.   TEST  __cpu386,1
  39.   JNZ    N_LX1
  40.   CALL  Near Ptr OLDLXMUL
  41.   RET
  42. N_LX1:
  43.   CALL  Near Ptr LXMUL386
  44.   RET
  45. N_LXMUL@  ENDP
  46.  
  47. ;* ------------------------------------------------------- *
  48. ;* Multiplikation von unsigned long, far call version      *
  49. ;* ------------------------------------------------------- *
  50.  
  51. F_LXMUL@  PROC FAR
  52.   TEST   __cpu386,1
  53.   JNZ    F_LX1
  54.   CALL  Near Ptr OLDLXMUL
  55.   RETF
  56. F_LX1:
  57.   CALL  Near Ptr LXMUL386
  58.   RETF
  59. F_LXMUL@  ENDP
  60.  
  61. ;* ------------------------------------------------------- *
  62. ;* folgender Code entstammt Borlands Turbo-C 2.0 Library   *
  63. ;* ------------------------------------------------------- *
  64.  
  65. OLDLXMUL  PROC NEAR
  66.   PUSH  SI
  67.   XCHG  SI, AX
  68.   XCHG  DX, AX
  69.   TEST  AX, AX
  70.   JE    OLXMUL1
  71.   MUL   BX
  72. OLXMUL1:
  73.   XCHG  CX, AX
  74.   TEST  AX, AX
  75.   JE    OLXMUL2
  76.   MUL   SI
  77.   ADD   CX, AX
  78. OLXMUL2:
  79.   XCHG  SI, AX
  80.   MUL   BX
  81.   ADD   DX, CX
  82.   POP   SI
  83.   RET
  84. OLDLXMUL  ENDP
  85.  
  86. ;* ------------------------------------------------------- *
  87. ;* Multiplikation von unsigned long, 386 ist vorhanden     *
  88. ;* ------------------------------------------------------- *
  89.  
  90. LXMUL386  PROC NEAR
  91.  
  92. .386
  93.   XCHG  DX, AX
  94.   SHL   EAX, 16
  95.   MOV   AX, DX
  96.   SHL   ECX, 16
  97.   MOV   CX, BX
  98.  
  99.   MUL   ECX
  100.  
  101.   MOV   DX, AX
  102.   SHR   EAX, 16
  103.   XCHG  DX, AX
  104.   RET
  105. .8086
  106. LXMUL386  ENDP
  107.  
  108. ;* ------------------------------------------------------- *
  109. ;* Division von unsigned long, near call version           *
  110. ;* ------------------------------------------------------- *
  111.  
  112. N_LUDIV@:
  113.   POP   CX
  114.   PUSH  CS
  115.   PUSH  CX
  116.  
  117. ;* ------------------------------------------------------- *
  118. ;* Division von unsigned long, far call version            *
  119. ;* ------------------------------------------------------- *
  120.  
  121. F_LUDIV@:
  122.   TEST  __cpu386,1
  123.   JNZ    LUDIV386
  124.  
  125.   MOV    CX, 0001
  126.   JMP    ENTRYPT
  127.  
  128. ;* ------------------------------------------------------- *
  129. ;* Division von unsigned long, 386 ist vorhanden           *
  130. ;* Im Gegensatz zur Multiplikation werden bei der Division *
  131. ;* die Werte auf dem Stack übergeben                       *
  132. ;* ------------------------------------------------------- *
  133.  
  134. LUDIV386:
  135.  
  136. .386
  137.   PUSH  BP
  138.   MOV   BP, SP
  139.  
  140.   MOV   EAX, DWord Ptr [BP+6]
  141.  
  142.   CDQ
  143.  
  144.   DIV   DWord Ptr [BP+10]
  145.  
  146.   MOV   DX, AX
  147.   SHR   EAX,16
  148.   XCHG  DX, AX
  149.   POP   BP
  150.  
  151.   RETF  8
  152. .8086
  153.  
  154. ;* ------------------------------------------------------- *
  155. ;* Division von signed long, near call version             *
  156. ;* ------------------------------------------------------- *
  157.  
  158. N_LDIV@:
  159.   POP   CX
  160.   PUSH  CS
  161.   PUSH  CX
  162.  
  163. ;* ------------------------------------------------------- *
  164. ;* Division von signed long, far call version              *
  165. ;* ------------------------------------------------------- *
  166.  
  167. F_LDIV@:
  168.   TEST  __cpu386,1
  169.   JNZ    LDIV386
  170.   XOR    CX, CX
  171.   JMP    ENTRYPT
  172.  
  173. ;* ------------------------------------------------------- *
  174. ;* Division von signed long, 386 ist vorhanden             *
  175. ;* ------------------------------------------------------- *
  176.  
  177. LDIV386:
  178.  
  179. .386
  180.   PUSH  BP
  181.   MOV   BP, SP
  182.  
  183.   MOV   EAX, DWord Ptr [BP+6]
  184.   CDQ
  185.  
  186.   IDIV  DWord Ptr [BP+10]
  187.   MOV   DX, AX
  188.   SHR   EAX, 16
  189.   XCHG  DX,AX
  190.   POP   BP
  191.   RETF  8
  192. .8086
  193.  
  194. ;* ------------------------------------------------------- *
  195. ;* Modulo von unsigned long, near call version             *
  196. ;* ------------------------------------------------------- *
  197.  
  198. N_LUMOD@:
  199.   POP   CX
  200.   PUSH  CS
  201.   PUSH  CX
  202.  
  203. ;* ------------------------------------------------------- *
  204. ;* Modulo von unsigned long, far call version              *
  205. ;* ------------------------------------------------------- *
  206.  
  207. F_LUMOD@:
  208.   TEST  __cpu386,1
  209.   JNZ    LUMOD386
  210.   MOV    CX,0003
  211.   JMP    ENTRYPT
  212.  
  213. ;* ------------------------------------------------------- *
  214. ;* Modulo von unsigned long, 386 ist vorhanden             *
  215. ;* ------------------------------------------------------- *
  216.  
  217. LUMOD386:
  218.  
  219. .386
  220.   PUSH  BP
  221.   MOV   BP, SP
  222.  
  223.   MOV   EAX, DWord Ptr [BP+6]
  224.   CDQ
  225.   DIV   DWord Ptr [BP+10]
  226.  
  227.   MOV   AX, DX
  228.   SHR   EDX, 16
  229.   POP   BP
  230.   RETF  8
  231. .8086
  232.  
  233. ;* ------------------------------------------------------- *
  234. ;* Modulo von signed long, near call version               *
  235. ;* ------------------------------------------------------- *
  236.  
  237. N_LMOD@:
  238.   POP   CX
  239.   PUSH  CS
  240.   PUSH  CX
  241.  
  242. ;* ------------------------------------------------------- *
  243. ;* Modulo von signed long, far call version                *
  244. ;* ------------------------------------------------------- *
  245.  
  246. F_LMOD@:
  247.   TEST  __cpu386,1
  248.   JNZ    LMOD386
  249.   MOV    CX, 0002
  250.   JMP    ENTRYPT
  251.  
  252. ;* ------------------------------------------------------- *
  253. ;* Modulo von signed long, 386 ist vorhanden               *
  254. ;* ------------------------------------------------------- *
  255.  
  256. LMOD386:
  257.  
  258. .386
  259.   PUSH  BP
  260.   MOV   BP, SP
  261.  
  262.   MOV   EAX, DWord Ptr [BP+6]
  263.   CDQ
  264.  
  265.   IDIV  DWord Ptr [BP+10]
  266.  
  267.   MOV   AX, DX
  268.   SHR   EDX, 16
  269.   POP   BP
  270.  
  271.   RETF  8
  272. .8086
  273.  
  274. ;* ------------------------------------------------------ *
  275. ;* leftshift von long, near call version                  *
  276. ;* ------------------------------------------------------ *
  277.  
  278. N_LXLSH@:
  279.   POP   BX
  280.   PUSH  CS
  281.   PUSH  BX
  282.  
  283. ;* ------------------------------------------------------- *
  284. ;* leftshift von long, far call version                    *
  285. ;* ------------------------------------------------------- *
  286.  
  287. F_LXLSH@:
  288.   TEST   __cpu386,1
  289.   JNZ    LSHFT386
  290.  
  291. ;* ------------------------------------------------------- *
  292. ;* folgender Code entstammt Borlands Turbo-C 2.0 Library   *
  293. ;* ------------------------------------------------------- *
  294.  
  295.   CMP    CL, 16
  296.   JNB    LSHFT1
  297.   MOV    BX, AX
  298.   SHL    AX, CL
  299.   SHL    DX, CL
  300.   NEG    CL
  301.   ADD    CL, 16
  302.   SHR    BX, CL
  303.   OR     DX, BX
  304.   RETF
  305.  
  306. LSHFT1:
  307.   SUB    CL, 16
  308.   XCHG   DX, AX
  309.   XOR    AX, AX
  310.   SHL    DX, CL
  311.   RETF
  312.  
  313. ;* ------------------------------------------------------- *
  314. ;* leftshift von long, 386 vorhanden                       *
  315. ;* ------------------------------------------------------- *
  316.  
  317. LSHFT386:
  318.  
  319. .386
  320.   XCHG   DX, AX
  321.   SHL    EAX, 16
  322.   MOV    AX, DX
  323.  
  324.   SHL    EAX, CL
  325.  
  326.   MOV    DX, AX
  327.   SHR    EAX, 16
  328.   XCHG   DX, AX
  329.   RETF
  330. .8086
  331.  
  332. ;* ------------------------------------------------------- *
  333. ;* rightshift von long, near call version                  *
  334. ;* ------------------------------------------------------- *
  335.  
  336. N_LXRSH@:
  337.   POP   BX
  338.   PUSH  CS
  339.   PUSH  BX
  340.  
  341. ;* ------------------------------------------------------- *
  342. ;* rightshift von long, near call version                  *
  343. ;* ------------------------------------------------------- *
  344.  
  345. F_LXRSH@:
  346.   TEST  __cpu386,1
  347.   JNZ   RSHFT386
  348.  
  349. ;* ------------------------------------------------------- *
  350. ;* folgender Code entstammt Borlands Turbo-C 2.0 Library   *
  351. ;* ------------------------------------------------------- *
  352.  
  353.   CMP    CL, 16
  354.   JNB    RSHFT1
  355.   MOV    BX, DX
  356.   SHR    AX, CL
  357.   SAR    DX, CL
  358.   NEG    CL
  359.   ADD    CL, 16
  360.   SHL    BX, CL
  361.   OR     AX, BX
  362.   RETF
  363.  
  364. RSHFT1:
  365.   SUB    CL, 16
  366.   XCHG   DX, AX
  367.   CWD
  368.   SAR    AX, CL
  369.   RETF
  370.  
  371. ;* ------------------------------------------------------- *
  372. ;* rightshift von long, 386 vorhanden                      *
  373. ;* ------------------------------------------------------- *
  374.  
  375. RSHFT386:
  376.  
  377. .386
  378.   XCHG   DX, AX
  379.   SHL    EAX, 16
  380.   MOV    AX, DX
  381.  
  382.   SHR    EAX, CL
  383.  
  384.   MOV    DX, AX
  385.   SHR    EAX, 16
  386.   XCHG   DX, AX
  387.   RETF
  388. .8086
  389.  
  390. ;* ------------------------------------------------------- *
  391. ;* division/modulo von signed und unsigned long ohne 386   *
  392. ;* ------------------------------------------------------- *
  393.  
  394. ;* ------------------------------------------------------- *
  395. ;* folgender Code entstammt Borlands Turbo-C 2.0 Library   *
  396. ;* ------------------------------------------------------- *
  397.  
  398. ENTRYPT:
  399.   PUSH  BP
  400.   PUSH  SI
  401.   PUSH  DI
  402.   MOV   BP, SP
  403.   MOV   DI, CX
  404.   MOV   AX, [BP+0Ah]
  405.   MOV   DX, [BP+0Ch]
  406.   MOV   BX, [BP+0Eh]
  407.   MOV   CX, [BP+10h]
  408.   OR    CX, CX
  409.   JNE   DIVMOD1
  410.   OR    DX, DX
  411.   JE    DIVMOD9
  412.   OR    BX, BX
  413.   JE    DIVMOD9
  414. DIVMOD1:
  415.   TEST  DI, 0001
  416.   JNE   DIVMOD3
  417.   OR    DX, DX
  418.   JNS   DIVMOD2
  419.   NEG   DX
  420.   NEG   AX
  421.   SBB   DX, 0000
  422.   OR    DI, 000Ch
  423. DIVMOD2:
  424.   OR    CX, CX
  425.   JNS   DIVMOD3
  426.   NEG   CX
  427.   NEG   BX
  428.   SBB   CX, 0000
  429.   XOR   DI, 0004
  430. DIVMOD3:
  431.   MOV   BP, CX
  432.   MOV   CX, 0020h
  433.   PUSH  DI
  434.   XOR   DI, DI
  435.   XOR   SI, SI
  436. DIVMOD4:
  437.   SHL   AX, 1
  438.   RCL   DX, 1
  439.   RCL   SI, 1
  440.   RCL   DI, 1
  441.   CMP   DI, BP
  442.   JB    DIVMOD6
  443.   JA    DIVMOD5
  444.   CMP   SI, BX
  445.   JB    DIVMOD6
  446. DIVMOD5:
  447.   SUB   SI, BX
  448.   SBB   DI, BP
  449.   INC   AX
  450. DIVMOD6:
  451.   LOOP  DIVMOD4
  452.   POP   BX
  453.   TEST  BX, 0002
  454.   JE    DIVMOD7
  455.   MOV   AX, SI
  456.   MOV   DX, DI
  457.   SHR   BX, 1
  458. DIVMOD7:
  459.   TEST  BX, 0004
  460.   JE    DIVMOD8
  461.   NEG   DX
  462.   NEG   AX
  463.   SBB   DX, 0000
  464. DIVMOD8:
  465.   POP   DI
  466.   POP   SI
  467.   POP   BP
  468.   RETF  8
  469. DIVMOD9:
  470.   DIV   BX
  471.   TEST  DI, 0002
  472.   JE    DIVMOD10
  473.   MOV   AX, DX
  474. DIVMOD10:
  475.   XOR   DX, DX
  476.   JMP   DIVMOD8
  477.  
  478. END
  479. ;* ------------------------------------------------------- *
  480. ;*                  Ende von MYLONG.ASM                    *
  481.  
  482.