主题:[讨论]奇怪的没有输出命令但有输出程序 请帮忙看看
DSEG SEGMENT
MSG1 DB 'Input a unsigned decimal integer:$'
MSG2 DB 'OUTPUT IS:$'
MSG3 DB 'INPUT ERROR!!$'
INBUF DB 252,?,252 DUP (?)
OUTBUF DW 64 DUP (?),'$'
DATA DW ?
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX
MOV DX,OFFSET MSG1
CALL DSPMESS
MOV DX,OFFSET INBUF
MOV AH,0AH
INT 21H
CALL CRLF
;XOR AX,AX :问题为什么除数会变成零
;XOR CX,CX
;MOV SI,OFFSET INBUF+1
;MOV AX,[SI]
;XOR BX,BX
;MOV BH,4H
;DIV BH
;MOV CL,AL
XOR CX,CX ;计算字符串的个数 ÷4的商
XOR AX,AX
MOV AL,INBUF+1
MOV BL,4D
DIV BL
MOV CL,AL ;输出的行数
JCXZ EXIT ;判断是否输入为零
CMP AH,0
JNZ EXIT
MOV DX,OFFSET MSG2
CALL DSPMESS
CALL CRLF
MOV SI,OFFSET INBUF+1
MOV DI,OFFSET OUTBUF
LOOP1:
CALL DTOBCD
CALL CRLF
;CALL BCDTOD
LOOP LOOP1
CALL CRLF
MOV AH,4CH
INT 21H
EXIT: CALL ERROR
;子程序名DTOBCD
;功能:10#->2#->BCD
;入口参数:DS:SI=缓冲区首地址
;出口参数:BX=转换得到的BCD
;算法:指针回溯
DTOBCD PROC
ADD SI,4
PUSH SI
PUSH AX
PUSH CX
PUSH DX
XOR BX,BX
MOV AH,[SI]
DEC SI
SHL AH,4
MOV BH,AH
MOV AH,[SI]
DEC SI
AND AH,0FH
ADD BH,AH
MOV [DI],BH
INC DI
MOV AL,[SI]
DEC SI
SHL AL,4
MOV BL,AL
MOV AL,[SI]
DEC SI
AND AL,0FH
ADD BL,AL
MOV [DI],BL
INC DI
POP DX
POP CX
POP AX
POP SI
DTOBCD ENDP
;子程序名BCDTOD
;功能BCD->ASCII->10#
;入口参数:BX=欲转换的的BCD
; DS:DI=缓冲区首地址
;出口参数:存于DS:DI的缓冲区中
;算法:指针回溯
BCDTOD PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV DL,BH
SHR DL,4
CALL DISPDL
MOV DL,BH
AND DL,0FH
CALL DISPDL
MOV DL,BL
SHR DL,4
CALL DISPDL
MOV DL,BL
AND DL,0FH
CALL DISPDL
POP DX
POP CX
POP BX
POP AX
RET
BCDTOD ENDP
DISPDL PROC ;显示一位BCD码的十进制数
OR DL,00110000B
CMP DL,39H
JBE DISPDL1
ADD DL,07H
DISPDL1:MOV AH,02H
INT 21H
RET
DISPDL ENDP
DSPMESS PROC ;显示信息
PUSH AX
MOV AH,09H
INT 21H
POP AX
RET
DSPMESS ENDP
CRLF PROC ;输出回车
PUSH AX
PUSH DX
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
POP DX
POP AX
RET
CRLF ENDP
ERROR PROC ;错误信息显示
MOV DX,OFFSET MSG3
CALL DSPMESS
CALL CRLF
CALL START
ERROR ENDP
CSEG ENDS
END START
MSG1 DB 'Input a unsigned decimal integer:$'
MSG2 DB 'OUTPUT IS:$'
MSG3 DB 'INPUT ERROR!!$'
INBUF DB 252,?,252 DUP (?)
OUTBUF DW 64 DUP (?),'$'
DATA DW ?
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX
MOV DX,OFFSET MSG1
CALL DSPMESS
MOV DX,OFFSET INBUF
MOV AH,0AH
INT 21H
CALL CRLF
;XOR AX,AX :问题为什么除数会变成零
;XOR CX,CX
;MOV SI,OFFSET INBUF+1
;MOV AX,[SI]
;XOR BX,BX
;MOV BH,4H
;DIV BH
;MOV CL,AL
XOR CX,CX ;计算字符串的个数 ÷4的商
XOR AX,AX
MOV AL,INBUF+1
MOV BL,4D
DIV BL
MOV CL,AL ;输出的行数
JCXZ EXIT ;判断是否输入为零
CMP AH,0
JNZ EXIT
MOV DX,OFFSET MSG2
CALL DSPMESS
CALL CRLF
MOV SI,OFFSET INBUF+1
MOV DI,OFFSET OUTBUF
LOOP1:
CALL DTOBCD
CALL CRLF
;CALL BCDTOD
LOOP LOOP1
CALL CRLF
MOV AH,4CH
INT 21H
EXIT: CALL ERROR
;子程序名DTOBCD
;功能:10#->2#->BCD
;入口参数:DS:SI=缓冲区首地址
;出口参数:BX=转换得到的BCD
;算法:指针回溯
DTOBCD PROC
ADD SI,4
PUSH SI
PUSH AX
PUSH CX
PUSH DX
XOR BX,BX
MOV AH,[SI]
DEC SI
SHL AH,4
MOV BH,AH
MOV AH,[SI]
DEC SI
AND AH,0FH
ADD BH,AH
MOV [DI],BH
INC DI
MOV AL,[SI]
DEC SI
SHL AL,4
MOV BL,AL
MOV AL,[SI]
DEC SI
AND AL,0FH
ADD BL,AL
MOV [DI],BL
INC DI
POP DX
POP CX
POP AX
POP SI
DTOBCD ENDP
;子程序名BCDTOD
;功能BCD->ASCII->10#
;入口参数:BX=欲转换的的BCD
; DS:DI=缓冲区首地址
;出口参数:存于DS:DI的缓冲区中
;算法:指针回溯
BCDTOD PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV DL,BH
SHR DL,4
CALL DISPDL
MOV DL,BH
AND DL,0FH
CALL DISPDL
MOV DL,BL
SHR DL,4
CALL DISPDL
MOV DL,BL
AND DL,0FH
CALL DISPDL
POP DX
POP CX
POP BX
POP AX
RET
BCDTOD ENDP
DISPDL PROC ;显示一位BCD码的十进制数
OR DL,00110000B
CMP DL,39H
JBE DISPDL1
ADD DL,07H
DISPDL1:MOV AH,02H
INT 21H
RET
DISPDL ENDP
DSPMESS PROC ;显示信息
PUSH AX
MOV AH,09H
INT 21H
POP AX
RET
DSPMESS ENDP
CRLF PROC ;输出回车
PUSH AX
PUSH DX
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
POP DX
POP AX
RET
CRLF ENDP
ERROR PROC ;错误信息显示
MOV DX,OFFSET MSG3
CALL DSPMESS
CALL CRLF
CALL START
ERROR ENDP
CSEG ENDS
END START