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)
像这样的东西对于打印十进制值会更好(新代码是小写的):
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 语法,但希望它应该足够清晰。