注册 登录
编程论坛 汇编论坛

一个显示系统时间的程序

zhulei1978 发布于 2016-06-05 07:05, 8457 次点击
程序代码:
DATAS SEGMENT
BUF1 DB'THE TIME IS NOW:$'
BUF2 DB 10

 DB 10 DUP(?)
BUF3 DB 'CLASS:XINGONG04201 $'
BUF4 DB 'NAME:MA liNA $'
BUF5 DB '^^^^^^^ ^^^^^^^ $'
BUF6 DB ' ~~~ ~~~ $'
BUF7 DB ' 00 >o o < 00 $'
BUF8 DB ' 00 (::) 00 $'
BUF9 DB ' 00 ~ ~ 00 $'
BUF10 DB ' 00 !00 $'
DATAS ENDS

STACKS SEGMENT

 DB 100 DUP(?)
STACKS ENDS

CODES SEGMENT

 ASSUME CS:CODES,DS:DATAS,SS:STACKS

 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

 MOV al,REG

 mov ah,0

 mov REG,0

 mov bh,10

 div bh

 mov REG,ah

 push cx

 MOV CL,4

 SHL al,CL

 pop cx

 add REG,al

 ENDM


 BCDASC MACRO REG

 INC BX

 INC BX

 MOV AL,REG

 push cx

 MOV CL,4

 SHR AL,CL
pop cx

 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

 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,DATAS

 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



 MOV AH,2cH

 INT 21H


 ASCBCD CH

 ASCBCD CL

 ASCBCD DH


 TIMER: CALL DELY

 INCBCD DH,60H

 INCBCD CL,60H

 INCBCD CH,24H


 DISPY: LEA BX,BUF2

 BCDASC CH

 BCDASC CL

 BCDASC DH

 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 AX

 push bx

 mov bx,4

 x3:MOV AX,9000

 X1:MOV CX,0FFFFH


 X2:DEC CX

 JNE X2

 DEC AX

 JNE X1

 dec bx

 jne x3


 pop bx

 POP AX

 POP CX

 RET
DELY ENDP
CLOCK ENDP
CODES ENDS

 END START


[此贴子已经被作者于2016-6-5 10:58编辑过]

11 回复
#2
hu9jj2016-06-05 07:09
整个程序没有一行注释,不便于初学者学习哟。
#3
zhulei19782016-06-05 07:09
回复 2楼 hu9jj
有时间的时候我加上吧
#4
Valenciax2016-06-05 10:39
关于程序 DELY 延迟子程序
这种写法牵涉到cpu的速度,不同机器相差很大,尤其模拟器或dosbox
在我的dosbox慢得不动

若纯粹显示时间,下面是较简单的写法

程序代码:

Data  segment
time_string     db      '00:00:00',0dh,'$'  ;显示时间字符串
Data ends
code   segment
                assume  cs:code,ds:data,es:data
start:         mov    ax,data
                mov    ds,ax
                mov    es,ax
                mov     ah,3
                int     10h    ;读取光标大小
                push    cx
                mov     ah,1
                mov     cx,3030h   ;设定取光标为最小,意即隐藏
                int     10h
next:         lea    di,time_string ;字符串起点
                mov     ah,2ch ;读时分秒
                int     21h
                mov     al,ch ;取时
                call    Out_digit ;转al为ascii,输出至es:di
                mov     al,cl ;取分
                call    Out_digit ;转al为ascii,输出至es:di
                mov     al,dh ;取秒
                call    Out_digit  ;转al为ascii,输出至es:di
                lea    dx,time_string
                mov     ah,9  ; 印出
                int     21h
                mov     ah,1 ;检查按键
                int     16h
                jz      next  ;没有按键
                mov     ah,0 ;读键
                int     16h
                cmp     al,1bh ;是否ESC
                jnz     next ;不是,重来
                pop     cx ;取回光标大小
                mov     ah,1 ;设定回原来光标
                int       10h
                mov     ah,4ch
                int        21h                       
;------------------------------------------------------------------------------
;
转al为ascii,输出至es:di
Out_digit: aam   ;BCD加法调整
                or      ax,3030h  ;转ascii
                xchg    ah,al ;交换
                stosw  ;存到字符串
                inc     di
                ret
;------------------------------------------------------------------------------
code ends
end  start


[此贴子已经被作者于2016-6-5 10:41编辑过]

#5
zhulei19782016-06-05 10:56
这是我在winxp下写的,运行速度正常
#6
Valenciax2016-06-05 12:53
初看没太在意,原来程式只读一次系统时间,然后利用迟延程序计时
或许题目要求这样,但这就做成程式计时和系统时间不同步
甚至像模拟器或DOSBOX一样,根本无法动作

运行了一阵子就相差不少了, 45:05(程式) ~ 45:28(系统)
只有本站会员才能查看附件,请 登录
#7
zhulei19782016-06-05 15:13
是的,延时不是很精确
#8
hu9jj2016-06-05 20:40
为什么不定时读取主板的时间显示出来呢?
#9
wmf20142016-06-06 15:36
#10
AXRZ2016-06-07 04:04
回复 8楼 hu9jj
同意
#11
哼哼哈嘿2016-06-24 15:33
楼主,运行你的程序,我为啥出现: undefined symbol start 错误。
#12
zhulei19782016-06-24 16:44
回复 11楼 哼哼哈嘿
你用的是什么版本的masm编译器?
1