【问题标题】:Convert Char to ASCII Code (Decimal) in Assembly在汇编中将字符转换为 ASCII 代码(十进制)
【发布时间】:2016-07-31 06:35:36
【问题描述】:

我对 Assembly 非常陌生 - 不到一周的经验。我试图从提示中接收一个字符,然后以十进制显示 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 输出到控制台。从链接中,您将看到该字符串假定以$ 结尾。您可以做的是在您将角色写入的位置之后将$ 放入内存中。您应该可以通过将 CHAR db ? 更改为 CHAR db ?, '$' 来做到这一点。这应该可以解决显示垃圾的问题。
  • 解决了一个问题,哈哈。主要问题是我现在正在做的事情。看看我修改后的代码。我做了一个循环将十六进制数除以 10,然后输出每个数字。问题是我的号码出来了 esrever ......对不起,我的意思是反向。例如,我可以得到 'a' 的值为 97,但结果是 79
  • 我没有看到你的代码,但我猜你正在循环重复除以 10。它是倒退的,因为您正在处理从最低有效数字到最高有效数字的数字。有很多方法可以解决这个问题,如果您看的话,甚至在 StackOverflow 上也有一些示例(一种是基于堆栈的,另一种是将字符写入从右到左存储它们的输出缓冲区)
  • @MichaelPetch 忘记包含您的姓名,以便您看到回复。谢谢你的时间迈克尔
  • @MichaelPetch(抱歉,编辑时间比我想象的要长)我见过的大多数推送/弹出方法将数字推送到 ax,但尝试这样做时总是出错。任何方式您都可以向我展示 8086 中的 push/pop 示例。我会继续看

标签: assembly decimal ascii x86-16 emu8086


【解决方案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

【讨论】:

    猜你喜欢
    • 2023-01-31
    • 2016-10-16
    • 2010-12-03
    • 2011-11-21
    • 2012-06-02
    • 1970-01-01
    • 2012-03-27
    • 2013-04-16
    • 2012-04-02
    相关资源
    最近更新 更多