; Static Name Aliases ; TITLE bn_mulw.c .386 F_TEXT SEGMENT WORD USE16 PUBLIC 'CODE' F_TEXT ENDS _DATA SEGMENT WORD USE16 PUBLIC 'DATA' _DATA ENDS CONST SEGMENT WORD USE16 PUBLIC 'CONST' CONST ENDS _BSS SEGMENT WORD USE16 PUBLIC 'BSS' _BSS ENDS DGROUP GROUP CONST, _BSS, _DATA ASSUME DS: DGROUP, SS: DGROUP F_TEXT SEGMENT ASSUME CS: F_TEXT PUBLIC _bn_mul_add_word _bn_mul_add_word PROC FAR ; Line 58 push bp push bx push esi push di push ds push es mov bp,sp ; w = 28 ; num = 26 ; ap = 22 ; rp = 18 xor esi,esi ;c=0; mov di,WORD PTR [bp+18] ; load r mov ds,WORD PTR [bp+20] ; load r mov bx,WORD PTR [bp+22] ; load a mov es,WORD PTR [bp+24] ; load a mov ecx,DWORD PTR [bp+28] ; load w mov bp,WORD PTR [bp+26] ; load num shr bp,1 ; div count by 4 and do groups of 4 shr bp,1 je $L555 $L546: mov eax,ecx mul DWORD PTR es:[bx] ; w* *a add eax,DWORD PTR ds:[di] ; + *r adc edx,0 adc eax,esi adc edx,0 mov DWORD PTR ds:[di],eax mov esi,edx ; mov eax,ecx mul DWORD PTR es:[bx+4] ; w* *a add eax,DWORD PTR ds:[di+4] ; + *r adc edx,0 adc eax,esi adc edx,0 mov DWORD PTR ds:[di+4],eax mov esi,edx ; mov eax,ecx mul DWORD PTR es:[bx+8] ; w* *a add eax,DWORD PTR ds:[di+8] ; + *r adc edx,0 adc eax,esi adc edx,0 mov DWORD PTR ds:[di+8],eax mov esi,edx ; mov eax,ecx mul DWORD PTR es:[bx+12] ; w* *a add eax,DWORD PTR ds:[di+12] ; + *r adc edx,0 adc eax,esi adc edx,0 mov DWORD PTR ds:[di+12],eax mov esi,edx ; add bx,16 add di,16 ; dec bp je $L555 jmp $L546 ; ; $L555: mov bp,sp mov bp,WORD PTR [bp+26] ; load num and bp,3 dec bp js $L547 mov eax,ecx mul DWORD PTR es:[bx] ; w* *a add eax,DWORD PTR ds:[di] ; + *r adc edx,0 adc eax,esi adc edx,0 mov DWORD PTR ds:[di],eax mov esi,edx dec bp js $L547 ; Note that we are now testing for -1 ; mov eax,ecx mul DWORD PTR es:[bx+4] ; w* *a add eax,DWORD PTR ds:[di+4] ; + *r adc edx,0 adc eax,esi adc edx,0 mov DWORD PTR ds:[di+4],eax mov esi,edx dec bp js $L547 ; mov eax,ecx mul DWORD PTR es:[bx+8] ; w* *a add eax,DWORD PTR ds:[di+8] ; + *r adc edx,0 adc eax,esi adc edx,0 mov DWORD PTR ds:[di+8],eax mov esi,edx $L547: mov eax,esi mov edx,esi shr edx,16 pop es pop ds pop di pop esi pop bx pop bp ret nop _bn_mul_add_word ENDP PUBLIC _bn_mul_word _bn_mul_word PROC FAR ; Line 76 push bp push bx push esi push di push ds push es xor esi,esi mov bp,sp mov di,WORD PTR [bp+18] ; r mov ds,WORD PTR [bp+20] mov bx,WORD PTR [bp+22] ; a mov es,WORD PTR [bp+24] mov ecx,DWORD PTR [bp+28] ; w mov bp,WORD PTR [bp+26] ; num $FC743: mov eax,ecx mul DWORD PTR es:[bx] add eax,esi adc edx,0 mov DWORD PTR ds:[di],eax mov esi,edx dec bp je $L764 ; mov eax,ecx mul DWORD PTR es:[bx+4] add eax,esi adc edx,0 mov DWORD PTR ds:[di+4],eax mov esi,edx dec bp je $L764 ; mov eax,ecx mul DWORD PTR es:[bx+8] add eax,esi adc edx,0 mov DWORD PTR ds:[di+8],eax mov esi,edx dec bp je $L764 ; mov eax,ecx mul DWORD PTR es:[bx+12] add eax,esi adc edx,0 mov DWORD PTR ds:[di+12],eax mov esi,edx dec bp je $L764 ; add bx,16 add di,16 jmp $FC743 nop $L764: mov eax,esi mov edx,esi shr edx,16 pop es pop ds pop di pop esi pop bx pop bp ret nop _bn_mul_word ENDP PUBLIC _bn_sqr_words _bn_sqr_words PROC FAR ; Line 92 push bp push bx push si push di push ds push es mov bp,sp mov si,WORD PTR [bp+16] mov ds,WORD PTR [bp+18] mov di,WORD PTR [bp+20] mov es,WORD PTR [bp+22] mov bx,WORD PTR [bp+24] mov bp,bx ; save a memory lookup later shr bx,1 ; div count by 4 and do groups of 4 shr bx,1 je $L666 $L765: mov eax,DWORD PTR es:[di] mul eax mov DWORD PTR ds:[si],eax mov DWORD PTR ds:[si+4],edx ; mov eax,DWORD PTR es:[di+4] mul eax mov DWORD PTR ds:[si+8],eax mov DWORD PTR ds:[si+12],edx ; mov eax,DWORD PTR es:[di+8] mul eax mov DWORD PTR ds:[si+16],eax mov DWORD PTR ds:[si+20],edx ; mov eax,DWORD PTR es:[di+12] mul eax mov DWORD PTR ds:[si+24],eax mov DWORD PTR ds:[si+28],edx ; add di,16 add si,32 dec bx je $L666 jmp $L765 $L666: and bp,3 dec bp ; The copied value of bx (num) js $L645 ; mov eax,DWORD PTR es:[di] mul eax mov DWORD PTR ds:[si],eax mov DWORD PTR ds:[si+4],edx dec bp js $L645 ; mov eax,DWORD PTR es:[di+4] mul eax mov DWORD PTR ds:[si+8],eax mov DWORD PTR ds:[si+12],edx dec bp js $L645 ; mov eax,DWORD PTR es:[di+8] mul eax mov DWORD PTR ds:[si+16],eax mov DWORD PTR ds:[si+20],edx $L645: pop es pop ds pop di pop si pop bx pop bp ret _bn_sqr_words ENDP PUBLIC _bn_div64 _bn_div64 PROC FAR push bp mov bp,sp mov edx, DWORD PTR [bp+6] mov eax, DWORD PTR [bp+10] div DWORD PTR [bp+14] mov edx,eax shr edx,16 pop bp ret _bn_div64 ENDP F_TEXT ENDS END