回 帖 发 新 帖 刷新版面

主题:[讨论]奇怪的没有输出命令但有输出程序 请帮忙看看

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

回复列表 (共1个回复)

沙发


 补充一点这程序是实现输入的字符个数是4 的倍数时每次截取4 位然后逆序输出再输出回车换行 
谢谢 
 
 Input a unsigned decimal integer:1234567890123456 
Output is 
4321 
8765 
2109 
6543

我来回复

您尚未登录,请登录后再回复。点此登录或注册