|
|
1.1 ! root 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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.