私はアセンブリに非常に慣れていません-1週間未満の経験です。プロンプトから文字を受け取り、ASCII コードを 10 進数で表示しようとしています。私はこれに何時間も取り組んできましたが、ここに来ることにしました。
プロンプトに「a」を入力すると、エミュレーターは、char 変数が 61 の 16 進数を格納していることを示しますが、これは正しいです。画面に(16進数または10進数で)印刷できないようです。
編集: コードをループスルーして 10 で割るように変更しました。正しい文字が印刷されていますが、逆になっています。THE NUMBER 97 PRINTS OUT 79
これまでのところ、これは私が持っているものです:
; **************** 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