2016-06-03 1 views
2

Ici, j'ai essayé quelque chose pour imprimer 10 à 0 nombres décimaux en emu8086.Comment puis-je imprimer 0 à 100 en langage assembleur dans emu 8086?

 .MODEL SMALL 
    .STACK 100H 
    .DATA 
     NUM DB 58D 

    .CODE 
    MAIN PROC 
      MOV AX,@DATA 
      MOV DS,AX 


    START: 
     CMP NUM,48D 
     JGE PRINT 
     JMP END_ 


    PRINT: 
     MOV AH,2 
     MOV DL,NUM 
     INT 21H 
     DEC NUM 
     JMP START 

    END_: 
     MOV AH,4CH 
     MAIN ENDP 
    END MAIN 

Il fonctionne parfaitement lors de l'impression 9 à 0 mais il ne l'impression 10 au lieu du caractère ascii de la valeur 10d. Je suis nouveau dans assembly language .so comment puis-je imprimer 0 à 100 nombres décimaux?

+0

Copie possible de http://stackoverflow.com/questions/15621258/assembly-printing-ascii-number – DAXaholic

+0

Fondamentalement, vous devez effectuer manuellement la conversion binaire en décimal. C'est ce que 'printf' faisait toujours dans les coulisses, mais maintenant ce n'est pas là pour vous aider. Mieux vaut commencer à lire sur 'DIV'. Vous pouvez également créer des boucles imbriquées pour imprimer les unités et les chiffres 10s. –

+0

Il imprime le caractère ASCII avec la valeur 58, qui est ":". Il n'imprime aucune valeur '10d', ce serait le" nouveau saut de ligne "en ASCII. Les 9 à 0 n'impriment pas les valeurs 0-9, mais 48-57. Quels sont les chiffres '0' à '9' en codage ASCII. Donc, si vous voulez faire 100 à 0, vous devez soit faire un algorithme de travail avec 1 à 3 valeurs de caractères ASCII (48-57), ou faire le comptage réel sous forme entière (de 100 à 0), et convertir ce nombre en 1 à 3 caractères ASCII (48-57) selon les besoins. Comme d'autres commentaires le disent. (Je viens d'ajouter ceci parce que vous dites "valeur du caractère ascii de 10d" = nope) – Ped7g

Répondre

2

La solution appropriée et générique à votre problème est de convertir les nombres en chaînes. Pour vous montrer comment faire j'ai fait venir des modifications à votre code:

  • Changé le type de NUM, DB-DW (requis par number2string, il détiendrait plus grand nombre).
  • Ajout de la variable numstr, qui est NUM convertie en chaîne.
  • Ajout de la variable lbk (juste un saut de ligne après chaque numéro).
  • Ajouté proc number2string, pour convertir un nombre dans AX à la chaîne pointée par SI (c'est le plus important).
  • Ajouté proc dollars, pour remplir numstr avec des signes dollar (nécessaire pour afficher, et pour effacer la chaîne avant de convertir le nombre suivant).

Voici votre code affichage des nombres de 0 à 100 (les commentaires vous aideront à comprendre):

 .MODEL SMALL 
    .STACK 100H 
    .DATA 
     NUM DW ?         
     lbk db 13,10,'$' ;LINE BREAK. 
     numstr db '$$$$$'  ;STRING FOR 4 DIGITS. 

    .CODE 
    MAIN PROC 
      MOV AX,@DATA 
      MOV DS,AX 

     MOV NUM, 0   ;FIRST NUMBER. 
    START: 
     CMP NUM, 100  ;IF NUM <= 100... 
     JBE PRINT   ;...DISPLAY NUM.   
     JMP END_ 

    PRINT: 
;   MOV AH,2   ;THIS CODE 
;   MOV DL,NUM   ;DISPLAYS 
;   INT 21H    ;ONE CHAR ONLY. 

    ;CONVERT NUMBER TO STRING. 
     mov si, offset numstr 
     mov ax, num 
     call number2string ;RETURNS NUMSTR. 

    ;DISPLAY STRING. 
     mov ah, 9 
     mov dx, offset numstr 
     int 21h  

    ;DISPLAY LINE BREAK. 
     mov ah, 9 
     mov dx, offset lbk 
     int 21h  

     INC NUM    ;NUM++. 
     JMP START 

    END_: 
     MOV Ax,4C00H 
     int 21h 
     MAIN ENDP 

;------------------------------------------ 
;CONVERT A NUMBER IN STRING. 
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE 
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE 
;ORDER TO CONSTRUCT STRING (STR). 
;PARAMETERS : AX = NUMBER TO CONVERT. 
;    SI = POINTING WHERE TO STORE STRING. 

number2string proc 
    call dollars ;FILL STRING WITH $. 
    mov bx, 10 ;DIGITS ARE EXTRACTED DIVIDING BY 10. 
    mov cx, 0 ;COUNTER FOR EXTRACTED DIGITS. 
cycle1:  
    mov dx, 0 ;NECESSARY TO DIVIDE BY BX. 
    div bx  ;DX:AX/10 = AX:QUOTIENT DX:REMAINDER. 
    push dx  ;PRESERVE DIGIT EXTRACTED FOR LATER. 
    inc cx  ;INCREASE COUNTER FOR EVERY DIGIT EXTRACTED. 
    cmp ax, 0 ;IF NUMBER IS 
    jne cycle1 ;NOT ZERO, LOOP. 
;NOW RETRIEVE PUSHED DIGITS. 
cycle2: 
    pop dx   
    add dl, 48 ;CONVERT DIGIT TO CHARACTER. 
    mov [ si ], dl 
    inc si 
    loop cycle2 

    ret 
number2string endp  

;------------------------------------------ 
;FILLS VARIABLE WITH '$'. 
;USED BEFORE CONVERT NUMBERS TO STRING, BECAUSE 
;THE STRING WILL BE DISPLAYED. 
;PARAMETER : SI = POINTING TO STRING TO FILL. 

proc dollars     
    mov cx, 5 
    mov di, offset numstr 
dollars_loop:  
    mov bl, '$' 
    mov [ di ], bl 
    inc di 
    loop dollars_loop 

    ret 
endp 

;------------------------------------------ 

    END MAIN 

A partir de maintenant, vous pouvez utiliser number2string et dollars pour afficher les nombres.

+1

Merci beaucoup pour votre aide. –