home *** CD-ROM | disk | FTP | other *** search
/ Hacker Chronicles 2 / HACKER2.BIN / 1207.FPRIMS.ASM < prev    next >
Assembly Source File  |  1991-05-16  |  9KB  |  499 lines

  1.     TITLE   fprims
  2.  
  3. ;    Fast 8086 assembly primitives for add, subtract, rotate left,
  4. ;    and set precision bits for multiprecision integers.
  5. ;    Callable from Microsoft C or Turbo C.
  6. ;    Implemented Jan 1987 by Zhahai Stewart.
  7. ;    Used by Philip Zimmermann's RSA public key cryptography library.
  8.  
  9. ;    Much faster primitives that implement a combined multiply/modulo
  10. ;    operation are available by contacting Philip Zimmermann, 
  11. ;    at Boulder Software Engineering, phone (303)444-4541
  12.  
  13. ;    Static Name Aliases
  14. ;
  15. _TEXT    SEGMENT  BYTE PUBLIC 'CODE'
  16. _TEXT    ENDS
  17. CONST    SEGMENT  WORD PUBLIC 'CONST'
  18. CONST    ENDS
  19. _BSS    SEGMENT  WORD PUBLIC 'BSS'
  20. _BSS    ENDS
  21. _DATA    SEGMENT  WORD PUBLIC 'DATA'
  22. _DATA    ENDS
  23. DGROUP    GROUP    CONST,    _BSS,    _DATA
  24.     ASSUME  CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
  25. PUBLIC    _P_SETP        ;set global precision, maximum of 1024 bits
  26. PUBLIC  _P_ADDC        ;multiprecision add with carry
  27. PUBLIC  _P_SUBB        ;multiprecision subtract with borrow
  28. PUBLIC  _P_ROTL        ;multiprecision rotate left 1 bit
  29. _DATA    SEGMENT
  30. _DATA    ENDS
  31. _TEXT      SEGMENT
  32.  
  33. mswoff    dw    (?)
  34. adcx    dw    (?)
  35. sbbx    dw    (?)
  36. rclx    dw    (?)
  37.  
  38. ;--------------------------------------------------------------
  39. ;    precision=bp+4        precision in bits
  40. ;                prec means precision in wds
  41.  
  42.     PUBLIC    _P_SETP
  43. _P_SETP    PROC NEAR
  44.     push    bp
  45.     mov    bp,sp
  46.     mov    ax,[bp+4]
  47.  
  48. ;    add    ax,15    round up
  49. ;    shr    ax,4    number of words
  50. ;    dec    ax    number - 1
  51. ;    shl    ax,4    back to number of bits: 16 * (prec - 1)
  52.     dec    ax    ; faster alternate way to do same thing
  53.     and    al,0F0h
  54.  
  55.     cmp    ax,1008    ; 16 * (64-1)
  56.     jg    x_setp    ; out of range
  57.  
  58.     shr    ax,1            ; ax = 8 * (prec - 1)
  59.     shr    ax,1            ; ax = 4 * (prec - 1)
  60.  
  61.     mov    bx,offset adc01
  62.     sub    bx,ax
  63.     mov    cs:[adcx],bx    ; adcx = &adc01 - 4 * (prec - 1)
  64.  
  65.     mov    bx,offset sbb01
  66.     sub    bx,ax
  67.     mov    cs:[sbbx],bx    ; sbbx = &sbb01 - 4 * (prec - 1)
  68.  
  69.     mov    bx,offset rcl01
  70.     shr    ax,1            ; ax = 2 * (prec - 1)
  71.     mov    cs:[mswoff],ax    ; mswoff = 2 * (prec-1) = msword offset
  72.     sub    bx,ax
  73.     shr    ax,1            ; ax = prec - 1
  74.     sub    bx,ax
  75.     mov    cs:[rclx],bx    ; rclx = &rcl01 - 3 * (prec - 1)
  76.  
  77. x_setp:    pop    bp
  78.     ret
  79. _P_SETP    ENDP
  80.  
  81.  
  82. ;--------------------------------------------------------------
  83. ;    r1=bp+4
  84. ;    r2=bp+6
  85. ;    carry=bp+8
  86.  
  87.     PUBLIC    _P_ADDC
  88. _P_ADDC    PROC NEAR
  89.     push    bp
  90.     mov    bp,sp
  91.     push    si
  92.     push    di
  93.  
  94.     mov    di,[bp+4]    ; r1
  95.     mov    si,[bp+6]    ; r2
  96.     add    di,cs:[mswoff]    ; offset to msw
  97.     cld            ; go fwd
  98.  
  99.     mov    al,0FFh        ; set cy flag if carry non-zero
  100.     add    al,[bp+8]    ; carry in
  101.     call    cs:[adcx]
  102.     mov    ax,0        ; don't affect flags
  103.     rcl    ax,1        ; set ax = 0 if no borrow, 1 if borrow out
  104.  
  105.     pop    di
  106.     pop    si
  107.     mov    sp,bp
  108.     pop    bp
  109.     ret    
  110. _P_ADDC    ENDP
  111.  
  112. ;--------------------------------------------------------------
  113. ;    r1=bp+4
  114. ;    r2=bp+6
  115. ;    borrow=bp+8
  116.  
  117.     PUBLIC    _P_SUBB
  118. _P_SUBB    PROC NEAR
  119.     push    bp
  120.     mov    bp,sp
  121.     push    si
  122.     push    di
  123.  
  124.     mov    di,[bp+4]    ; r1
  125.     mov    si,[bp+6]    ; r2
  126.     add    di,cs:[mswoff]    ; offset to msw
  127.     cld            ; go fwd
  128.  
  129.     mov    al,0FFh        ; set cy flag if borrow non-zero
  130.     add    al,[bp+8]    ; borrow
  131.     call    cs:[sbbx]
  132.     mov    ax,0        ; don't affect flags
  133.     rcl    ax,1        ; set ax = 0 if no borrow, 1 if borrow out
  134.  
  135.     pop    di
  136.     pop    si
  137.     mov    sp,bp
  138.     pop    bp
  139.     ret    
  140. _P_SUBB    ENDP
  141.  
  142. ;--------------------------------------------------------------
  143. ;    r1=bp+4
  144. ;    c=bp+6
  145.  
  146.     PUBLIC    _P_ROTL
  147. _P_ROTL    PROC NEAR
  148.     push    bp
  149.     mov    bp,sp
  150.     push    di
  151.  
  152.     mov    di,[bp+4]    ; r1
  153.     add    di,cs:[mswoff]    ; offset to msw
  154.     mov    al,0FFh
  155.     add    al,[bp+6]    ; c (carry)
  156.     call    cs:[rclx]
  157.     mov    ax,0        ; don't affect flags
  158.     rcl    ax,1        ; set ax = 0 if no carry, 1 if carry out
  159.  
  160.     pop    di
  161.     mov    sp,bp
  162.     pop    bp
  163.     ret    
  164. _P_ROTL    ENDP
  165.  
  166. ;========================================================================
  167. dummy    proc    near
  168.  
  169. adc64:    lodsw
  170.     adc    [di-126],ax
  171.     lodsw
  172.     adc    [di-124],ax
  173.     lodsw
  174.     adc    [di-122],ax
  175.     lodsw
  176.     adc    [di-120],ax
  177.     lodsw
  178.     adc    [di-118],ax
  179.     lodsw
  180.     adc    [di-116],ax
  181.     lodsw
  182.     adc    [di-114],ax
  183.     lodsw
  184.     adc    [di-112],ax
  185.     lodsw
  186.     adc    [di-110],ax
  187.     lodsw
  188.     adc    [di-108],ax
  189.     lodsw
  190.     adc    [di-106],ax
  191.     lodsw
  192.     adc    [di-104],ax
  193.     lodsw
  194.     adc    [di-102],ax
  195.     lodsw
  196.     adc    [di-100],ax
  197.     lodsw
  198.     adc    [di-98],ax
  199.     lodsw
  200.     adc    [di-96],ax
  201.     lodsw
  202.     adc    [di-94],ax
  203.     lodsw
  204.     adc    [di-92],ax
  205.     lodsw
  206.     adc    [di-90],ax
  207.     lodsw
  208.     adc    [di-88],ax
  209.     lodsw
  210.     adc    [di-86],ax
  211.     lodsw
  212.     adc    [di-84],ax
  213.     lodsw
  214.     adc    [di-82],ax
  215.     lodsw
  216.     adc    [di-80],ax
  217.     lodsw
  218.     adc    [di-78],ax
  219.     lodsw
  220.     adc    [di-76],ax
  221.     lodsw
  222.     adc    [di-74],ax
  223.     lodsw
  224.     adc    [di-72],ax
  225.     lodsw
  226.     adc    [di-70],ax
  227.     lodsw
  228.     adc    [di-68],ax
  229.     lodsw
  230.     adc    [di-66],ax
  231.     lodsw
  232.     adc    [di-64],ax
  233.     lodsw
  234.     adc    [di-62],ax
  235.     lodsw
  236.     adc    [di-60],ax
  237.     lodsw
  238.     adc    [di-58],ax
  239.     lodsw
  240.     adc    [di-56],ax
  241.     lodsw
  242.     adc    [di-54],ax
  243.     lodsw
  244.     adc    [di-52],ax
  245.     lodsw
  246.     adc    [di-50],ax
  247.     lodsw
  248.     adc    [di-48],ax
  249.     lodsw
  250.     adc    [di-46],ax
  251.     lodsw
  252.     adc    [di-44],ax
  253.     lodsw
  254.     adc    [di-42],ax
  255.     lodsw
  256.     adc    [di-40],ax
  257.     lodsw
  258.     adc    [di-38],ax
  259.     lodsw
  260.     adc    [di-36],ax
  261.     lodsw
  262.     adc    [di-34],ax
  263.     lodsw
  264.     adc    [di-32],ax
  265.     lodsw
  266.     adc    [di-30],ax
  267.     lodsw
  268.     adc    [di-28],ax
  269.     lodsw
  270.     adc    [di-26],ax
  271.     lodsw
  272.     adc    [di-24],ax
  273.     lodsw
  274.     adc    [di-22],ax
  275.     lodsw
  276.     adc    [di-20],ax
  277.     lodsw
  278.     adc    [di-18],ax
  279.     lodsw
  280.     adc    [di-16],ax
  281.     lodsw
  282.     adc    [di-14],ax
  283.     lodsw
  284.     adc    [di-12],ax
  285.     lodsw
  286.     adc    [di-10],ax
  287.     lodsw
  288.     adc    [di-8],ax
  289.     lodsw
  290.     adc    [di-6],ax
  291.     lodsw
  292.     adc    [di-4],ax
  293.     lodsw
  294.     adc    [di-2],ax
  295. adc01:    lodsw
  296.     adc    [di],ax
  297.     ret
  298.  
  299. sbb64:    lodsw
  300.     sbb    [di-126],ax
  301.     lodsw
  302.     sbb    [di-124],ax
  303.     lodsw
  304.     sbb    [di-122],ax
  305.     lodsw
  306.     sbb    [di-120],ax
  307.     lodsw
  308.     sbb    [di-118],ax
  309.     lodsw
  310.     sbb    [di-116],ax
  311.     lodsw
  312.     sbb    [di-114],ax
  313.     lodsw
  314.     sbb    [di-112],ax
  315.     lodsw
  316.     sbb    [di-110],ax
  317.     lodsw
  318.     sbb    [di-108],ax
  319.     lodsw
  320.     sbb    [di-106],ax
  321.     lodsw
  322.     sbb    [di-104],ax
  323.     lodsw
  324.     sbb    [di-102],ax
  325.     lodsw
  326.     sbb    [di-100],ax
  327.     lodsw
  328.     sbb    [di-98],ax
  329.     lodsw
  330.     sbb    [di-96],ax
  331.     lodsw
  332.     sbb    [di-94],ax
  333.     lodsw
  334.     sbb    [di-92],ax
  335.     lodsw
  336.     sbb    [di-90],ax
  337.     lodsw
  338.     sbb    [di-88],ax
  339.     lodsw
  340.     sbb    [di-86],ax
  341.     lodsw
  342.     sbb    [di-84],ax
  343.     lodsw
  344.     sbb    [di-82],ax
  345.     lodsw
  346.     sbb    [di-80],ax
  347.     lodsw
  348.     sbb    [di-78],ax
  349.     lodsw
  350.     sbb    [di-76],ax
  351.     lodsw
  352.     sbb    [di-74],ax
  353.     lodsw
  354.     sbb    [di-72],ax
  355.     lodsw
  356.     sbb    [di-70],ax
  357.     lodsw
  358.     sbb    [di-68],ax
  359.     lodsw
  360.     sbb    [di-66],ax
  361.     lodsw
  362.     sbb    [di-64],ax
  363.     lodsw
  364.     sbb    [di-62],ax
  365.     lodsw
  366.     sbb    [di-60],ax
  367.     lodsw
  368.     sbb    [di-58],ax
  369.     lodsw
  370.     sbb    [di-56],ax
  371.     lodsw
  372.     sbb    [di-54],ax
  373.     lodsw
  374.     sbb    [di-52],ax
  375.     lodsw
  376.     sbb    [di-50],ax
  377.     lodsw
  378.     sbb    [di-48],ax
  379.     lodsw
  380.     sbb    [di-46],ax
  381.     lodsw
  382.     sbb    [di-44],ax
  383.     lodsw
  384.     sbb    [di-42],ax
  385.     lodsw
  386.     sbb    [di-40],ax
  387.     lodsw
  388.     sbb    [di-38],ax
  389.     lodsw
  390.     sbb    [di-36],ax
  391.     lodsw
  392.     sbb    [di-34],ax
  393.     lodsw
  394.     sbb    [di-32],ax
  395.     lodsw
  396.     sbb    [di-30],ax
  397.     lodsw
  398.     sbb    [di-28],ax
  399.     lodsw
  400.     sbb    [di-26],ax
  401.     lodsw
  402.     sbb    [di-24],ax
  403.     lodsw
  404.     sbb    [di-22],ax
  405.     lodsw
  406.     sbb    [di-20],ax
  407.     lodsw
  408.     sbb    [di-18],ax
  409.     lodsw
  410.     sbb    [di-16],ax
  411.     lodsw
  412.     sbb    [di-14],ax
  413.     lodsw
  414.     sbb    [di-12],ax
  415.     lodsw
  416.     sbb    [di-10],ax
  417.     lodsw
  418.     sbb    [di-8],ax
  419.     lodsw
  420.     sbb    [di-6],ax
  421.     lodsw
  422.     sbb    [di-4],ax
  423.     lodsw
  424.     sbb    [di-2],ax
  425. sbb01:    lodsw
  426.     sbb    [di],ax
  427.     ret
  428.  
  429.  
  430. rcl64:    rcl    word ptr [di-126],1
  431.     rcl    word ptr [di-124],1
  432.     rcl    word ptr [di-122],1
  433.     rcl    word ptr [di-120],1
  434.     rcl    word ptr [di-118],1
  435.     rcl    word ptr [di-116],1
  436.     rcl    word ptr [di-114],1
  437.     rcl    word ptr [di-112],1
  438.     rcl    word ptr [di-110],1
  439.     rcl    word ptr [di-108],1
  440.     rcl    word ptr [di-106],1
  441.     rcl    word ptr [di-104],1
  442.     rcl    word ptr [di-102],1
  443.     rcl    word ptr [di-100],1
  444.     rcl    word ptr [di-98],1
  445.     rcl    word ptr [di-96],1
  446.     rcl    word ptr [di-94],1
  447.     rcl    word ptr [di-92],1
  448.     rcl    word ptr [di-90],1
  449.     rcl    word ptr [di-88],1
  450.     rcl    word ptr [di-86],1
  451.     rcl    word ptr [di-84],1
  452.     rcl    word ptr [di-82],1
  453.     rcl    word ptr [di-80],1
  454.     rcl    word ptr [di-78],1
  455.     rcl    word ptr [di-76],1
  456.     rcl    word ptr [di-74],1
  457.     rcl    word ptr [di-72],1
  458.     rcl    word ptr [di-70],1
  459.     rcl    word ptr [di-68],1
  460.     rcl    word ptr [di-66],1
  461.     rcl    word ptr [di-64],1
  462.     rcl    word ptr [di-62],1
  463.     rcl    word ptr [di-60],1
  464.     rcl    word ptr [di-58],1
  465.     rcl    word ptr [di-56],1
  466.     rcl    word ptr [di-54],1
  467.     rcl    word ptr [di-52],1
  468.     rcl    word ptr [di-50],1
  469.     rcl    word ptr [di-48],1
  470.     rcl    word ptr [di-46],1
  471.     rcl    word ptr [di-44],1
  472.     rcl    word ptr [di-42],1
  473.     rcl    word ptr [di-40],1
  474.     rcl    word ptr [di-38],1
  475.     rcl    word ptr [di-36],1
  476.     rcl    word ptr [di-34],1
  477.     rcl    word ptr [di-32],1
  478.     rcl    word ptr [di-30],1
  479.     rcl    word ptr [di-28],1
  480.     rcl    word ptr [di-26],1
  481.     rcl    word ptr [di-24],1
  482.     rcl    word ptr [di-22],1
  483.     rcl    word ptr [di-20],1
  484.     rcl    word ptr [di-18],1
  485.     rcl    word ptr [di-16],1
  486.     rcl    word ptr [di-14],1
  487.     rcl    word ptr [di-12],1
  488.     rcl    word ptr [di-10],1
  489.     rcl    word ptr [di-8],1
  490.     rcl    word ptr [di-6],1
  491.     rcl    word ptr [di-4],1
  492.     rcl    word ptr [di-2],1
  493. rcl01:    rcl    word ptr [di],1
  494.     ret
  495. dummy    endp
  496.  
  497. _TEXT    ENDS
  498. END
  499.