📄 clk.asm.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 + -