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