?? setsystemdata.asm
字號(hào):
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顯示字符串開始坐標(biāo)。
mov bh,0 ;第0頁(yè)
mov dh,2 ;行號(hào)
mov dl,6 ;列號(hào)
;顯示5條選項(xiàng)
mov cx,5
show1:mov ah,2
int 10h ;設(shè)置光標(biāo)
mov di,dx ;保存行號(hào)和列號(hào)。
mov dx,[si] ;顯示字符串位置。
mov ah,9
int 21h ;顯示行中第一條字符串
mov dx,di
inc dh
add si,2 ;為下一個(gè)循環(huán)顯示data中字符串作準(zhǔn)備。
loop show1
mov ah,2 ;設(shè)置光標(biāo)
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條選項(xiàng)結(jié)束
quit: mov ax,4c00h
int 21h
;修改Data、Time
;顯示更改CMOS日期、時(shí)間用戶輸入提示
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 ;設(shè)置光標(biāo)
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 ;調(diào)用讓用戶輸入日期
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 ;設(shè)置光標(biāo)
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 ;調(diào)用讓用戶輸入時(shí)間
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 ;顯示時(shí),分,秒
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 ;回車時(shí)把a(bǔ)l中的0壓入棧
mov ah,0
call charstack1
mov ah,2
call charstack1
call ChangData ;調(diào)用改變CMOS日期函數(shù)
call clearscreen ;清屏
pop ax
jmp far ptr show0
ret
getstr1 endp
charstack1 proc near
jmp charstart1
table1 dw charpush1,charpop1,charshow1
top1 dw 0 ;棧的當(dāng)前位置的公共變量。
array1: db 60 dup (0)
charstart1: push bx
push dx
push di
push es
cmp ah,2
ja sret1
mov bl,ah ;ah為暗號(hào)
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 ;從頭把棧中的數(shù)顯示一遍。
charshows1: cmp bx,top1 ;查看棧中是否有數(shù)據(jù)。
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
;用戶輸入日期結(jié)束
;更改CMOS中的日期
ChangData proc near
push bx
push dx
push di
push es
cmp bp,9 ;如果長(zhǎng)度不等于9就退出,不改CMOS
jne EndReturn1
changclock1: mov si,offset array1 ;得到棧坐標(biāo)
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 ;保護(hù)cx
sub ah,30h
mov cl,4
shl ah,cl ;把年的十位移到高4位
pop cx
sub al,30h
and al,00001111b ;把年的個(gè)位高4位清0
or al,ah ;把一個(gè)完整的年分合并到al一個(gè)字節(jié)中
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 ;回車時(shí)把a(bǔ)l中的0壓入棧
mov ah,0
call charstack2
mov ah,2
call charstack2
call ChangTime ;調(diào)用改變CMOS時(shí)間函數(shù)
call clearscreen ;清屏
pop ax
jmp far ptr show0
ret
getstr2 endp
charstack2 proc near
jmp charstart2
table2 dw charpush2,charpop2,charshow2
top2 dw 0 ;棧的當(dāng)前位置的公共變量。
array2: db 60 dup (0)
charstart2: push bx
push dx
push di
push es
cmp ah,2
ja sret2
mov bl,ah ;ah為暗號(hào)
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 ;從頭把棧中的數(shù)顯示一遍。
charshows2: cmp bx,top2 ;查看棧中是否有數(shù)據(jù)。
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
;用戶輸入時(shí)間結(jié)束
;更改CMOS中的時(shí)間
ChangTime proc near
push bx
push dx
push di
push es
cmp bp,9 ;如果長(zhǎng)度不等于9就退出,不改CMOS
jne EndReturn2
changclock2: mov si,offset array2 ;得到棧坐標(biāo)
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] ;得到時(shí)在al
push cx ;保護(hù)cx
sub ah,30h
mov cl,4
shl ah,cl ;把年的十位移到高4位
pop cx
sub al,30h
and al,00001111b ;把年的個(gè)位高4位清0
or al,ah ;把一個(gè)完整的時(shí)合并到al一個(gè)字節(jié)中
out dx,al ;把時(shí)寫入CMOS
add bp,3
add di,2
loop changloop2
EndReturn2: pop es
pop di
pop dx
pop bx
ret
ChangTime endp
;更改時(shí)間結(jié)束
;清空屏幕。
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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -