系统的简单注解

来源:互联网 发布:工程造价软件应用心得 编辑:程序博客网 时间:2024/06/17 12:24


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

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


0 0
原创粉丝点击