Lorsque j'ajoute deux valeurs en 16 bits, quelle est la meilleure façon d'imprimer le résultat à la console?
Pour le moment, j'ai ce code: P>
;;---CODE START---;; mov ax, 1 ;put 1 into ax add ax, 2 ; add 2 to ax current value mov ah,2 ; 2 is the function number of output char in the DOS Services. mov dl, ax ; DL takes the value. int 21h ; calls DOS Services mov ah,4Ch ; 4Ch is the function number for exit program in DOS Services. int 21h ; function 4Ch doesn't care about anything in the registers. ;;---CODE END---;;
4 Réponses :
L'algorithme de base est la suivante: Notez que cela produira les chiffres de l'ordre inverse, vous allez donc probablement vouloir remplacer l'étape "EMIT" avec quelque chose qui stocke chaque chiffre, de sorte que vous puissiez plus tard itérer à l'envers sur les chiffres stockés. P> Aussi, notez que convertir un nombre binaire compris entre 0 et 9 (décimal) en ASCII, ajoutez simplement le code ASCII pour "0" (qui est 48) au nombre. p> p>
mov dl, ax This won't work as dl and ax have different bit sizes. What you want to do is create a loop in which you divide the 16 bit value by 10, remember the rest on the stack, and then continue the loop with the integer division result. When you reach a result of 0, clean up the stack digit by digit, adding 48 to the digits to turn them into ASCII digits, then print them.
Vous voulez essentiellement diviser par 10, imprimez le reste (à un chiffre), puis répétez-le avec le quotient.
mov ax, 1 ;put 1 into ax add ax, 2 ; add 2 to ax current value mov dl, al ; DL takes the value. mov ah,2 ; 2 is the function number of output char in the DOS Services.
Je pourrais avoir tort, mais je pense que votre code imprime les chiffres en sens inverse. E.g.: 123 i> Impressions 321 i>
Cela imprime dans inverse i> commande, chiffre moins important en premier. Stockez dans un tampon comme * p-- = chiffre code>, à partir de la fin et en marche arrière, pour faire une chaîne. Ou voir Affichage des numéros avec DOS
@Petercordes: Je pense que c'est juste ce que Sidon a écrit dans sa réponse ci-dessous: Stackoverflow.com/a/5812104/1084
Oui. Je pense que j'ai remarqué la même chose après i> commentant ici et passez à regarder les autres réponses. Celui-ci est accepté et constitué de manière significative, il devrait encore être corrigé, alors j'ai décidé de laisser ce commentaire en place.
Il suffit de fixer l'ordre du code de @nathan Fellman
PrintNumber proc mov cx, 0 mov bx, 10 @@loophere: mov dx, 0 div bx ;divide by ten ; now ax <-- ax/10 ; dx <-- ax % 10 ; print dx ; this is one digit, which we have to convert to ASCII ; the print routine uses dx and ax, so let's push ax ; onto the stack. we clear dx at the beginning of the ; loop anyway, so we don't care if we much around with it push ax add dl, '0' ;convert dl to ascii pop ax ;restore ax push dx ;digits are in reversed order, must use stack inc cx ;remember how many digits we pushed to stack cmp ax, 0 ;if ax is zero, we can quit jnz @@loophere ;cx is already set mov ah, 2 ;2 is the function number of output char in the DOS Services. @@loophere2: pop dx ;restore digits from last to first int 21h ;calls DOS Services loop @@loophere2 ret PrintNumber endp