Aide avec un prog. d'add. en lang. assembleur

spoonatte Messages postés 85 Statut Membre -  
nicocorico Messages postés 846 Statut Membre -
Bonjour,

J'ai créé un programme en langage Assembleur pour l'addition de deux nombre, mais j'ai un problème que le résultat est toujours 'M' , C'est le code source :

.Model Small
.Stack 100H
.Data
	MSG1 	DB 'Saisie le premier nombre : $'
	;N1 		DB ?,'$'
	MSG2	DB 0DH,0AH,'Saisie le deuxieme nombre : $'
	;N2 		DB ?,'$'
	MSG3 	DB 0DH,0AH,'La somme est : $'
	Somme	DB ?,'$'
	MSG4 	DB 0DH,0AH,'Press Any Key To Continue ...$'
.Code
	MAIN PROC
		;Initialize Data Segment
		MOV AX, @Data
		MOV DS, AX
		
		;Print MSG1
		MOV AH,09H
		LEA DX, MSG1
		INT 21H
		
		;Scan N1
		MOV AH,01H
		INT 21H
		MOV BL, AL ; Enregistrer le premier nombre dans le registre BL
		
		;Print MSG2
		MOV AH,09H
		LEA DX, MSG2
		INT 21H
		
		;Scan N2
		MOV AH,01H
		INT 21H
		
		;Add BL To AL
		ADC AL, BL ; AL = AL + BL <==> AL = le premier nombre + le deuxiem nombre
		MOV SOMME, AL ; SOMME = AL
		
		;Print MSG3
		MOV AH,09H
		LEA DX, MSG3
		INT 21H
		
		;Print La somme
		MOV AH,02H
		LEA DX, SOMME
		INT 21H
		
		;Print close msg
		MOV AH,09H
		LEA DX, MSG4
		INT 21H
		
		;Stop program
		MOV AH,01H
		INT 21H
		
		;Return to DOS
		MOV AH,4CH
		INT 21H
		
	MAIN ENDP
END MAIN


A voir également:

1 réponse

nicocorico Messages postés 846 Statut Membre 138
 
Tu cherches à afficher le nombre en passant par sa variable, ça ne peut fonctionner car il n'y a pas de fonction d'affichage de nombre, il faut pour cela le convertir en chaine de caractères...
1
nicocorico Messages postés 846 Statut Membre 138
 
Et il faut aussi que tu utilises "add", pas "adc" qui ajoute la retenue alors qu'elle est ici indéterminée.
0
spoonatte Messages postés 85 Statut Membre
 
D'accord, merci
Mais comment je peux le traduire en chaine de caractères?
0
nicocorico Messages postés 846 Statut Membre 138
 
Hé bien, si tu veux l'afficher en décimal il faut diviser la valeur par 10 et récupérer le reste de la division auquel tu ajoutes 48 (ascii = '0'), tu fais ça tant que la valeur est supérieure à 0, chaque reste de division donnant les chiffres du plus faible au plus fort.
0
nicocorico Messages postés 846 Statut Membre 138
 
Voici la marche à suivre:
  tab db 06 dup (?)     
   
  ;AX doit être initialisé avec la valeur à afficher  

  Mov   SI,offset tab[05]   ; on fait pointer SI sur la fin de la chaine  
  Mov   Byte ptr [SI],'$'   ; Place le caractère de fin
  Mov   CX,10;     

@Bcl:     
  Dec   SI       ; On commence par décrémenter car on a déjà mis '$' 
  Xor   DX,DX    ; Il faut mettre DX à 0 avant la division
  Div   CX       ; Divise AX par 10, DX contient le reste     
  Add   DL,48    ; Ajoute '0' en ascii     
  Mov   [SI],DL  ; Place le caractère     
  And   AX,AX    ; Teste si AX vaut 0     
  Jnz   @Bcl    

  ; En sortie de boucle, SI pointe sur le 1er caractère du nombre     

  Mov   DX,SI     
  Mov   AH,09h     
  Int   21     ; Affiche la chaine
0