Untitled
unknown
assembly_x86
3 years ago
2.1 kB
6
Indexable
; ebp+8 produit ; ebp+12 produit_taille ; ebp+16 multiplicateur ; ebp+20 multiplicateur_taille ; ebp+24 multiplie ; ebp+28 multiplie_taille multiplier: PUSH EBP MOV EBP, ESP XOR EAX, EAX XOR ECX, ECX MOV EAX, dword[EBP+12] ; eax contient adresse de taille produit MOV ECX, dword[EBP+28] ; ecx contient adresse de taille multiplie MOV EDX, dword[ECX] ; EDX contient la valeur de taille multiplie MOV dword[EAX], EDX ; contenu de l'adresse taille produit = contenu de l'adresse taille multiplie ; ceci cera corrigé par la suite au besoin XOR EAX, EAX MOV ESI, dword[EBP+16] ; esi pointe au debut de l'inverse du multiplicateur ; alors esi pointe aux unites MOV EDI, dword[EBP+24] ; edi pointe au debut de l'inverse du multiplie MOV EBX, dword[EBP+28] ; ebx contient addresse de multiplie_taille MOV ECX, dword[EBX] ; ecx contient contenu de multiplie_taille XOR EBX, EBX MOV BL, byte[ESI] ; BL contient unite du multiplicateur CMP BL, 0 JNZ multiplicateurNonZero MOV EDX, dword[EBP+12] ; adresse de taille produit dans edx MOV dword[EDX], 1 ; taille du produit = 1 multiplicateurNonZero: MOV ESI, dword[EBP+8] ; ESI pointe au produit XOR EDX, EDX ; assure edx = 0 ; preparation pour multiplication multiplier_loop: MOV DH, DL ; sauver le carry de la derniere multiplication MOV AL, byte[EDI] MUL BL AAM ; carry dans le AH, unite dans le AL MOV DL, AH ; sauver le carry de cette multiplication XOR AH, AH ; AH = 0 ADD AL, DH ; ajouter le carry de la derniere multiplication AAA CMP AH, 1 JNZ no_addition_carry INC DL ; si l'addition a géneré un carry no_addition_carry: MOV byte[ESI], AL ADD byte[ESI], 48 INC ESI INC EDI DEC ECX CMP ECX, 0 JNZ multiplier_loop ; dernier carry? CMP DL, 0 JZ nonDernierCarry MOV byte[ESI], DL ADD byte[ESI], 48 MOV EDX, dword[EBP+12] ; adresse de taille produit dans edx INC dword[EDX] ; = taille du produit + 1 INC ESI nonDernierCarry: ; pour terminer la chaine MOV byte[ESI], 0 MOV ESP, EBP POP EBP RET
Editor is loading...