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

📄 clk.asm.bak

📁 用汇编语言所编
💻 BAK
字号:
data       segment para public 'data'                     ;定义地址段
count100   db 100                                         ;100分频
tenhour    db 0                                           ;下面为记录时间的几个量
hour       db 0,':'
tenmin     db 0
minute     db 0,':'
tensec     db 0
second     db 0
msg        db 'Current time is(quit:ctrl+c):  ','$'        ;信息数据串
data       ends

stack      segment para stack 'stack'                      ;堆栈段
           db 256 dup(0)
stack      ends

code       segment para public 'code'                      ;代码段
start:
           assume cs:code                                  ;给ES付值
           mov ax,data
           mov es,ax
           assume es:data
           mov si,82h                                     ;源数据串付值
           mov di,offset tenhour                          ;目标地址
           mov cx,8
           cld
           rep movsb                                      ;移动数据串
           mov ds,ax 
           assume ds:data   
           mov ah,0                                     ;BIOS功能调用
           int 16h
           cli                                          ;屏蔽中断
           mov ax,0                       
           mov es,ax                                    ;把extra 段指向中断
           mov di,20h                                  ;把时钟中断的偏移量给DI
           mov ax,offset timer                           ;把TIMER的偏移量给AX
           stosw                                         ;把AX放入表中
           mov ax,cs                                     
           stosw                                         ;把CS放入表中下一个位置
           mov al,36h                                    ;TIMER的初始设置
           out 43h,al                                    ;给8283命令
           mov bx,11932                                 ;得到100hz的结果
           mov al,bl                                    ;传递LSB值
           out 40h,al
           mov al,bh                                    ;传递MSB值
           out 40h,al
           mov al,0fch                                  ;允许TIMER和键盘中断请求
           out 21h,al
           sti                                         ;中断允许
forever:   mov dx,offset msg                           ;把字符串的偏移量给DX
           mov ah,9                                    ;显示字符串
           int 21h
           mov bx,offset tenhour                       ;把时间数据的偏移量给BX
           mov cx,8                                    ;设置循环次数
dispclk:   mov al,[bx]                            
           call dispchar                               ;显示字符
           inc bx                                      ;指向下一个字
           loop dispclk                                ;显示8个CHAR
           mov al,0dh
           call dispchar
           mov al,second                               ;取时间秒
next:      cmp al,second                               ;如果不变化就一直循环
           je next
           jmp forever
timer proc far
           push ax                                    ;保存寄存器AX
           dec count100                               ;计数器减一
           jnz timerx
           mov count100,100                           ;重新设计数器
           inc second                                 ;下面是时间变化过程
           cmp second,'9'
           jle timerx
           mov second,'0'
           inc tensec                                 ;秒各位进位
           cmp tensec,'6'
           jl timerx
           mov tensec,'0'
           inc minute                                 ;秒十位进位                       
           cmp minute,'9'
           jle timerx
           mov minute,'0'
           inc tenmin                                 ;分个位进位
           cmp tenmin,'6'
           jl timerx
           mov tenmin,'0'
           inc hour                                  ;分十位进位
           cmp hour,'9'
           ja adjhour                                ;调整小时
           cmp hour,'4'
           jnz timerx
           cmp tenhour,'2'
           jnz timerx
           mov hour,'0'
           mov tenhour,'0'
           jmp short timerx
adjhour:   inc tenhour                               ;调整小时过程
           mov hour,'0'
timerx:    mov al,20h                                ;发送"EOI"命令
           out 20h,al                                ;到8259
           pop ax                                    ;恢复AX
           iret
timer      endp
dispchar   proc near
           push bx                                   ;保存BX寄存器
           mov bx,0                                  ;选择显示页为0
           mov ah,14                                 ;写功能代码
           int 10h                                   ;BIOS显示调用
           pop bx                                    ;恢复BX
           ret
dispchar   endp                                      ;结束子程序
code       ends                                      ;结束程序
           end start
           

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -