注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

编程学习

我的网上家园

 
 
 

日志

 
 

第九章编程练习: 安装时钟中断显示时钟  

2013-01-26 16:24:11|  分类: 《x86汇编语言: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

section clock vstart=0x7c00
xor ax,ax
mov ss,ax
mov sp,ax
mov es,ax
push cs
pop ds
mov bx,message ;显示安装信息
mov di,0 ;显示偏移
call show_str

cli ;关闭中断
mov ax,cs
mov word [es:0x70*4],my70h
mov [es:0x70*4+2],ax ;安装自己的70H中断.

mov al,0xb
out 0x70,al
mov al,00010010B
out 0x71,al ;设置寄存器B 产生更新结束中断.

mov al,0xc
out 0x70,al
in al,0x71 ;读寄存器C

in al,0xa1 ;读8259从片的IMR寄存器
and al,11111110B ;允许从片的IR0中断
out 0xa1,al
sti ;开放中断

mov bx,message2
mov di,1*80*2
call show_str ;显示安装完成
mov bx,0xb800
mov es,bx
mov byte [es:12*80*2+30*2],'$'
prog_end:
hlt
inc byte [es:12*80*2+30*2+1]
jmp prog_end ;观察其他中断的情形


;显示字符串子过程
;入口参数: DS:BX 指向字符串,以0结束 DI为显示偏移
show_str:
push cx
push di
push bx
push es
mov cx,0xb800
mov es,cx
show_str_a:
mov cl,[bx]
or cl,cl
jz show_ret
mov [es:di],cl
add di,2
inc bx
jmp show_str_a
show_ret:
pop es
pop bx
pop di
pop cx
ret


;=======================================================================================
;新的70H中断,自定义中断
;显示时间.
my70h:
push ax
push bx
push ds

mov al,0xc
out 0x70,al
in al,0x71 ;读RTC寄存器C
test al,10000B
jz my70h_ret ;此处判断是否更新结束中断,当然,这个判断是不必要的.
mov al,0xa ;读RTC寄存器A
out 0x70,al
my70h_wait:
in al,0x71
test al,10000000B ;判断是否可以安全读取时间,这个判断也是不必要的.
jnz my70h_wait
mov al,0x0
out 0x70,al
in al,0x71
push ax
mov al,0x02
out 0x70,al
in al,0x71
push ax
mov al,0x4
out 0x70,al
in al,0x71
mov bx,0xb800
mov ds,bx
mov bx,12*80*2+33*2
call bcd_ascii
mov [bx],ah
add bx,2
mov [bx],al
add bx,2
mov byte [bx],':'
inc bx
not byte [bx]
inc bx
pop ax
call bcd_ascii
mov [bx],ah
add bx,2
mov [bx],al
add bx,2
mov byte [bx],':'
inc bx
not byte [bx]
inc bx
pop ax
call bcd_ascii
mov [bx],ah
add bx,2
mov [bx],al

mov al,0x20
out 0xa0,al
out 0x20,al

my70h_ret:
pop ds
pop bx
pop ax
iret

bcd_ascii:
mov ah,al
shr ah,4
add ah,0x30
and al,0xf
or al,0x30
ret
;=======================================================================================

message db 'Install new int 70h ...',0
message2 db 'Setup ok!',0
times 510-($-$$) db 0
db 0x55,0xaa
  评论这张
 
阅读(30)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017