对本论坛 open source.
sbl.asm:
-------------------------------------------------------------
;
; For extended disk access: 1int 13h ah = 42h
;
struc extended_disk_access_block
sizeof_block: resb 1
reserved: resb 1
number_of_sectors: resw 1
buffer_offset: resw 1
buffer_seg: resw 1
start_sector_number: resq 1
endstruc ; extended_disk_access_block
;
; Partition table entry format
;
struc partition_table_entry
boot_flag: resb 1
begin_cylin: resb 1
begin_head: resb 1
begin_sector: resb 1
partition_type: resb 1
end_cylin: resb 1
end_head: resb 1
end_sector: resb 1
lba_offset: resd 1
lba_number_of_sectors: resd 1
endstruc ; partition_table_entry
bits 16
org 7c00h
section .text
start_point:
; Move self to high memory; set ss:sp to 9000:7000
xor ax, ax
mov ds, ax
mov ax, 9000h
mov es, ax
mov ss, ax
mov sp, 7000h
mov di, start_point
mov si, start_point
mov cx, 200h
rep movsb
push es
pop ds
push es
mov ax, real_start
push ax
retf
real_start:
; Prompt for boot
prompt_for_boot:
lea si, [input_prompt]
call display_string
wait_for_select:
mov ah, 0
int 16h
mov [crlf], al
lea si, [crlf]
call display_string
;
; verify_select: 0 - 3 in AL, then save to [crlf]
;
mov al, [crlf]
sub al, '0'
cmp al, 0
jb prompt_for_boot
cmp al, 3
ja prompt_for_boot
mov [crlf], al
;
; Check partition table for select
;
mov al, 0
mov bx, 7dbeh
check_bootable:
cmp al, [crlf]
jnz set_not_boot
mov byte [bx], 80h
jmp next_partition_entry
set_not_boot:
mov byte [bx], 0
next_partition_entry:
add bx, partition_table_entry_size
inc al
cmp al, 4
jz write_mbr_back
jmp check_bootable
write_mbr_back:
mov ax, 0301h
mov bx, 7c00h
mov cx, 0001h
mov dx, 0080h
int 13h
jnc calculate_partition_sector_offset
jmp write_mbr_error
calculate_partition_sector_offset:
;
; use ax as an index to calculate the absolute sector offset
;
mov al, [crlf]
cbw
mov bx, 7dbeh ; partition table
mov word [block+number_of_sectors], 1
mov word [block+buffer_offset], 7c00h
mov word [block+buffer_seg], 0
mov dword [block+start_sector_number+4], 0
mov cx, partition_table_entry_size
mul cx
add bx, ax
mov ecx, dword [bx+lba_offset] ; bx + sizeof(partition_table_entry) * ax + lba_offset
mov [block+start_sector_number], ecx
;
; Read partition boot sector
;
mov ah, 42h
mov dl, 80h
lea si, [block]
int 13h
jc read_boot_sector_error
; Note I must keep [ds:si] to current partition entry, which is requireed by mac os x booter,
; while ds should be 0000
; clear everything and jump to boot sector
push 0
push 7c00h
; es -> 0000
xor ax, ax
mov es, ax
; move partition table from 9000:7dbe to 0000:7000
cld
mov si, 7dbeh
mov di, 7000h
mov cx, 4 * partition_table_entry_size
rep movsb
; si -> 7000
mov si, 7000h
mov al, [crlf]
cbw
mov cx, partition_table_entry_size
mul cx
add si, ax ; si -> current partition table entry
; ds -> 0000
push es
pop ds
; dl = 80H
mov dl, 80h
retf
write_mbr_error:
lea si, [write_mbr_error_msg]
jmp display_then_halt
read_boot_sector_error:
lea si, [read_boot_sector_error_msg]
jmp display_then_halt
display_then_halt:
call display_string
halt:
hlt
jmp halt
;
; Subroutine: display_string
;
; Entry: ds:si -> c string
;
display_string:
display_str_char:
lodsb
cmp al, 0
jz display_string_ret
call display_char
jmp display_str_char
display_string_ret:
retn
;
; Subroutine: Display char in AL
;
display_char:
mov bx, 1
mov ah, 0eh
int 10h
retn
; -------------------------------------------------------------------------
; Data area
; -------------------------------------------------------------------------
crlf db 20h, 0ah, 0dh, 0 ; A digit char, plus crlf
input_prompt db 'Select boot partition(0-3):', 0
; A block to contain extended_disk_access_block
block:
istruc extended_disk_access_block
at sizeof_block, db 10h
at reserved, db 0
iend
read_boot_sector_error_msg db 'Read boot sector error', 0
write_mbr_error_msg db 'Write MBR failed', 0
times 200h-2-$+start_point db 0
db 55h, 0aah
-----------------------------------------------------------------------
Makefile:
-----------------------------------------------------------------------
NASM=H:\nasm\nasm-0.98.39\nasmw.exe
all: sbl.bin
.asm.bin:
$(NASM) -f bin $** -o $@
若你在年轻时上过水木, 它会一生跟随着你, 如一场浮动的盛宴
禁色和禁果仍被保存吗?
这世界有否给潜移默化?
离过家回了家仍住中环吗?
-----信有带到新居里烧吗?
一切美好的都会消失
人要是没有理想, 跟咸鱼有什么两样?
“把人们引向艺术和科学的最强烈动机之一,是要逃避日常生活中令人厌恶的粗俗和使人绝望的沉闷,是要摆脱人们自己反复无常的欲望的桎梏。一个修养有素的人总是渴望逃避个人生活而进入客观直觉和思维的世界。”
不要忘了,这个世界穿透一切高墙的东西,它就在我们的内心深处,他们无法达到,也接触不到,那就是希望。(FROM《肖申克的救赎》)