汇编语言裸机实现时钟程序-BCD转ASCII,修改中断向量表

为了熟悉BIOS的各种中断功能,所以写来练练手。

注:以下所有中断均为BIOS中断,无DOS中断。

先说一下实现思路:

一、先能取得当前系统时间,查BIOS中断知道

7、时钟服务(Clock Service——INT 1AH)
00H —读取时钟滴答计数

01H —设置时钟滴答计数

02H —读取时间

03H —设置时间

04H —读取日期

05H —设置日期

06H —设置闹钟
07H —闹钟复位
0AH —读取天数计数
0BH —设置天数计数
80H —设置声音源信息

其中

(3)、功能02H
功能描述:读取时间

入口参数:AH02H
出口参数:CHBCD码格式的小时

CL
BCD码格式的分钟
DH
BCD码格式的秒
DL
00H——标准时间,否则,夏令时
CF
0——时钟在走,否则,时钟停止

调用1AH号中断的02H功能就可以得到当前系统的时间。

二、显示当前系统时间

查表

1、显示服务(Video Service——INT 10H)
00H —设置显示器模式
01H —
设置光标形状
02H —
设置光标位置
03H —
读取光标信息式
04H —
读取光标位置
05H —
设置显示页
06H
07H —初始化或滚屏
08H —
读光标处的字符及其属性
09H —
在光标处按指定属性显示字符
0AH —
在当前光标处显示字符
0BH —
设置调色板、背景色或边框
0CH —
写图形象素
0DH —
读图形象素
0EH —
Teletype模式下显示字符
0FH —
读取显示器模
10H —
颜色
11H —
字体
12H —
显示器的配置
13H —
Teletype模式下显示字符串
1AH —
读取/设置显示组合编码
1BH —
读取功能/状态信息
1CH —
保存/恢复显示器状态

其中
(19)、功能13H
功能描述:在Teletype模式下显示字符串
入口参数:AH
=13H
BH
=页码
BL=属性(AL=00H
或01H)
CX
=显示字符串长度
(DH、DL)=坐标(
行、列)
ES:BP=显示字符串的地址 AL
=显示输出方式
0——字符串中只含显示字符,其显示属性在BL
中。显示后,光标位置不变
1——字符串中只含显示字符,其显示属性在BL
中。显示后,光标位置改变
2——字符串中含显示字符和显示属性。显示后,光标位置不变

3——
字符串中含显示字符和显示属性。显示后,光标位置改变
出口参数:无

调用10H号中断的13H功能可以显示字符串,但是该功能入口参数是ASCII码,可是第一步中得到的是BCD码,所以必须有一个转码的过程。

一组BCD码4个位,可以直接转换为二进制数然后加上数字0的ASCII码即为该BCD对应数值的ASCII码。

 

三、动态显示当前时间

这是这程序的关键地方,实现方式,可以用程序查询当前时间若改变就重新显示当前时间,这只是最初的想法,并没有编码实现。理论上应该是可行的。

后来BIOS中断向量表,发现

8H号中断,是系统自动触发的中断,每隔1/18.2秒触发一次,这个时间远小于1秒,所以我们可以让这个中断的服务程序来刷新时钟的显示,

这个中断的的服务程序入口在

70H

1CH

28

指向每1/18.2秒时可执行的服务程序的入口。初始化时该向量指向一条IRET指令。用户可修改该向量,用户可修改该向量,使它指向自己的程序。

只要修改这个向量的值为我们的显示当前时间的函数地址,就可以每隔1/18.2秒显示一次当前时间,就可以以秒为单位动态显示时间。
修改中断服务程序入口地址的方法有两个
1).调用DOS中断21H的25H功能
2).直接修改内存内容值
因为是裸机,所以当然用第二种方法。
下面给出程序源码:

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值