Untitled

mail@pastecode.io avatar
unknown
assembly_x86
2 years ago
2.1 kB
2
Indexable
Never
; 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