我这里根据楼主的程式架构,改写一个比较方便使用者的代码。
1.
时分秒容许输入任一值的[个位](h,m,s) 或只输入h:mm、hh:m等。
2.
有容错代码,若输入非数字或数字大于限制(hh>23,mm,ss>59),会显示错误。
3.
不须输入百分秒,输入hh:mm:ss或hh:mm即可。
解说一下:
要弹性处理时分秒的位置,我们借助了[:]号,以al=[:],扫瞄输入字符串。
repnz scasb
程式若停下来,cx不等0且ZR,则找到[:]号,这时的di就是[:]号之后的位置,
记下来(push di),累加[:]号计数,不停repnz scasb直到cx=0,然后...
[:]号计数=0,离开
[:]号计数=1,则输入hh:mm;秒值给它设0
[:]号计数=2,则输入hh:mm:ss
再利用之前记录的位置分别转换时分秒(时的位置在字符串开始,不须记录)
顺便说一句,int 21h,ah=2dh设定时间函数,尽管函数返回成功al=0,好像在windows下dos或dosbox不生效(至少在我的电脑如此),但也没关系,不改更好,省得又要改回正常。
至于2数的日期程式,其实也一样,容许输入[个位]是比较亲和的做法。
好吧,这是代码。
程序代码:
DATA SEGMENT
message2 db ' Enter the new time (hh:mm:ss):','$'
errStr db 10,13,'Error!$'
OkStr db 10,13,'Success!$'
BUF2 DB 9,?, 9 dup (0) ;定义一缓冲区,存放输入的时间
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV ES,AX
lea dx,message2 ;调用9号中断,显示提示语句
mov ah,9
int 21h
MOV DX,OFFSET BUF2 ;调用0A中断,输入时间到缓冲区
MOV AH,0AH
INT 21H
mov di,offset buf2 + 2
mov cl,[di-1]
mov ch,0
jcxz quit ;无输入,离开
mov bx,cx
mov byte ptr [di+bx],':' ;0d->[:] 置冒号,方便以下程式调用
cld
xor dx,dx ;冒号计数清0
mov al,':'
next:
repnz scasb ;找冒号
jcxz next1 ;找完
jnz next1 ;找不到
push di ;找到,保存分或秒的[首位置]
inc dx ;累加冒号计数
jmp short next ;再找
next1:
cmp dx,1 ;比较冒号
jb err ;0个冒号 ,离开
mov dh,0 ;秒设为0
jz next2 ;1个冒号,即不设秒,秒设为0,跳过读取秒值,直接取分值
pop si ;取秒[首位置]
call Num2Ascii ;数字符转值
jc err ;错误
mov dh,al ;存秒
next2:
pop si ;取分[首位置]
call Num2Ascii ;数字符转值
jc err ;错误
mov cl,al ;存分
mov si,offset buf2 + 2 ;取时[首位置]
call Num2Ascii ;数字符转值
jc err ;错误
mov ch,al ;存时
mov dl,0 ;[百分秒]不设定
mov ax,2dfeh ;调用2D号中断,设置时间
int 21h
mov dx,offset OkStr ;成功字串
or al,al ;al传回0表示成功,al=-1,则失败
jz ok
err:
mov dx,offset errStr ;失败字串
ok:
mov ah,9 ;印出成功/失败
int 21h
quit:
MOV AH,4CH ;离开
INT 21H
;------------------------------------------------------------------------------
Num2Ascii:
mov ax,[si] ;取数字串
cmp ah,':' ;是否[:],若是表示只输入个数
jnz N10 ;不是 [:]
mov ah,'0' ;只有个数,十位置'0'
xchg al,ah ;交换
N10:
xchg al,ah ;交换
cmp al,'0' ;以下排除0-9以外的输入
jb Nx
cmp al,'9'
ja Nx
cmp ah,'0'
jb Nx
cmp ah,'9'
ja Nx
and ax,0f0fh ;ascii->值 ,若输入34,即3334, and后ax=0304
aad ;bcd调整 ,若ax=0304, aad后, ax=0022(即十进制的34)
clc ;无错误
ret ;al传回使用者输入的时分秒值
Nx:
stc ;有错误
ret
;------------------------------------------------------------------------------
CODE ENDS
END START
[此贴子已经被作者于2016-7-5 10:15编辑过]