TITLE bn_mulw.c .386P .model FLAT PUBLIC _bn_mul_add_word _TEXT SEGMENT ; File bn_mulw.c _bn_mul_add_word PROC NEAR push ebp push ebx push esi push edi mov edi,DWORD PTR 20[esp] ; r mov ebx,DWORD PTR 24[esp] ; a mov ecx,DWORD PTR 32[esp] ; w xor esi,esi ; c=0 mov ebp,DWORD PTR 28[esp] ; num shr ebp,2 ; num/4 jz $L666 $L546: ; Round one mov eax,DWORD PTR [ebx] ; edx:eax = *a * w mul ecx add eax,DWORD PTR [edi] ; *r+=ax adc edx,0 add eax,esi ; edx:eax += c adc edx,0 mov DWORD PTR [edi],eax ; *r+=ax mov esi,edx ; c = overflow ; Round two mov eax,DWORD PTR 4[ebx] ; edx:eax = *a * w mul ecx add eax,DWORD PTR 4[edi] ; *r+=ax adc edx,0 add eax,esi ; edx:eax += c adc edx,0 mov DWORD PTR 4[edi],eax ; *r+=ax mov esi,edx ; c = overflow ; Round three mov eax,DWORD PTR 8[ebx] ; edx:eax = *a * w mul ecx add eax,DWORD PTR 8[edi] ; *r+=ax adc edx,0 add eax,esi ; edx:eax += c adc edx,0 mov DWORD PTR 8[edi],eax ; *r+=ax mov esi,edx ; c = overflow ; Round four mov eax,DWORD PTR 12[ebx] ; edx:eax = *a * w mul ecx add eax,DWORD PTR 12[edi] ; *r+=ax adc edx,0 add eax,esi ; edx:eax += c adc edx,0 mov DWORD PTR 12[edi],eax ; *r+=ax mov esi,edx ; c = overflow add ebx,16 add edi,16 dec ebp jz $L666 jmp $L546 $L666: mov ebp,DWORD PTR 28[esp] ; num and ebp,3 ; num%4 jz $L547 ; Round one mov eax,DWORD PTR [ebx] ; edx:eax = *a * w mul ecx add eax,DWORD PTR [edi] ; *r+=ax adc edx,0 add eax,esi ; edx:eax += c adc edx,0 mov DWORD PTR [edi],eax ; *r+=ax mov esi,edx ; c = overflow dec ebp jz $L547 ; Round two mov eax,DWORD PTR 4[ebx] ; edx:eax = *a * w mul ecx add eax,DWORD PTR 4[edi] ; *r+=ax adc edx,0 add eax,esi ; edx:eax += c adc edx,0 mov DWORD PTR 4[edi],eax ; *r+=ax mov esi,edx ; c = overflow dec ebp jz $L547 ; Round three mov eax,DWORD PTR 8[ebx] ; edx:eax = *a * w mul ecx add eax,DWORD PTR 8[edi] ; *r+=ax adc edx,0 add eax,esi ; edx:eax += c adc edx,0 mov DWORD PTR 8[edi],eax ; *r+=ax mov esi,edx ; c = overflow $L547: mov eax,esi pop edi pop esi pop ebx pop ebp ret _bn_mul_add_word ENDP _TEXT ENDS PUBLIC _bn_mul_word _TEXT SEGMENT _bn_mul_word PROC NEAR push ebp push ebx push esi push edi mov edi,DWORD PTR 20[esp] ; r mov ebx,DWORD PTR 24[esp] ; a mov ebp,DWORD PTR 28[esp] ; num mov ecx,DWORD PTR 32[esp] ; w xor esi,esi ; c=0 shr ebp,2 ; num/4 jz $L266 $L593: ; Round one mov eax,DWORD PTR [ebx] ; edx:eax= w * *a mul ecx add eax,esi ; edx:eax+=c adc edx,0 mov DWORD PTR [edi],eax ; *r=eax mov esi,edx ; c=edx ; Round two mov eax,DWORD PTR 4[ebx] ; edx:eax= w * *a mul ecx add eax,esi ; edx:eax+=c adc edx,0 mov DWORD PTR 4[edi],eax ; *r=eax mov esi,edx ; c=edx ; Round three mov eax,DWORD PTR 8[ebx] ; edx:eax= w * *a mul ecx add eax,esi ; edx:eax+=c adc edx,0 mov DWORD PTR 8[edi],eax ; *r=eax mov esi,edx ; c=edx ; Round four mov eax,DWORD PTR 12[ebx] ; edx:eax= w * *a mul ecx add eax,esi ; edx:eax+=c adc edx,0 mov DWORD PTR 12[edi],eax ; *r=eax mov esi,edx ; c=edx add ebx,16 add edi,16 dec ebp jz $L266 jmp $L593 $L266: mov ebp,DWORD PTR 28[esp] ; num and ebp,3 jz $L601 ; Round one mov eax,DWORD PTR [ebx] ; edx:eax= w * *a mul ecx add eax,esi ; edx:eax+=c adc edx,0 mov DWORD PTR [edi],eax ; *r=eax mov esi,edx ; c=edx dec ebp jz $L601 ; Round two mov eax,DWORD PTR 4[ebx] ; edx:eax= w * *a mul ecx add eax,esi ; edx:eax+=c adc edx,0 mov DWORD PTR 4[edi],eax ; *r=eax mov esi,edx ; c=edx dec ebp jz $L601 ; Round three mov eax,DWORD PTR 8[ebx] ; edx:eax= w * *a mul ecx add eax,esi ; edx:eax+=c adc edx,0 mov DWORD PTR 8[edi],eax ; *r=eax mov esi,edx ; c=edx $L601: mov eax,esi pop edi pop esi pop ebx pop ebp ret _bn_mul_word ENDP _TEXT ENDS PUBLIC _bn_sqr_words _TEXT SEGMENT _bn_sqr_words PROC NEAR push ebx push esi push edi mov esi,DWORD PTR 16[esp] ; r mov edi,DWORD PTR 20[esp] ; a mov ebx,DWORD PTR 24[esp] ; num shr ebx,2 ; num/4 jz $L111 $L640: ; Round 1 mov eax, DWORD PTR [edi] mul eax ; *a * *a mov DWORD PTR [esi],eax mov DWORD PTR 4[esi],edx ; Round 2 mov eax, DWORD PTR 4[edi] mul eax ; *a * *a mov DWORD PTR 8[esi],eax mov DWORD PTR 12[esi],edx ; Round 3 mov eax, DWORD PTR 8[edi] mul eax ; *a * *a mov DWORD PTR 16[esi],eax mov DWORD PTR 20[esi],edx ; Round 4 mov eax, DWORD PTR 12[edi] mul eax ; *a * *a mov DWORD PTR 24[esi],eax mov DWORD PTR 28[esi],edx add edi,16 add esi,32 dec ebx jz $L111 jmp $L640 $L111: mov ebx,DWORD PTR 24[esp] ; num and ebx,3 ; num%3 jz $L645 ; Round 1 mov eax, DWORD PTR [edi] mul eax ; *a * *a mov DWORD PTR [esi],eax mov DWORD PTR 4[esi],edx dec ebx jz $L645 ; Round 2 mov eax, DWORD PTR 4[edi] mul eax ; *a * *a mov DWORD PTR 8[esi],eax mov DWORD PTR 12[esi],edx dec ebx jz $L645 ; Round 3 mov eax, DWORD PTR 8[edi] mul eax ; *a * *a mov DWORD PTR 16[esi],eax mov DWORD PTR 20[esi],edx $L645: pop edi pop esi pop ebx ret _bn_sqr_words ENDP _TEXT ENDS PUBLIC _bn_div64 _TEXT SEGMENT _bn_div64 PROC NEAR mov edx, DWORD PTR 4[esp] mov eax, DWORD PTR 8[esp] div DWORD PTR 12[esp] ret _bn_div64 ENDP _TEXT ENDS END