实验14

来源:互联网 发布:服务器 linux 编辑:程序博客网 时间:2024/05/16 13:57

编程,以“年/月/日 时:分:秒”的格式,显示从cmos ram中读取的时间:


assume cs:code , ds:data


data segment
    db 32 dup(0)         //开辟32个字节的空间来存放最终要显示的字符串,实际用到了17字节。初始化为0
data ends


code segment
     start:
     mov ax , data
     mov ds , ax
     mov bx , 0
     mov al , 9              
     call getdata      //获取年
     call adddata    //将年数据写入内存字符串
     call showx      //将‘/’字符写入内存字符串
     mov al , 8 
     call getdata             //获取月
     call adddata
     call showx
      mov al , 7
     call getdata         //获取日
     call adddata
     call showk         //写入空格


     mov al , 4             
     call getdata      //获取时
     call adddata
     call showm      //写入冒号


     mov al , 2       
     call getdata       //获取分
     call adddata      
     call showm


     mov al , 0
     call getdata         //获取秒
     call adddata
     
     call showtime          //在屏幕上显示字符串


     mov ax , 4c00h
     int 21h
     
     adddata:                   //将cmos中获取的字符(两个字节)写到内存字符串的函数
     mov [bx] , ah
     inc bx
     mov [bx] , al
     inc bx
     ret 


     showx:                      //写'/’'的函数
     mov byte ptr [bx] , 47
     inc bx
     ret


     showm:                    //写':‘'的函数
     mov byte ptr [bx] , 58
     inc bx
     ret

 
     showk:                     //写'  ‘'的函数
     mov byte ptr [bx] , 32
     inc bx
     ret


     getdata:                  //从cmos ram中读取一个字节,并提取出对于的十位数和个位数,分别放入ah,al
         push cx
         
         out 70h , al
in  al , 71h
mov ah , al
mov cl , 4
shr ah , cl
and al , 00001111b


add ah , 30h
add al , 30h


pop cx
ret 


      showtime:         //显示字符串的函数
         push ax
push ds
push bx
push es
push si


         mov ax , data
mov ds , ax
mov bx , 0
mov ax , 0b800h
mov es , ax
mov si , 160*12+30*2
realshow:
cmp byte ptr [bx] , 0
je showover
mov al , [bx]
mov es:[si] , al
inc bx
inc si
mov byte ptr es:[si] , 2
inc si
jmp short realshow


showover:
          pop si
 pop es
 pop bx
 pop ds
 pop ax
 ret


code ends
end start



0 0