主题:时钟程序总是运行错误,小弟新手,请哪位大哥指点一下。。
这是实习的时候要求做的一个汇编时钟程序,但是根据老师拿下来的部分代码,总是出现错误~~望高手指点一下。
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
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