?? 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>裸機顯示時間 -- 破天驚原創(chuàng)文檔</title>
<meta name="KEYWords" content="tresss,tresss studio,破天驚原創(chuàng)文檔,裸機顯示時間">
<meta name="description" content="tresss,tresss studio,破天驚原創(chuàng)文檔,裸機顯示時間">
<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>
就是不依賴任何現(xiàn)有系統(tǒng)及環(huán)境,在基本的PC硬件上實現(xiàn)顯示時間(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分區(qū)數(shù)據(jù)區(qū)---------------------
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 '
;-------------------分區(qū)數(shù)據(jù)結束--------------------
_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
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
;顯示字符串
;參數(shù) :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 ;最前的自由內存區(qū)500H
FileImport db "KERNEL BIN",0
SizeOfDir db 32 ;目錄區(qū),一個目錄信息占多大
FatFSec db 0 ;記錄目錄區(qū)之前有多少扇區(qū)
RootDSec db 0 ;記錄目錄區(qū)占多少扇區(qū)
SizeDRoot db 0 ;記錄目錄區(qū)占多當字節(jié)
FileSeg equ 0x800 ;內核加載位置
times 510-($-$$) db 0
dw 0xaa55
</pre></code></div><br>
<br>
其實整體來說也是很簡單的,就用到幾個"函數(shù)"而已.<br>
昨天偶爾看到有人發(fā)貼問這個問題,一時興起,想試一下以前的操作系統(tǒng)相關內容忘沒忘,就試著寫了一下.結果還好,發(fā)現(xiàn)匯編沒忘太多.<br>
<br>
如果有一點系統(tǒng)開發(fā)基礎相信你能看懂.如果沒有,可以找到"自已動手寫操作系統(tǒng)"這本書看一下.或者是我的"從零學寫操作系統(tǒng)"系統(tǒng).引導程序部分是很簡單的.<br>
這里只用到一個"函數(shù)"int 0x1a它的作用就是從cmos中讀取日期時間.<br>
ah是參數(shù),為1時,讀取日期,為2時讀取時間.讀取之后,把值分別放在cx,dx等相關寄存器,具體可以查一下中斷表.<br>
到了保護模式之后,這個中斷是不能用的.我記得以前讀過的文章是通過in,out讀取相關端口,直接讀取cmos內容.日期和時間在cmos中是固定存在一個位置的.<br>
二者的效果是相同的,只是int只適用于實模式,而in,out方式適用于任何時候.<br>
<br>
回到這里,數(shù)據(jù)讀取回來之后,并不能直接使用的.因為在CMOS中是bcd編碼,我們通過bcd2bin函數(shù)轉換后,再通過parseNumber函數(shù)將數(shù)字顯示出來.<br>
只是這里的parseNumber只能處理100以內的數(shù)據(jù),因為對于時間來說這已經(jīng)高了接近一倍.<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 + -