汇编、打印ascii号

aro*_*n23 2 x86 assembly ascii x86-16

我的汇编代码有问题。我想打印存储在寄存器cx中的数字,但是当我尝试打印它时,它打印的是ascii字符而不是ascii数字,所以我决定编写一个过程将ascii字符转换为ascii值。问题是,当我尝试调用该过程时,程序冻结,我必须重新启动 dosbox。有谁知道这段代码有什么问题吗?谢谢。

P4      PROC                
            MOV AX,CX           ;CX = VALUE THAT I WANT TO CONVERT
            MOV BX,10           
    ASC2:
            DIV BX              ;DIV AX/10
            ADD DX,48           ;ADD 48 TO REMAINDER TO GET ASCII CHARACTER OF NUMBER 
            PUSH AX             ;SAVE AX
            MOV AH,2            ;PRINT REMAINDER STORED IN DX
            INT 21H             ;INTERRUP
            POP AX              ;POP AX BACK
            CMP AX,0            
            JZ EXTT             ;IF AX=0, END OF THE PROCEDURE
            JMP ASC2            ;ELSE REPEAT
    EXTT:
            RET
    P4      ENDP
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 5

像这样的东西对于打印十进制值会更好(新代码是小写的):

        mov byte [buffer+9],'$'
        lea si,[buffer+9]

        MOV AX,CX           ;CX = VALUE THAT I WANT TO CONVERT
        MOV BX,10         
ASC2:
        mov dx,0            ; clear dx prior to dividing dx:ax by bx
        DIV BX              ;DIV AX/10
        ADD DX,48           ;ADD 48 TO REMAINDER TO GET ASCII CHARACTER OF NUMBER 
        dec si              ; store characters in reverse order
        mov [si],dl
        CMP AX,0            
        JZ EXTT             ;IF AX=0, END OF THE PROCEDURE
        JMP ASC2            ;ELSE REPEAT
EXTT:
        mov ah,9            ; print string
        mov dx,si
        int 21h
        RET

buffer: resb 10
Run Code Online (Sandbox Code Playgroud)

它不是直接打印每个字符,而是以相反的顺序将字符添加到缓冲区中。对于值 123,它将在 buffer[8] 处添加“3”,在 buffer[7] 处添加“2”,在 buffer[6] 处添加“1” - 因此,如果您随后打印从 buffer+6 开始的字符串,则会得到“123” ”。
我正在使用 NASM 语法,但希望它应该足够清晰。