; Calcule la somme "cheksum" TCP/IP (16-bit carry-wrapping) du tampon ; commençant à ESI, de longueur ECX words. ; Retourne checksum dans AX. ; Mots de poids fort de EAX, BX, EDX, ECX et ESI sont détruits. ; Tous les comptages de cycles nécessites le mode protégé 32 bits. ; et suppose que la longuer du tampon > 0. sub eax,eax ;initialise la checksum sub edx,edx ;prépare l'emploi ultérieur d'un OR shr ecx,1 ;nous ferons deux mots par boucle jnc short ckloopsetup ;nombre pair de mots mov ax,[esi] ;rendre le mot impair jz short ckloopdone ;plus de mots dans la ;somme add esi,2 ;pointe sur le prochain mot ckloopsetup: mov dx,[esi] ;charge la plupart des premiers mots mov bl,[esi+2] ;dans checksum (dernier octet ;chargé dans la boucle) dec ecx ;y a-t-il encore des mots longs dans ; checksum? jz short ckloopend ;non ckloop: mov bh,[esi+3];pipeline U 1er cycle add esi,4 ;pipeline V 1er cycle shl ebx,16 ;pipeline U 2ème cycle ;pipeline V 2ème cycle en attente ;(conflit de registre) or ebx,edx ;pipeline U 3ème cycle mov dl,[esi] ;pipeline V 3ème cycle add eax,ebx ;pipeline U 4èmecycle mov bl,[esi+2];pipeline V 4ème cycle adc eax,0 ;pipeline U 5ème cycle mov dh,[esi+1];pipeline V 5ème cycle dec ecx ;pipeline U 6ème cycle jnz ckloop ;pipeline V 6ème cycle ckloopend: mov bh,[esi+3] ;checksum du dernier mots long add ax,dx adc ax,bx adc ax,0 mov edx,eax ;convertit la somme 32 sur bits shr edx,16 ;en somme sur 16 bits add ax,dx adc eax,0 ckloopdone: