8
votes

Imprimer entier à la console dans l'assemblage X86

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---;;


0 commentaires

4 Réponses :


4
votes

L'algorithme de base est la suivante: xxx

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.

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.


0 commentaires

2
votes
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.

0 commentaires

13
votes

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.


4 commentaires

Je pourrais avoir tort, mais je pense que votre code imprime les chiffres en sens inverse. E.g.: 123 Impressions 321


Cela imprime dans inverse commande, chiffre moins important en premier. Stockez dans un tampon comme * p-- = chiffre , à 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 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.



7
votes

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


0 commentaires