2016-04-10 79 views
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 
+0

您的'PSTRING'宏使用[int 21h/ah = 9](http://www.ctyme.com/intr/rb-2562.htm)輸出到控制檯。從鏈接中你會看到該字符串被假定以'$'結尾。你可以做的是在你寫入角色的位置之後在內存中放置一個'$'。你應該可以通過將'CHAR db?'改成'CHAR db?,'$''來實現。這應該可以解決顯示垃圾的問題。 –

+0

這解決了一個問題哈哈。主要的問題是我現在正在做的事情。看看我修改後的代碼。我做了一個循環來將十六進制數除以10,然後輸出每個數字。問題是,我的號碼出來esrever ...對不起,我的意思是相反。例如,我可以得到'a'的值爲97,但它出來79 – FoxDonut

+0

我沒有看到你的代碼,但我收集你正在循環做10除法。它是由於您正在處理從最低有效位數到最高有效位數的數字而出現的。有很多方法可以解決這個問題,並且如果你看起來有一些例子(即基於堆棧,另一個將字符寫入輸出緩衝區,從右到左存儲它們) –

回答

1

好吧,我解決了這個一個。這是最終的代碼。請記住,我只是一個初學者 - 所以如果這段代碼不好,請不要給我一個新的。它雖然工作!

; **************** 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 
相關問題