回 帖 发 新 帖 刷新版面

主题:时钟程序总是运行错误,小弟新手,请哪位大哥指点一下。。

这是实习的时候要求做的一个汇编时钟程序,但是根据老师拿下来的部分代码,总是出现错误~~望高手指点一下。


DATA    SEGMENT                                         ;设置数据段
   BUF1    DB 'THE TIME IS NOW: $'
   BUF5    DB ' @@@@@   ^^^^^^^    @@@@@@ $'
   BUF6    DB ' &&&&&&    #######     &&&&&& $'
   BUF7    DB ' 00 >o o < 00 $'
   BUF8    DB ' 00 (::) 00 $'
   BUF9    DB ' 00 ~~ 00 $'
   BUF10   DB ' 00 !! 00 $'
   BUF3    DB 'CLASS:040402206 $'
   BUF4    DB 'NAME:hu ling wei $'
   BUF2    DB 10
           DB 10 DUP(?)
           DATA ENDS
   STACK   SEGMENT STACK                        ;设置堆栈段
           DB 100 DUP(?)
           STACK ENDS
   CODE    SEGMENT                               ;设置代码段
           ASSUME CS:CODE,DS:DATA,SS:STACK
   CURSOR  MACRO ROW,CLM                          ;设置光标位置
           MOV AH,2 
           MOV BH,0 
           MOV DH,ROW 
           MOV DL,CLM 
           INT 10H 
           ENDM
    WIN    MACRO ROWL,CLML,ROWR,CLMR,COLOR         ;设置窗口,位置,颜色
           MOV AH,6 
           MOV AL,0 
           MOV CH,ROWL
           MOV CL,CLML
           MOV DH,ROWR
           MOV DL,CLMR
           MOV BH,COLOR
           INT 10H
           ENDM
           ASCBCD MACRO REG
           INC BX
           INC BX
           MOV REG,[BX]
           MOV CL,4
           SHL REG,CL
           INC BX
           MOV AL,[BX]
           AND AL,0FH
           OR REG,AL
           ENDM
           BCDASC MACRO REG
           INC BX
           INC BX
           MOV AL,REG
           MOV CL,4
           SHR AL,CL
           OR AL,30H
           MOV [BX],AL
           INC BX
           MOV AL,REG
           AND AL,0FH
           OR AL,30H
           MOV [BX],AL
           ENDM
   INCBCD  MACRO REG,COUNT             ;BCD数加1
           MOV AL,REG
           INC AL
           DAA
           MOV REG,AL
           CMP AL,COUNT
           JNZ DISPY
           MOV REG,0
           ENDM
   STRDSPY MACRO ADRS
           LEA DX,ADRS
           MOV AH,9 
           INT 21H
           ENDM
           CLOCK PROC FAR
   START:  PUSH DS           ;显示字符串           
           MOV AX,0     
           PUSH AX
           MOV AX,DATA
           MOV DS,AX 
           WIN 0,0,24,79,7
           WIN 6,9,18,70,01000001B      ;设置窗口
           CURSOR 6,25                  ;设置光标
           STRDSPY BUF5                 ;显示字符串
           CURSOR 7,25                  ;设置光标
           STRDSPY BUF6
           CURSOR 8,25
           STRDSPY BUF7
           CURSOR 9,25
           STRDSPY BUF8
           CURSOR 10,25
           STRDSPY BUF9
           CURSOR 11,25
           STRDSPY BUF10
           CURSOR 6,9
           STRDSPY BUF3
           CURSOR 7,9
           STRDSPY BUF4
           CURSOR 14,32
           STRDSPY BUF1
           CURSOR 15,36
           LEA DX,BUF2
           MOV AH,0AH           
           INT 21H                       ;从键盘接收当前时间          
  LEA BX,BUF2
           ASCBCD CH                     ;小时值ASCII到BCD
                                         ;存CH
           ASCBCD DH                     ;分值ASCII到BCD
                                         ;存DH
           ASCBCD DL                     ;秒值ASCII到BCD
                                         ;存DL
    TIMER: CALL DELY                     ;延时1秒
           INCBCD DL,60H                 ;(DL)+1,并判 
                                         ;大于等于60?
           INCBCD DH,60H                 ;(DH)+1,并判 
                                         ;大于等于60?
           INCBCD CH,24H                 ;(CH)+1,并判 
                                         ;大于等于60?
    DISPY: LEA BX,BUF2 
           BCDASC CH                     ;时值BCD转到ASCII
           BCDASC DH                     ;分值BCD转到ASCII
           BCDASC DL                     ;秒值BCD转到ASCII
           INC BX
           MOV AL,'$'
           MOV [BX],AL
           PUSH DX 
           CURSOR 15,36                  ;设置光标
           STRDSPY BUF2+2                ;显示时,分,秒值
           POP DX
           MOV AH,01H
           INT 16H
           CMP AL,1BH
           JZ X
           XOR AL,AL
           JMP TIMER
         X:MOV AH,4CH
           INT 21H
           RET
     DELY   PROC
          PUSH  CX
          PUSH CX
          MOVE  4600
   X1:DEC   CX,0FFFFH
 
   X2:DEC   CX
     JNE  X2
    DEC  AX
    JNE  X1
   POP  AX
    POP  CX 
    RET
     DELY  ENDP
    CLOCK   ENDP
   CODE  ENDP
        END   START

回复列表 (共1个回复)

沙发

真不明白,你的老师为什么把一个简单的时钟显示写得这么复杂!
懒得看算法,你先把几个明显的错误改过再说。

1,不能用汉字的分号加注释
2,这是什么? MOVE  4600
3,X1:DEC   CX,0FFFFH  这是想干什么?
4,CODE  ENDP 应该是 CODE  ENDS 吧

我来回复

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