📄 setsystemdata.asm
字号:
assume cs:code
data1 segment
dw 9,8,7
data1 ends
data2 segment
dw 4,2,0
data2 ends
data3 segment
db 'press "Esc" to back main menu!','$'
data3 ends
code segment
s0 db '1) Display Data ','$'
s1 db '2) Display Time ','$'
s2 db '3) Set Data ','$'
s3 db '4) Set Time ','$'
s4 db '5) Exit','$'
s dw offset s0,offset s1,offset s2,offset s3,offset s4
start:call clearscreen
mov bx,0b800h
mov es,bx
mov ax,code
mov ds,ax
show0:mov si,offset s ;ds dx显示字符串开始坐标。
mov bh,0 ;第0页
mov dh,2 ;行号
mov dl,6 ;列号
;显示5条选项
mov cx,5
show1:mov ah,2
int 10h ;设置光标
mov di,dx ;保存行号和列号。
mov dx,[si] ;显示字符串位置。
mov ah,9
int 21h ;显示行中第一条字符串
mov dx,di
inc dh
add si,2 ;为下一个循环显示data中字符串作准备。
loop show1
mov ah,2 ;设置光标
mov bh,0
mov dh,24
mov dl,20
int 10h
mov dx,0;
mov ax,data3
mov ds,ax
mov ah,9
int 21h
mov ah,0
int 16h
cmp al,'1'
je getdata
cmp al,'2'
je gettime
cmp al,'3'
je setSystemdata
cmp al,'4'
je setSystemtime
cmp al,'5'
je quit
jmp start
;显示5条选项结束
quit: mov ax,4c00h
int 21h
;修改Data、Time
;显示更改CMOS日期、时间用户输入提示
setSystemdata proc near
jmp short dostart
db "6) Chang CMOS data,format is yy/mm/dd ",'$'
dostart:call clearscreen ;清屏
push ax
push bx
push dx
push si
push ds
mov al,0
mov ah,2 ;设置光标
mov bh,0
mov dh,2
mov dl,2
int 10h
mov si,offset setSystemdata
mov ax,cs
mov ds,ax
add si,2
mov dx,si
mov ah,9
int 21h
call getstr1 ;调用让用户输入日期
pop ds
pop si
pop dx
pop bx
pop ax
ret
setSystemdata endp
setSystemTime proc near
jmp short dostart2
db "7) Chang CMOS Time,format is hh:nn:ss ",'$'
dostart2:call clearscreen ;清屏
push ax
push bx
push dx
push si
push ds
mov al,0
mov ah,2 ;设置光标
mov bh,0
mov dh,2
mov dl,2
int 10h
mov si,offset setSystemTime
mov ax,cs
mov ds,ax
add si,2
mov dx,si
mov ah,9
int 21h
call getstr2 ;调用让用户输入时间
pop ds
pop si
pop dx
pop bx
pop ax
ret
setSystemTime endp
;以下为显示data功能
getdata proc near
mov di,160*12+40*2
push di
mov al,9
ymd: call show ;显示年、月、日
dec al
cmp al,7
jb form1
add di,6
jmp short ymd
form1: pop di ;显示xx/xx/xx格式
add di,4
mov byte ptr es:[di],'/'
add di,6
mov byte ptr es:[di],'/'
in al,60h ;按esc键退出程序
cmp al,01h ;Esc键的扫描码
je start
jmp getdata
ret
getdata endp
;以下为显示time功能
gettime proc near
mov di,160*12+40*2
push di
mov al,6
tms: sub al,2 ;显示时,分,秒
cmp al,0feh
je form2
call show
add di,6
jmp short tms
form2: pop di ;显示xx:xx:xx格式
add di,4
mov byte ptr es:[di],':'
add di,6
mov byte ptr es:[di],':'
in al,60h ;按esc键退出程序
cmp al,01h ;Esc键的扫描码
je start
jmp gettime
ret
gettime endp
;开始让用户输入日期
getstr1 proc near
push ax
getstrs1: mov ah,0
int 16h
cmp al,20h
jb nochar1
mov ah,0
call charstack1
mov ah,2
call charstack1
jmp getstrs1
nochar1: cmp ah,0eh ;如果是退格键
je backspace1
cmp ah,1ch ;如果是回车键
je enter1
backspace1: mov ah,1
call charstack1
mov ah,2
call charstack1
jmp getstrs1
enter1: mov al,0 ;回车时把al中的0压入栈
mov ah,0
call charstack1
mov ah,2
call charstack1
call ChangData ;调用改变CMOS日期函数
call clearscreen ;清屏
pop ax
jmp far ptr show0
ret
getstr1 endp
charstack1 proc near
jmp charstart1
table1 dw charpush1,charpop1,charshow1
top1 dw 0 ;栈的当前位置的公共变量。
array1: db 60 dup (0)
charstart1: push bx
push dx
push di
push es
cmp ah,2
ja sret1
mov bl,ah ;ah为暗号
mov bh,0
add bx,bx
jmp word ptr table1[bx]
charpush1: mov bx,top1
mov si,offset array1
mov cs:[si+bx],al
inc top1
jmp sret1
charpop1: cmp top1,0
je sret1
dec top1
mov bx,top1
mov si,offset array1
mov al,cs:[si+bx]
jmp sret1
charshow1: mov dh,6
mov dl,6
mov bx,0b800h
mov es,bx
mov al,160
mov ah,0
mul dh
mov di,ax
add dl,dl
mov dh,0
add di,dx
mov bx,0 ;从头把栈中的数显示一遍。
charshows1: cmp bx,top1 ;查看栈中是否有数据。
jne noempty1
mov byte ptr es:[di],' '
jmp sret1
noempty1: mov si,offset array1
mov al,cs:[si+bx]
mov es:[di],al
mov byte ptr es:[di+2],' '
inc bx
add di,2
jmp charshows1
sret1: pop es
pop di
pop dx
pop bx
ret
charstack1 endp
;用户输入日期结束
;更改CMOS中的日期
ChangData proc near
push bx
push dx
push di
push es
cmp bp,9 ;如果长度不等于9就退出,不改CMOS
jne EndReturn1
changclock1: mov si,offset array1 ;得到栈坐标
mov bp,0
mov bx,data2
mov di,0
mov cx,3
changloop1: mov dx,70h
mov al,[bx+di]
out dx,al
mov dx,71h
mov ax,cs:[si+bp] ;得到年在al
push cx ;保护cx
sub ah,30h
mov cl,4
shl ah,cl ;把年的十位移到高4位
pop cx
sub al,30h
and al,00001111b ;把年的个位高4位清0
or al,ah ;把一个完整的年分合并到al一个字节中
out dx,al ;把年写入CMOS
add bp,3
add di,2
loop changloop1
EndReturn1: pop es
pop di
pop dx
pop bx
ret
ChangData endp
;开始让用户输入
getstr2 proc near
push ax
getstrs2: mov ah,0
int 16h
cmp al,20h
jb nochar2
mov ah,0
call charstack2
mov ah,2
call charstack2
jmp getstrs2
nochar2: cmp ah,0eh ;如果是退格键
je backspace2
cmp ah,1ch ;如果是回车键
je enter2
backspace2: mov ah,1
call charstack2
mov ah,2
call charstack2
jmp getstrs2
enter2: mov al,0 ;回车时把al中的0压入栈
mov ah,0
call charstack2
mov ah,2
call charstack2
call ChangTime ;调用改变CMOS时间函数
call clearscreen ;清屏
pop ax
jmp far ptr show0
ret
getstr2 endp
charstack2 proc near
jmp charstart2
table2 dw charpush2,charpop2,charshow2
top2 dw 0 ;栈的当前位置的公共变量。
array2: db 60 dup (0)
charstart2: push bx
push dx
push di
push es
cmp ah,2
ja sret2
mov bl,ah ;ah为暗号
mov bh,0
add bx,bx
jmp word ptr table2[bx]
charpush2: mov bx,top2
mov si,offset array2
mov cs:[si+bx],al
inc top2
jmp sret2
charpop2: cmp top2,0
je sret2
dec top2
mov bx,top2
mov si,offset array2
mov al,cs:[si+bx]
jmp sret2
charshow2: mov dh,6
mov dl,6
mov bx,0b800h
mov es,bx
mov al,160
mov ah,0
mul dh
mov di,ax
add dl,dl
mov dh,0
add di,dx
mov bx,0 ;从头把栈中的数显示一遍。
charshows2: cmp bx,top2 ;查看栈中是否有数据。
jne noempty2
mov byte ptr es:[di],' '
jmp sret2
noempty2: mov si,offset array2
mov al,cs:[si+bx]
mov es:[di],al
mov byte ptr es:[di+2],' '
inc bx
add di,2
jmp charshows2
sret2: pop es
pop di
pop dx
pop bx
ret
charstack2 endp
;用户输入时间结束
;更改CMOS中的时间
ChangTime proc near
push bx
push dx
push di
push es
cmp bp,9 ;如果长度不等于9就退出,不改CMOS
jne EndReturn2
changclock2: mov si,offset array2 ;得到栈坐标
mov bp,0
mov bx,data2
mov di,0
mov cx,6
changloop2: mov dx,70h
mov al,[bx+di]
out dx,al
mov dx,71h
mov ax,cs:[si+bp] ;得到时在al
push cx ;保护cx
sub ah,30h
mov cl,4
shl ah,cl ;把年的十位移到高4位
pop cx
sub al,30h
and al,00001111b ;把年的个位高4位清0
or al,ah ;把一个完整的时合并到al一个字节中
out dx,al ;把时写入CMOS
add bp,3
add di,2
loop changloop2
EndReturn2: pop es
pop di
pop dx
pop bx
ret
ChangTime endp
;更改时间结束
;清空屏幕。
clearscreen proc near
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
subls: mov byte ptr es:[bx],' '
add bx,2
loop subls
pop es
pop cx
pop bx
ret
clearscreen endp
show proc near ;显示功能
push ax
push cx
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add al,30h
add ah,30h
mov byte ptr es:[di],ah
mov byte ptr es:[di+2],al
pop cx
pop ax
ret
show endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -