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
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. –
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
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) –