系统的简单注解 - 6 03_timer.asm文件



该文件包括了时钟中断的主要功能。

rtm_0x20_interrupt_handle:实时时钟中断处理过程;

install_0x20_interrupt:安装0x20号中断(实时时钟);

sys_clock:计算并显示系统时间(秒);

sys_get_seconds:获取系统已经走过的秒数;

;===============================================================================
;=== 本程序包括了时钟中断的主要功能:                                        ===
;=== 1.时钟中断初始化                                                        ===
;=== 2.时钟功能实现                                                          === 
;===============================================================================

;-------------------------------------------------------------------------------
rtm_0x20_interrupt_handle:              ;实时时钟中断处理过程

     pushad
		 
     mov al,0x60                        ;中断结束命令EOI
     out 0x20,al                        ;向8259A主片发送

     mov eax, [sys_click]
     inc eax                            ;时钟click增加 
     mov [sys_click], eax
     push eax
	 call wakeup_task                   ;尝试唤醒暂停的进程
     pop eax		 
     test eax, 0x03                     ;每中断4次就切换一次进程(4×10ms=40ms)
     jz _time_to_swicth                 ;到了40ms,进程切换
    
     popad
     iretd 

_time_to_swicth:
     call switch_task2
         
     popad
	 	 
     iretd
 
;-------------------------------------------------------------------------------
install_0x20_interrupt:                   ;安装0x20号中断(实时时钟)
	 

     ;设置计时时钟的中断频率
     mov al,34h                           ;设控制字值
     out 43h,al                           ;写控制字到控制字寄存器
     mov ax,1193182/100                   ;每秒100次中断(10ms一次)
     out 40h,al                           ;写计数器0的低字节
     mov al,ah                            ;AL=AH
     out 40h,al                           ;写计数器0的高字节         	 

     mov eax, rtm_0x20_interrupt_handle   ;中断向量
     mov ebx, 0x20                        ;中断向量号
     mov ecx, 0x0                         ;ch-0主片,cl-0对应bit0	 
     call install_XXX_interrupt
	 
     ret
	 
;-------------------------------------------------------------------------------
sys_clock:                                ;计算并显示系统时间(秒)
     
     pushad
     
     ;计算系统启动后持续的秒数	 
     xor edx, edx
     xor eax, eax
     mov eax, [sys_click]                 ;被除数是系统tick数
     mov ebx, 100                         ;除数是100(系统一秒钟tick 100次)
     div ebx                              ;商在eax中
     	 
     ;显示秒数的百位的值
     xor dx, dx
     mov bx, 100                          ;秒的百位的值
     div bx                               ;商在ax,余数在dx
     push edx
     mov bl, al
     mov eax, 0x00460124
     mov cl, 7
     call disp_letter_font

     ;显示秒数的十位的值	 
     pop edx
     mov ax, dx
     xor dx, dx
     mov bx, 10
     div bx
     push edx	 
     mov bl, al
     mov eax, 0x0046012c
     mov cl, 7
     call disp_letter_font

     ;显示秒数的个位的值
     pop edx
     mov bl, dl
     cmp bl, 10
     jb _adjust
     mov bl, 0
_adjust:	 
     mov eax, 0x00460134
     mov cl, 7
     call disp_letter_font     	 
	 
     popad
     ret
	 
;-------------------------------------------------------------------------------
sys_get_seconds:                              ;获取系统已经走过的秒数
                                              ;输出:eax-系统已经经过的秒数
     
     push ebx
     push edx
     
     xor edx, edx                             ;edx为被除数的高32位(共64位)
     mov eax, [sys_click]                     ;系统tick值,eax为被除数的低32位
     mov ebx, 100                             ;系统一秒钟tick 100次
     div ebx                                  ;商在eax
     
     pop edx
     pop ebx	

     ret	 
	 
;--------------------------------全局变量---------------------------------------	 
align 4	 
	 sys_click        dd 0                    ;时钟click

align 4

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值