⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boreshowtime.htm

📁 裸机显示时间。 读取bios时间并显示出来.
💻 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 + -