2016-04-10 20 views
1

Ich bin sehr neu in Assembly - weniger als eine Woche Erfahrung. Ich versuche, in einem Zeichen von einer Eingabeaufforderung zu erhalten, dann zeige den ASCII-Code in Dezimal an. Ich habe stundenlang daran gearbeitet und beschlossen, hierher zu kommen.Konvertieren Char in ASCII-Code (Dezimal) in Assembly

Wenn ich 'a' in die Eingabeaufforderung einfüge, zeigt mein Emulator, dass meine char-Variable 61 Hexadezimal speichert, was korrekt ist. Ich kann es einfach nicht auf den Bildschirm drucken lassen (in Hex oder Dezimal).

BEARBEITEN: GEÄNDERTER CODE ZUM DURCHSCHNEIDEN UND TEILEN. ICH HABE DIE RICHTIGEN ZEICHEN AUSDRUCKEN, ABER REVERSE. DIE ZAHL 97 ausdruckt 79

Bisher ist das, was ich habe:

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

Ihre 'PSTRING' Makros verwendet [int 21h/ah = 9] (http://www.ctyme.com/intr/rb-2562.htm) zur Ausgabe an die Konsole. Von dem Link, den Sie sehen werden, soll der String mit einem '$' enden. Was Sie tun können, ist ein '$' im Speicher direkt nach dem Ort, an den Sie Ihren Charakter schreiben. Sie sollten dazu in der Lage sein, 'CHAR db?' In 'CHAR db?, '$'' Zu ändern. Das sollte das Problem lösen, dass Müll angezeigt wird. –

+0

Das löst ein Problem lol. Das Hauptproblem ist etwas, an dem ich gerade arbeite. Werfen Sie einen Blick auf meinen überarbeiteten Code. Ich machte eine Schleife, um die Hex-Zahl durch 10 zu teilen, und gab dann jede Zahl aus. Das Problem ist, dass meine Nummer esrever rauskommt ... sorry, ich meine umgekehrt. Zum Beispiel kann ich den Wert für 'a' auf 97 setzen, aber es kommt heraus 79 – FoxDonut

+0

Ich sehe Ihren Code dafür nicht, aber ich versichere Ihnen, dass Sie wiederholt Division durch 10 wiederholen. Es kommt rückwärts, weil Sie die Zahlen von den niedrigstwertigen Ziffern zu den höchstwertigen Ziffern verarbeiten. Es gibt eine Reihe von Möglichkeiten, um damit umzugehen, und es gibt einige Beispiele sogar auf StackOverflow, wenn Sie schauen (einer ist stapelbasiert und ein anderer würde Zeichen in einen Ausgabepuffer schreiben, der sie von rechts nach links speichert) –

Antwort

1

Okay, ich dieses gelöst. Hier ist der endgültige Code. Bitte denken Sie daran, ich bin nur ein Anfänger - also zerreißen Sie mir nicht einen neuen, wenn dieser Code schlecht ist. Es funktioniert aber!

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