; Calcule la somme "checksum" TCP/IP (16-bit carry-wrapping) du tampon ; commençant à ESI, de longueur ECX words. ; Retourne checksum dans AX. ; Les mots de poids fort EAX, EBX, ECX, EDX, et ESI sont détruits. ; Tous les comptages de cycles impliquent le mode protégé 32 bits. ; Suppose que le tampon commence sur la limite d'un mot long ,que sa longueur ; est multiple d'un mot long et que sa longueur > 0. sub eax,eax ;initialise la somme shr ecx,2 ;nous ferons deux mots longs par ;boucle jnc short noodddword ;y a t-il un mot long ;impair dans le tampon? mov eax,[esi] ;somme du mot long impair jz short ckloopdone ;non, terminé add esi,4 ;pointe sur le prochain mots long noodddword: mov edx,[esi] ;précharge le premier mot long mov ebx,[esi+4] ;précharge le second mot long dec ecx ;nous ferons 1 somme en dehors de la ; boucle jz short ckloopend ;1 seule somme à faire add esi,8 ;pointe sur le prochain mot long ckloop: add eax,edx ;pipeline U 1er cycle mov edx,[esi] ;pipeline V 1er cycle adc eax,ebx ;pipeline U 2ème cycle mov ebx,[esi+4];pipeline V 2ème cycle adc eax,0 ;pipeline U 3ème cycle add esi,8 ;pipeline V 3ème cycle dec ecx ;pipeline U 4ème cycle jnz ckloop ;pipeline V 4ème cycle ckloopend: add eax,edx ;checksum des deux derniers mots ;longs adc eax,ebx adc eax,0 ckloopdone: mov edx,eax ;convertit la somme 32 bits shr edx,16 ;en somme 16 bits add ax,dx adc eax,0