⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 setsystemdata.asm

📁 系统时期时间的显示与设置 首先需构思怎样设计一个人机界面
💻 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 + -