1
我對Assembly很新穎 - 不到一週的體驗。我試圖從提示符中接收字符,然後以十進制顯示ASCII碼。我一直在努力工作數小時,並決定來這裏。在裝配中將字符轉換爲ASCII碼(十進制)
當我在提示符中輸入'a'時,模擬器顯示我的char變量正在存儲61十六進制數,這是正確的。我似乎無法讓它打印到屏幕上(十六進制或十進制)。
編輯:更改代碼以循環和劃分由十。我有正確的印刷印刷,但反過來。數97打印出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
您的'PSTRING'宏使用[int 21h/ah = 9](http://www.ctyme.com/intr/rb-2562.htm)輸出到控制檯。從鏈接中你會看到該字符串被假定以'$'結尾。你可以做的是在你寫入角色的位置之後在內存中放置一個'$'。你應該可以通過將'CHAR db?'改成'CHAR db?,'$''來實現。這應該可以解決顯示垃圾的問題。 –
這解決了一個問題哈哈。主要的問題是我現在正在做的事情。看看我修改後的代碼。我做了一個循環來將十六進制數除以10,然後輸出每個數字。問題是,我的號碼出來esrever ...對不起,我的意思是相反。例如,我可以得到'a'的值爲97,但它出來79 – FoxDonut
我沒有看到你的代碼,但我收集你正在循環做10除法。它是由於您正在處理從最低有效位數到最高有效位數的數字而出現的。有很多方法可以解決這個問題,並且如果你看起來有一些例子(即基於堆棧,另一個將字符寫入輸出緩衝區,從右到左存儲它們) –