📄 system_clock.txt
字号:
page 60, 132
TITLE ;DATE&TIME
;-------堆栈段-----------------------------------
STACKSEG SEGMENT PARA STACK 'Stack'
DB 100h DUP (?)
STACKSEG ENDS
;-------数据段-----------------------------------
DATASEG SEGMENT PARA 'Data'
list0 db 13,10,"----------------------------------------",13,10,'$'
list1 db "input 1----print data on screen.",13,10,'$'
list2 db "input 2----print time on screen.",13,10,'$'
list3 db "input 3----print data&time on screen.",13,10,'$'
list4 db "input 4----change data&time.",13,10,'$'
list5 db "input 0----quite the programe",13,10,'$'
print1 db "please select :",13,10,'$'
mes0 db 13,10,"-------------------------------------------",'$'
mesdate db 13,10,"year\month\day\week :",'$'
mestime db 13,10,"hour\minute\second :",'$'
inputdate db 13,10,"Change the date--------------------------",'$'
inputtime db 13,10,"Change the time--------------------------",'$'
yearmes db 13,10,"Please input the year (XXXX) :",'$'
monthmes db 13,10,"Please input the month (XX) :",'$'
daymes db 13,10,"Please input the day (XX) :",'$'
hourmes db 13,10,"Please input the hour (XX) :",'$'
minutemes db 13,10,"Please input the minute (XX) :",'$'
branch_table dw routine_0
dw routine_1 ;程序跳转表
dw routine_2
dw routine_3
dw routine_4
year dw 0
month dw 0
day dw 0
week dw 0
hour dw 0
minute dw 0
second dw 0
buffer db 6 dup (' ')
bn db '$'
DATASEG ENDS
;-------代码段-----------------------------------
CODESEG SEGMENT PARA 'Code'
assume cs:codeseg
assume ds:DATASEG
assume ss:stackseg
MAIN PROC FAR
push ds
sub ax,ax
push ax
mov ax,STACKSEG
mov ss,ax
mov ax,DATASEG
mov ds,ax
sub ax,ax
next:
mov dx,offset list0
mov ah,09H
int 21H
mov dx,offset list1
mov ah,09H
int 21H
mov dx,offset list2
mov ah,09H
int 21H
mov dx,offset list3
mov ah,09H
int 21H
mov dx,offset list4
mov ah,09H
int 21H
mov dx,offset list5
mov ah,09H
int 21H
mov dx,offset print1
mov ah,09H
int 21H
mov ax,0
mov ah,01H ;用户键入所要执行的功能
int 21H
sub al,30H ;转换为所需的功能号
shl al,1 ;al=al*2
sub bx,bx
mov bl,al
jmp branch_table[bx];利用跳转表跳转到相应功能
routine_0: ;功能0退出
jmp exit
routine_1: ;功能1
call getdate
jmp next
routine_2: ;功能2
call gettime
jmp next
routine_3: ;功能3
call getdate
call gettime
jmp next
routine_4: ;功能4
call near ptr change
jmp next
exit: ;退出程序
mov ah,4cH
int 21H
MAIN ENDP
;-------------------------------------------
getdate PROC near
push ax
push cx
push dx
sub ax,ax
mov ax,2A00H
int 21H
sub ah,ah
mov week,ax
mov al,dl
mov day,ax
mov al,dh
mov month,ax
mov ax,cx
mov year,ax
call near ptr printdata
pop dx
pop cx
pop ax
ret
getdate ENDP
;------------------------------------------------
gettime PROC near
push ax
push cx
push dx
sub ax,ax
mov ax,2C00H
int 21H
sub ah,ah
mov al,ch
mov hour,ax
mov al,cl
mov minute,ax
mov al,dh
mov second,ax
call near ptr printtime
pop dx
pop cx
pop ax
ret
gettime ENDP
;------------------------------------------------
change PROC near
push ax
push bx
push cx
push dx
sub ax,ax
mov dx,offset inputdate
mov ah,09H
int 21H
mov dx,offset yearmes
mov ah,09H
int 21H
mov bx,4
mov cx,4
yernum:
mov ax,0100H
int 21H
dec bx
mov buffer[bx],al
loop yernum
call asc2bin
mov year,ax
mov bx,6
mov cx,6
setbu0:
dec bx
mov buffer[bx],0
loop setbu0
mov dx,offset monthmes
mov ah,09H
int 21H
mov bx,2
mov cx,2
monnum:
mov ax,0100H
int 21H
dec bx
mov buffer[bx],al
loop monnum
call asc2bin
mov month,ax
mov dx,offset daymes
mov ah,09H
int 21H
mov bx,2
mov cx,2
daynum:
mov ax,0100H
int 21H
dec bx
mov buffer[bx],al
loop daynum
call asc2bin
mov day,ax
mov dx,offset inputtime
mov ah,09H
int 21H
mov dx,offset hourmes
mov ah,09H
int 21H
mov bx,2
mov cx,2
hournum:
mov ax,0100H
int 21H
dec bx
mov buffer[bx],al
loop hournum
call asc2bin
mov hour,ax
mov dx,offset minutemes
mov ah,09H
int 21H
mov bx,2
mov cx,2
minnum:
mov ax,0100H
int 21H
dec bx
mov buffer[bx],al
loop minnum
call asc2bin
mov minute,ax
mov cx,year
mov ax,month
mov dh,al
mov ax,day
mov dl,al
mov ax,2B00H
int 21H
mov ax,hour
mov ch,al
mov ax,minute
mov cl,al
mov dx,0
mov ax,2D00H
int 21H
pop dx
pop cx
pop bx
pop ax
ret
change ENDP
;------------------------------------------------
printtime PROC NEAR
push ax
push bx
push cx
push dx
mov dx,offset mes0
mov ah,09h
int 21H
mov dx,offset mestime
mov ah,09h
int 21H
mov cx,3
mov bx,offset hour
printt:
mov ax,[bx]
call near ptr bin2asc
mov dx,offset buffer
mov ah,09H
int 21H
inc bx
inc bx
mov dl,'\'
mov ah,02H
int 21H
loop printt
pop dx
pop cx
pop bx
pop ax
ret
printtime ENDP
;------------------------------------------------
printdata PROC NEAR
push ax
push bx
push cx
push dx
mov dx,offset mes0
mov ah,09h
int 21H
mov dx,offset mesdate
mov ah,09h
int 21H
mov cx,4
mov bx,offset year
pd:
mov ax,[bx]
call near ptr bin2asc
mov dx,offset buffer
mov ah,09H
int 21H
inc bx
inc bx
mov dl,'\'
mov ah,02H
int 21H
loop pd
pop dx
pop cx
pop bx
pop ax
ret
printdata ENDP
;------------------------------------------------
asc2bin proc near
push bx
push cx
push dx
mov ax,0
mov bx,3
mov dx,0
mov dl,buffer[bx]
sub dl,30H
add ax,dx
mov cx,3
lo:
mov dx,10
mul dx
mov dx,0
dec bx
mov dl,buffer[bx]
sub dl,30
add ax,dx
loop lo
pop dx
pop cx
pop bx
asc2bin endp
;------------------------------------------------
bin2asc proc near
push bx
push cx
push dx
;---------先将缓冲区全部清除为空格------------------------
mov bx, offset buffer
mov cx, 6
blankagain:
mov byte ptr [bx],' '
inc bx
loop blankagain
;---------为写入值定位到最后一位------------------------
mov bx, offset bn-1
cmp ax,0 ; 如果初值为0,直接写入0到缓冲区
jz IsZero
xor dx,dx
mov cx,10 ;采用循环除以10,得到余数的方式来进行计算
DivAgain:
div cx ;余数在dx中,商在Ax中
add dl,30h
mov [bx], dl;将余数转换乘ASCII码保存到缓冲区中
xor dx,dx ;清除DX
dec bx ;为下一次写入做准备
cmp ax,0
jnz DivAgain
jmp bin2asc_exit
IsZero: ; 如果初值为0,直接写入0到缓冲区
mov byte ptr[bx],'0'
bin2asc_exit:
pop dx
pop cx
pop bx
ret
bin2asc endp
CODESEG ENDS
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -