| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 3284 人关注过本帖
标题:修改系统日期和时间的程序。
只看楼主 加入收藏
zhulei1978
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:48
帖 子:1158
专家分:1015
注 册:2006-12-17
结帖率:100%
  问题点数:0  回复次数:7   
修改系统日期和时间的程序。
修改系统时间的:

日期输入格式:12:23:56.27

DATA SEGMENT
message2 db ' Please enter the time:','$'
BUF2 DB 12,?;定义一缓冲区,存放输入的时间
time1 db ?
time2 db ?
time3 db ?
time4 db ?
time5 db ?
time6 db ?
time7 db ?
time8 db ?
time9 db ?
time10 db ?
time11 db ?
ORG 10H
DATA ENDS
CODE SEGMENT
  ASSUME  CS:CODE,DS:DATA
START:
    MOV AX,DATA
    MOV DS,AX
 
  lea dx,message2;调用9号中断,显示提示语句
  mov ah,9
  int 21h  

  MOV DX,OFFSET BUF2;调用0A中断,输入时间到缓冲区
  MOV AH,0AH
  INT 21H

  mov bl,10;BL置如10,用作乘数
  mov cx,0;将CX置零   
  MOV al,time1;将输入时间的小时位的十位数移入AL
  sub al,30h;转换为ASCII码
  mul bl;乘以10
  add ch,al;与CH相加

  MOV al,time2;将输入时间的小时位的个位数移入AL
  sub al,30h;转换为ASCII码
  add ch,al;于CH相加,得到小时位,存在CH

  ;以下为计算分钟位,存在CL
  MOV al,time4
  sub al,30h
  mul bl
  add cl,al

  MOV al,time5
  sub al,30h
  add cl,al

  ;以下为计算秒位,存在DH
  mov dx,0
  mov al,time7
  sub al,30h
  mul bl
  add dh,al

  MOV al,time8
  sub al,30h
  add dh,al

  ;以下为计算1/100秒位,存在DL
  mov al,time10
  sub al,30h
  mul bl
  add dl,al

  MOV al,time11
  sub al,30h
  add dl,al

  mov ah,2dh;调用2D号中断,设置时间  
  int 21h

  MOV AH,4CH
  INT 21H
CODE ENDS
END START
搜索更多相关主题的帖子: 缓冲区  
2016-07-04 05:32
zhulei1978
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:48
帖 子:1158
专家分:1015
注 册:2006-12-17
  得分:0 
修改系统日期的:

DATA SEGMENT
message1 db 'Please enter the date:','$'
BUF1 DB 11,?
date1 db ?
date2 db ?
date3 db ?
date4 db ?
date5 db ?
date6 db ?
date7 db ?
date8 db ?
date9 db ?
date10 db ?
DATA ENDS
CODE SEGMENT
  ASSUME  CS:CODE,DS:DATA
START:
    MOV AX,DATA
    MOV DS,AX
  lea dx,message1
  mov ah,9
  int 21h   
    MOV DX,OFFSET BUF1
    MOV AH,0AH
    INT 21H
  mov cx,0   
  MOV Al,date1
  sub al,30h
  mov bx,1000
  mov ah,0
  mul bx
  add cx,ax
  mov al,date2
  sub al,30h
  mov bl,100
  mul bl
  add cx,ax
  mov al,date3
  sub al,30h
  mov bl,10
  mul bl
  add cx,ax
  mov al,date4
  sub al,30h
  mov ah,0
  add cx,ax
  mov dx,0
  mov al,date6
  sub al,30h
  mul bl
  add dh,al
  mov al,date7
  sub al,30h
  add dh,al
  mov al,date9
  sub al,30h
  mul bl
  add dl,al
  mov al,date10
  sub al,30h
  add dl,al
  mov ah,2bh
  int 21h  
  MOV AH,4CH
  INT 21H
CODE ENDS
END START

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-07-04 05:33
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:10
帖 子:199
专家分:1322
注 册:2016-5-15
  得分:0 
回复 楼主 zhulei1978
楼主可以考虑接受8:23:9或 23:5等只含个位或只含时:分,毕竟DOS的TIME也不排拒不同的输入方式。
2016-07-05 07:01
zhulei1978
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:48
帖 子:1158
专家分:1015
注 册:2006-12-17
  得分:0 
这样为了方便处理,那样会加大程序难度

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-07-05 07:31
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:10
帖 子:199
专家分:1322
注 册:2016-5-15
  得分:0 
我这里根据楼主的程式架构,改写一个比较方便使用者的代码。
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编辑过]

2016-07-05 10:09
zhulei1978
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:48
帖 子:1158
专家分:1015
注 册:2006-12-17
  得分:0 
比我的好

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-07-05 12:54
UserNameCn
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2017-5-18
  得分:0 
回复 5楼 Valenciax
请问在修改了时间后,显示时间仍然是系统默认时间,不是自己设定的时间,请问怎么才能显示成自己设定的时间?
2017-05-18 17:41
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:10
帖 子:199
专家分:1322
注 册:2016-5-15
  得分:0 
回楼上

若是虚拟机或dosbox下,或者是winxp下的dos,利用int21h中断对时间修改,会被系统忽略掉.
要真正修改可利用winapi中的SetLocalTime函式,但那是win32代码.

另一种方法是,传递一个time hh:mm的参数给cmd.exe,叫windows下的命令指示cmd.exe的内置指令time去修改时间
这相当于在cmd.exe下键入time hh:mm
也就是在程式中,搜寻cmd.exe(透过环境变数,comspec),然后载入并运行另一个cmd.exe ,再加上参数 /k time hh:mm
这相当于在windows下的dos键入
cmd.exe /k time hh:mm

hh:mm是修改的 时:分

[此贴子已经被作者于2017-5-20 08:23编辑过]

2017-05-20 08:20







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027012 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved