schack8888
风云使者
风云使者
  • 注册日期2010-12-06
  • 发帖数686
  • QQ
  • 火币3641枚
  • 粉丝161
  • 关注102
阅读:4996回复:0

[汇编源码]DOS6.0源程序中的硬盘引导记录源程序FDBOOT.ASM

楼主#
更多 发布于:2011-10-23 17:01
;/* 
; * Microsoft Confidential 
; * Copyright (C) Microsoft Corporation 1983 - 1991 
; * All Rights Reserved. 
; */ 
; BOOT - IBM hard disk boot record 6/8/82 
; 
; 
; This is the standard boot record that will be shipped on all hard disks. It contains: 
; 
; 1. Code to load (and give control to) the boot record for 1 of 4 possible 
; operating systems. 
; 
; 2. A partition table at the end of the boot record, followed by the required signature. 
; 
; 
_data segment public 
assume cs:_data,ds:_data 
org 600h 
cli ;no interrupts for now 
xor ax,ax 
mov ss,ax 
mov sp,7c00h ;new stack at 0:7c00 
mov si,sp ;where this boot record starts - 0:7c00 
push ax 
pop es ;seg regs the same 
push ax 
pop ds 
sti ;interrupts ok now 
cld 
mov di,0600h ;where to relocate this boot record to 
mov cx,100h 
repnz movsw ;relocate to 0:0600 
; jmp entry2 
db 0eah 
dw $+4,0 
entry2: 
mov si,offset tab ;partition table 
mov bl,4 ;number of table entries 
next: 
cmp byte ptr[si],80h ;is this a bootable entry? 
je boot ;yes 
cmp byte ptr[si],0 ;no, is boot indicator zero? 
jne bad ;no, it must be x"00" or x"80" to be valid 
add si,16 ;yes, go to next entry 
dec bl 
jnz next 
int 18h ;no bootable entries - go to rom basic 
boot: 
mov dx,[si] ;head and drive to boot from 
mov cx,[si+2] ;cyl, sector to boot from 
mov bp,si ;save table entry address to pass to partition boot record 
next1: 
add si,16 ;next table entry 
dec bl ;# entries left 
jz tabok ;all entries look ok 
cmp byte ptr[si],0 ;all remaining entries should begin with zero 
je next1 ;this one is ok 
bad: 
mov si,offset m1 ;oops - found a non-zero entry - the table is bad 
msg: 
lodsb ;get a message character 
cmp al,0 
je hold 
push si 
mov bx,7 
mov ah,14 
int 10h ;and display it 
pop si 
jmp msg ;do the entire message 
; 
hold: jmp hold ;spin here - nothing more to do 
tabok: 
mov di,5 ;retry count 
rdboot: 
mov bx,7c00h ;where to read system boot record 
mov ax,0201h ;read 1 sector 
push di 
int 13h ;get the boot record 
pop di 
jnc goboot ;successful - now give it control 
xor ax,ax ;had an error, so 
int 13h ;recalibrate 
dec di ;reduce retry count 
jnz rdboot ;if retry count above zero, go retry 
mov si,offset m2 ;all retries done - permanent error - point to message, 
jmp msg ;go display message and loop 
goboot: 
mov si,offset m3 ;prepare for invalid boot record 
mov di,07dfeh 
cmp word ptr [di],0aa55h ;does the boot record have the 
; required signature? 
jne msg ;no, display invalid system boot record message 
mov si,bp ;yes, pass partition table entry address 
db 0eah 
dw 7c00h,0 
include fdisk5.cl1 
org 7beh 
tab: ;partition table 
dw 0,0 ;partition 1 begin 
dw 0,0 ;partition 1 end 
dw 0,0 ;partition 1 relative sector (low, high parts) 
dw 0,0 ;partition 1 # of sectors (low, high parts) 
dw 0,0 ;partition 2 begin 
dw 0,0 ;partition 2 end 
dw 0,0 ;partition 2 relative sector 
dw 0,0 ;partition 2 # of sectors 
dw 0,0 ;partition 3 begin 
dw 0,0 ;partition 3 end 
dw 0,0 ;partition 3 relative sector 
dw 0,0 ;partition 3 # of sectors 
dw 0,0 ;partition 4 begin 
dw 0,0 ;partition 4 end 
dw 0,0 ;partition 4 relative sector 
dw 0,0 ;partition 4 # of sectors 
signa db 55h,0aah ;signature 
_data ends 
end

喜欢0 评分0
兼职版主
游客

返回顶部