2016-04-10 6 views
1

Je suis très nouveau à l'assemblage - moins d'une semaine d'expérience. J'essaie de recevoir dans un caractère à partir d'une invite, puis afficher le code ASCII en décimal. J'ai travaillé dessus pendant des heures et j'ai décidé de venir ici.Convertir le caractère en code ASCII (décimal) dans l'assemblage

Lorsque je mets 'a' dans l'invite, mon émulateur montre que ma variable char stocke 61 hexadécimal, ce qui est correct. Je n'arrive tout simplement pas à l'imprimer à l'écran (en hexadécimal ou en décimal).

MODIFIER: CODE CHANGÉ POUR BOUCLE ET DIVISER PAR DIX. J'ai la bonne CHARS IMPRESSION, MAIS EN INVERSE. LE NOMBRE 97 79 Imprime

Jusqu'à présent, ce que j'ai:

; **************** MACROS ********************* 

; START PROGRAM 
START MACRO 

    MOV AX, DATA ; Data Segment to AX Register 
    MOV DS, AX ; HAVE DS Point to Data Segment 
ENDM   

; END PROGRAM 
END MACRO 

    MOV AH, 4CH ; END Program 
    INT 21H  ; Call DOS Service 
ENDM 

; PRINT STRING TO OUTPUT   
PSTRING MACRO STR 

    MOV AH,09H 
    LEA DX,STR 
    INT 21H 
ENDM 

; Creates a New Line 
NEWLINE MACRO 
    MOV DX, 0AH ; Input of string to DX 
    MOV AH, 02H ; Write Char to standard output 
    INT 21H   

    MOV DL, 0DH ; 
    MOV AH, 02H ; Carriage Return 
    INT 21H  ; 
ENDM 

; Get CHAR Input 
GETINPUT MACRO INPUT 

    MOV AH, 01H  ; Receive input   
    INT 21H   ; Call DOS Service 

    MOV INPUT, AL ; Store into Input Variable 
ENDM 

; ********** END MACROS ******************* 


.MODEL 
.DATA 

    MSG1 db 'Choose A Char to Convert To ASCII: $' 
    CHAR db ? ; Store Input Char 
    REM db ? ; Remainder 8-bit storate 
    QUOT db ? ; Quotient 8-bit storage 

.CODE 

    MAIN PROC 

    START 

    PSTRING MSG1 

    GETINPUT CHAR 

    NEWLINE  

    MOV AX, 0  ; Clear AX Register 
    MOV AL, CHAR ; Move input to AL 

    MOV DX, 0  ; Clear DX Register 
    MOV DL, 10 ; Add 10 to DL Register 
    DIV DL  ; Divide By Number of Students For Average 

    ; ********************** ; 
    ; QUOTIENT STORED IN AL ; 
    ; REMAINDER STORED IN AH ; 
    ; ********************** ;            


    myLoop: 

     MOV REM, AH ; Move Remainder into REM Variable 
     MOV QUOT, AL ; Move Quotient into QUOT Variable 

     MOV DL, REM ; Move Data we want printed into DL 
     ADD DL, '0' ; Make into Ascii Char 

     MOV AH,02H ; Output Char Service 
     INT 21H  ; Call DOS Service 


     MOV AL, QUOT ; Place Quotient Into AL 
     MOV AH, 0  ; AH was altered, Zero it out 

     MOV DL, 10 ; Set Divisor to 10 
     DIV DL  ; Divide AX by 10 

     CMP AH, 0  ; If No Quotient Remains we can exit 

    JNZ myLoop  ; Jump if NOT zero 


    MOV AH, 4CH  ; End Program 
    INT 21H  

    END    

    MAIN ENDP 
END MAIN 
+0

Vos 'macros PSTRING' utilisations [21H/ah = 9] (http://www.ctyme.com/intr/rb-2562.htm) à la sortie de la console. À partir du lien, vous verrez que la chaîne est supposée se terminer par un '$'. Ce que vous pouvez faire est de placer un '$' dans la mémoire juste après l'endroit où vous écrivez votre personnage. Vous devriez être capable de le faire en changeant 'CHAR db?' À 'CHAR db? ',' $ ''. Cela devrait résoudre le problème d'indésirable affiché. –

+0

Cela résout un problème lol. Le problème principal est quelque chose sur lequel je travaille maintenant. Jetez un coup d'oeil à mon code révisé. J'ai fait une boucle pour diviser le nombre hexadécimal par 10, puis sortir chaque nombre. Le problème est que mon numéro sortira esrever ... désolé, je veux dire inverse. Par exemple, je peux obtenir la valeur pour 'a' être 97, mais il sort 79 – FoxDonut

+0

Je ne vois pas votre code pour cela, mais je suppose que vous êtes en train de faire la boucle en répétant 10 fois. Il revient en arrière parce que vous traitez les chiffres des chiffres les moins significatifs aux chiffres les plus significatifs. Il y a plusieurs façons de gérer cela, et il y a des exemples même sur StackOverflow si vous regardez (l'un est basé sur une pile et l'autre serait d'écrire des caractères dans un tampon de sortie de droite à gauche) –

Répondre

1

D'accord, je résolu celui-ci. Voici le code final. S'il vous plaît rappelez-vous que je suis juste un débutant - alors ne me déchire pas un nouveau si ce code est mauvais. Cela fonctionne bien!

; **************** MACROS ********************* 

; START PROGRAM 
START MACRO 

    MOV AX, DATA ; Data Segment to AX Register 
    MOV DS, AX ; HAVE DS Point to Data Segment 
ENDM   

; END PROGRAM 
END MACRO 

    MOV AH, 4CH ; END Program 
    INT 21H  ; Call DOS Service 
ENDM 

; PRINT STRING TO OUTPUT   
PSTRING MACRO STR 

    MOV AH,09H 
    LEA DX,STR 
    INT 21H 
ENDM 

; Creates a New Line 
NEWLINE MACRO 
    MOV DX, 0AH ; Input of string to DX 
    MOV AH, 02H ; Write Char to standard output 
    INT 21H   

    MOV DL, 0DH ; 
    MOV AH, 02H ; Carriage Return 
    INT 21H  ; 
ENDM 

; Get CHAR Input 
GETINPUT MACRO INPUT 

    MOV AH, 01H  ; Receive input   
    INT 21H   ; Call DOS Service 

    MOV INPUT, AL ; Store into Input Variable 
ENDM 

; ********** END MACROS ******************* 


.MODEL 

.STACK 100H 

.DATA 

    MSG1 db 'Choose A Char to Convert To ASCII: $' 
    CHAR db ? ; Store Input Char 
    REM db ? ; Remainder 8-bit storate 
    QUOT db ? ; Quotient 8-bit storage 
    COUNT db 0 ; Counts the stacks 

.CODE 

    MAIN PROC 

    START 

    PSTRING MSG1 

    GETINPUT CHAR 

    NEWLINE  

    MOV AX, 0  ; Clear AX Register 
    MOV AL, CHAR ; Move input to AL 

    MOV DX, 0  ; Clear DX Register 

    ; ********************** ; 
    ; QUOTIENT STORED IN AL ; 
    ; REMAINDER STORED IN AH ; 
    ; ********************** ;            


    myLoop: 

     MOV DL, 10 ; Set Divisor to 10 
     DIV DL  ; Divide AX by 10 

     MOV REM, AH ; Move Remainder into REM Variable 
     MOV QUOT, AL ; Move Quotient into QUOT Variable 

     MOV AX, 0  ; Clear AX 
     MOV AL, REM ; Move REM to AL 
     PUSH AX  ; Push AX to Stack 
     INC COUNT  ; Increase Count by 1 

     MOV AL, QUOT ; Place Quotient Into AL 
     MOV AH, 0  ; AH was altered, Zero it out 

     CMP AL, 0  ; If No Quotient Remains we can exit 

    JNZ myLoop  ; Jump if NOT zero 

    myLoop2: 

     POP DX  ; Pop from the stack into DX 

     ADD DX, '0' ; To Ascii Char 
     MOV AH, 02H ; Print Char Command 
     INT 21H  ; Call to DOS System 

     DEC COUNT  ; Decrement COUNT 
     CMP COUNT, 0 ; Compare COUNT to 0 


    JNZ myLoop2  

    END    

    MAIN ENDP 
END MAIN