|
|
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.