📄 boreshowtime.htm
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>裸机显示时间 -- 破天惊原创文档</title>
<meta name="KEYWords" content="tresss,tresss studio,破天惊原创文档,裸机显示时间">
<meta name="description" content="tresss,tresss studio,破天惊原创文档,裸机显示时间">
<link rel="stylesheet" href="../../js/style_main.css" type="text/css">
</head>
<body>
<script src="../../js/simplehead.js"></script>
<script src="../../js/single.js"></script>
<span>裸机显示时间</span><br>
<span class="contTime">2009-02-20</span><br>
<br>
就是不依赖任何现有系统及环境,在基本的PC硬件上实现显示时间(CMOS中的时间).<br>
<br>
其实也是很简单的,写一个引导程序,然后读取CMOS中的时间值.显示出来.<br>
代码如下:<br>
<div class=codeBox ><code><pre>
;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
; boot.asm
; project: showtime
; author: tresss
; create time: 2009.02.19
; get time from cmos and show it;
;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
[bits 16]
[org 0x7C00]
jmp short _start
NOP
;----------------Fat12分区数据区---------------------
OEM DB 'TresssOS'
ByteOfSec DW 0x200
SecOfClus DB 0x01
NumOfReci DW 0x0001
NumOfFats DB 0x02
NumOfDirs DW 0x00E0 ;十进制224
NumOfSec DW 0x0B40 ;2880
MediaBPB DB 0xF0
SecOfFats DW 0x0009
SecOfTrk DW 0x0012 ;18
NumOfHeader DW 0x0002
NumOfHide DD 0x00000000
TotalOfSec DD 0x00000000
NumOfDrv DB 0x00
Reserved DB 0x00
SigOfBoot DB 0x29
IDOfVol DD 0x00000000
LabOfVol DB 'Tresss 0.01'
TypeOfFile DB 'Fat12 '
;-------------------分区数据结束--------------------
_start:
Xor ax,ax
Mov ds,ax
mov ss,ax
mov es,ax
mov sp,0x7BF0
mov si,Msg
Call ShowMessage
xor ah,ah
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;show time loop
call showTime
loopEnd:
call deleteTime
call showTime
jmp loopEnd
;;;;;;backspace
deleteTime:
mov cx,8
.clear:
mov ah,0x0e
mov al,8
int 0x10;
loop .clear
ret
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
; show time
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
showTime:
mov ah,2
int 0x1a
mov al,ch
call bcd2bin
call parseNumber
call showSep
mov al,cl
call bcd2bin
call parseNumber
call showSep
mov al,dh
call bcd2bin
call parseNumber
ret
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
; parse number
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
parseNumber:
push bx
xor bh,bh
.parseTen
cmp al,10
jl .parseNum
sub al,10
inc bh
jmp .parseTen
.parseNum
mov bl,al
mov al,bh
call showNumber
mov al,bl
call showNumber
pop bx
ret
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
; turn bcd to bin (al to al)
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
bcd2bin:
push bx
mov bl,0
mov bh,0
.bcdTen
cmp al,16
jl .bcdNum
sub al,16
inc bl
jmp .bcdTen
.bcdNum
mov bh,al
mov ah,0
mov al,bl
imul ax,10
add al,bh
pop bx
ret
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
; show number (add 0x30)
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
showNumber:
push ax
push bx
mov ah,0x0e
mov bh,0x00 ;页码
mov bl,0x0c ;前景色
add al,0x30
int 0x10
pop bx
pop ax
ret
;;;;;show spearator for time;
showSep:
push ax
mov ah,0x0e
mov al,58
int 0x10
pop ax
ret
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
;显示字符串
;参数 :DS:SI 为要显示的字符串.以00H结尾
;返回值 :无
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
ShowMessage:
mov ah,0x0e
mov bh,0x00 ;页码
mov bl,0x0c ;前景色
.nextchar:
lodsb
or al,al ;显示的字符
jz .brs
int 0x10
jmp .nextchar
.brs
ret
Msg db "Welcome To http://tresss.com......"
Mturn db 13,10,2,3,">",0
MemStart db 0x50 ;最前的自由内存区500H
FileImport db "KERNEL BIN",0
SizeOfDir db 32 ;目录区,一个目录信息占多大
FatFSec db 0 ;记录目录区之前有多少扇区
RootDSec db 0 ;记录目录区占多少扇区
SizeDRoot db 0 ;记录目录区占多当字节
FileSeg equ 0x800 ;内核加载位置
times 510-($-$$) db 0
dw 0xaa55
</pre></code></div><br>
<br>
其实整体来说也是很简单的,就用到几个"函数"而已.<br>
昨天偶尔看到有人发贴问这个问题,一时兴起,想试一下以前的操作系统相关内容忘没忘,就试着写了一下.结果还好,发现汇编没忘太多.<br>
<br>
如果有一点系统开发基础相信你能看懂.如果没有,可以找到"自已动手写操作系统"这本书看一下.或者是我的"从零学写操作系统"系统.引导程序部分是很简单的.<br>
这里只用到一个"函数"int 0x1a它的作用就是从cmos中读取日期时间.<br>
ah是参数,为1时,读取日期,为2时读取时间.读取之后,把值分别放在cx,dx等相关寄存器,具体可以查一下中断表.<br>
到了保护模式之后,这个中断是不能用的.我记得以前读过的文章是通过in,out读取相关端口,直接读取cmos内容.日期和时间在cmos中是固定存在一个位置的.<br>
二者的效果是相同的,只是int只适用于实模式,而in,out方式适用于任何时候.<br>
<br>
回到这里,数据读取回来之后,并不能直接使用的.因为在CMOS中是bcd编码,我们通过bcd2bin函数转换后,再通过parseNumber函数将数字显示出来.<br>
只是这里的parseNumber只能处理100以内的数据,因为对于时间来说这已经高了接近一倍.<br>
<br>
简单至极.<br>
只是代码是在以前的引导程序上修改的,原来的软件读取删除了.但软件盘mbr信息还留着.随它去吧.<br>
<br><br>
<div class="reallink"><a href="../myarticle/0910/boreShowtime.htm">原链接</a></div>
<br>
<script src=../../js/simplefoot.js></script>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -