锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
閭d箞濡傛灉涓涓鏄痚xpandupward鐨勶紝浠栫殑offset鍙兘鏄?鍒發(fā)imit錛岃屽鏋滄槸expanddownward鐨勶紝offset灝辨槸浠巐imit鍒癋FFF錛屼笖璇ユ爤鐨勫闀挎柟鍚戞槸limit-->FFFF錛屽嵆錛屾暟鎹湪鍐呭瓨涓繪槸浠庝綆鍦板潃鏀懼埌楂樺湴鍧
浠婂ぉ鍙楃泭鍖祬.....鎴戝錛屽鏋滀笉鏄湪緗戠粶涓婃悳绱㈠埌鐨勮繖鍙ヨ瘽錛屾垜鑷繁緙栧啓鐨凨ernel榪涚▼鎬庝箞涔熻皟璇曚笉濂姐?br />浠婂ぉ澶珮鍏翠簡錛岀粓浜庢妸Kernel鐨勮繘紼嬫満鍒惰皟鏁村ソ浜嗭紒錛侊紒鎴釜鍥撅紝搴嗙涓涓嬨?br />涓嶈繃鎴浘鏈変釜閿欒錛屽氨鏄簲璇ユ槸Process鐨勶紝鑰屼笉鏄疶hread錛岃繖涓や釜涓滆タ鏈夋湰璐ㄥ尯鍒?br />
]]>
org 0x100
[bits 16]
jmp loaderStart
_GRAPH_SEG_OFFSET_ equ 0xb800
_RootEntCnt_ equ 0xe0
BS_OEMName db 'XXXXXXXX'
BPB_BytsPerSec dw 0x200
BPB_SecPerClus db 1
BPB_RsvdSecCnt dw 1
BPB_NumFATs db 2
BPB_RootEntCnt dw _RootEntCnt_
BPB_totSec16 dw 0xb40
BPB_Media db 0xf0
BPB_FATSz16 dw 9
BPB_SecPerTrk dw 0x12
BPB_NumHeads dw 2
BPB_HiddSec dd 0
BPB_totSec32 dd 0
BS_DrvNum db 0
BS_Reserved1 db 0
BS_BootSig db 0x29
BS_VolID dd 0
BS_VolLab db '11111111111'
BS_FileSysType db 'FAT12聽聽 '
parameters:
聽screenPo dd 0
聽STR_LEN equ 12
聽bootStr db 'Loading...聽 '
聽noLoaderStr db 'No Kernel...'
聽ready db 'Ready聽聽聽聽聽聽 '
聽KernelBase equ 0x8000
聽KernelOffset equ 0x0
聽rootEntryNum db _RootEntCnt_
聽loaderName db 'KERNEL聽 BIN'
loaderStart:
聽mov ax,cs
聽mov ds,ax
聽mov es,ax
聽mov ss,ax
聽mov sp,0100
聽mov ax,_GRAPH_SEG_OFFSET_
聽mov gs,ax
聽
聽mov dh,0
聽call displayStr
聽
聽xor ah,ah
聽mov dl,[BS_DrvNum]
聽int 0x13
聽
聽mov ax,KernelBase
聽mov es,ax
聽mov bx,0
聽mov ax,19
聽mov cl,14
聽call readSector
聽
聽
聽xor edi,edi
聽
anotherFile:
聽xor esi,esi
聽cmp byte [rootEntryNum],0
聽je noLoader
聽
nextChar:
聽mov al,byte [es:edi]
聽cmp byte [ds:loaderName+si],al
聽jne notThisFile
聽cmp si,10
聽je found
聽inc esi
聽inc edi
聽jmp nextChar
聽
聽notThisFile:
聽shr edi,5
聽inc edi
聽shl edi,5
聽dec byte [rootEntryNum]
聽jmp anotherFile
聽
noLoader:
聽mov dh,1
聽call displayStr
聽jmp $
聽
found:
聽mov dh,2
聽call displayStr
聽
聽mov ax,word [es:edi+(0x10)]
聽mov cl,1
聽
聽push ax
聽mov ax,KernelBase
聽mov es,ax
聽mov ebx,KernelOffset
聽pop ax
聽
聽readEntry:
聽
聽cmp ax,0xfff
聽je readEnd
聽push ax
聽add ax,19+14-2
聽call readSector
聽pop ax
聽
聽add ebx,512
聽call getFATEntry
聽
聽jmp readEntry
聽readEnd:
聽
聽jmp toProtectMode
displayStr:
聽; dh: String index
聽push cx
聽push ax
聽push bx
聽push esi
聽push edi
聽mov cx,STR_LEN
聽mov edi,dword [screenPo]
聽mov esi,bootStr
聽xor eax,eax
聽mov al,dh
聽mov bl,STR_LEN
聽mul bl
聽add esi,eax
聽.1:
聽lodsb
聽mov [gs:edi],al
聽inc edi
聽inc edi
聽loop .1
聽
聽mov dword [screenPo],edi
聽pop edi
聽pop esi
聽pop bx
聽pop ax
聽pop cx
聽ret
readSector: ;ax: starting sector cl:number of sectors
聽; ah 0x2聽聽聽聽聽聽聽聽聽 al:number of sector to read
聽; 聽聽聽聽聽bx: es:bx
聽; ch:cylinder聽聽聽cl:start sector
聽; dh:head聽num聽聽聽dl:Drive
聽push bp
聽mov bp,sp
聽push cx
聽push dx
聽push ax
聽
聽mov dl,[BPB_SecPerTrk]
聽div dl
聽mov cl,ah
聽inc cl
聽
聽mov ch,al
聽shr ch,1
聽
聽mov dh,al
聽and dh,1
聽
聽mov dl,byte [BS_DrvNum]
聽
聽.1:
聽mov ah,2
聽mov al,byte [bp-2]
聽int 0x13
聽jc .1
聽聽
聽pop ax
聽pop dx
聽pop cx
聽pop bp
聽ret
聽
getFATEntry:
聽FATBaseInMem equ 0x7000
聽;ax is the entry number
聽;return ax is the next entry
聽
聽push es
聽push bx
聽push dx
聽push cx
聽
聽mov bx,FATBaseInMem
聽mov es,bx
聽
聽mov bx,3
聽mul bx ;dx:ax
聽mov bx,2
聽div bx ;dx is the rest
聽push dx
聽
聽xor dx,dx
聽mov bx,[BPB_BytsPerSec]
聽div bx
聽mov cl,2
聽xor bx,bx
聽add ax,1
聽call readSector
聽mov bx,dx; mov byte index
聽
聽pop dx
聽xor ax,ax
聽cmp dx,0
聽jne oddPart
聽
聽mov ax,word [es:bx]
聽and ax,0x0fff
聽
聽jmp after
聽oddPart:
聽
聽mov ax,word [es:bx]
聽shr ax,4
聽after:
聽pop cx
聽pop dx
聽pop bx
聽pop es
聽
聽ret
聽
聽
toProtectMode:
聽jmp start
聽
%macro Descriptor 3
聽dw %2 & 0xffff
聽dw %1 & 0xffff
聽db (%1 >> 16) & 0xff
聽dw ((%2 & 0x0f0000) >> 8) | (%3 & 0xf0ff)
聽db (%1 >> 24) & 0xff
%endmacro
DummyGDT: Descriptor 0,0,0
CodeGDT: Descriptor 0,0xfffff,1100000010011010b
DataGDT: Descriptor 0,0xfffff,1000000010010010b
ScreenGDT: Descriptor 0xb8000,0xffff,0000000010010010b
GDTPtr dw $-DummyGDT-1
聽dd 0x9000*0x10+DummyGDT
CodeSelector equ CodeGDT-DummyGDT
DataSelector equ DataGDT-DummyGDT
ScreenSelector equ ScreenGDT-DummyGDT
start:
聽call killMotor
聽cli
聽mov dh,2
聽call displayStr
聽
聽lgdt [GDTPtr]
聽
聽in al,0x92
聽or al,10b
聽out 0x92,al
聽
聽mov eax,cr0
聽or eax,1
聽mov cr0,eax
聽
聽jmp dword CodeSelector:(0x9000*0x10+ProtectMode)
killMotor:
聽push dx
聽mov dx,0x3f2
聽mov al,0
聽
聽out dx,al
聽pop dx
聽ret
[bits 32]
ProtectMode:
聽mov ax,ScreenSelector
聽mov gs,ax
聽xor edi,edi
聽.again:
聽inc byte [gs:edi]
聽jmp .again
mov ah,0
mov dl,0
int 0x13
mov ax,0x7f0
mov es,ax
mov ah,2
mov ch,0
mov dh,0
mov al,1
mov cl,2
mov dl,0
mov ebx,0
int 0x13
mov ax,0xb800
mov gs,ax
jmp 0x7f00
times 510-($-$$) db 0
dw 0xaa55
again:
.1:
inc byte [gs:8]
jmp .1
times 1024-($-$$) db 0
榪欎釜紼嬪簭鐨勬墽琛屾垚鍔熻鏄庢湁涓孌電殑鍐呭瓨鍦板潃鏄笉鑳藉琚玦nt 0x13璁塊棶鐨勩備絾鏄叿浣撴槸涓轟粈涔堥渶瑕佽繘涓姝ユ濊冦?/p>
mov ax,0x7d00; original: mov ax,0xb800
mov es,ax
mov ah,2
mov ch,0
mov dh,0
mov al,1
mov cl,1
mov dl,0
mov ebx,0
int 0x13
mov ah,0x4c
int 0x21
榪欎箞鐭煭鐨勭▼搴?鍦ㄥ師鍏堟妸紓佺洏絎竴鎵囧尯鐨勬暟鎹澆鍏ュ埌B800錛?000浠庡睆騫曟樉紺哄嚭鏉ュ嵈鎵ц瀹屾垚鍚嶣800錛?000鍗存病鏈夋暟鎹紝鑰屽鏋滀慨鏀逛簡鍦板潃涓?d00鍗村彲浠ワ紝榪欐槸涓轟粈涔堝憿錛?/font>
闇瑕佺殑鍛戒護琛岋細
nasm -f elf -o dest.o聽src.asm
gcc -c -o dest2.o src2.c聽聽聽聽聽聽聽聽聽聽 (-c 鐨勬剰鎬濇槸浠呬粎compile)
ld -s -o final.o dest.o dest1.o
bootStart:
xor ax,ax
mov ds,ax
mov ss,ax
mov sp,0x7c00
mov bp,sp
; Init the DRIVE
; Boot drive number is stored in DX(lower part)
mov [drive],dl
again:
mov cx,200
againChar:
call putString
loop againChar
mov al,[page]
inc al
mov [page],al
cmp al,0x8
jne again
mov cx,0x9
xor al,al
mov [page],al
check:
mov ah,0x05
int 0x10
xor ah,ah
int 0x16
mov al,[page]
inc al
mov [page],al
loop check
db 0xea
dw 0x0000, 0xffff
data db '012345678'
putString:
mov si,[page]
mov al,[data+si]
mov ah,0x0a
mov bl,0x07
mov bh,[page]
int 0x10
retn
;************************
; Here are the data part
;************************
drive db 0
page db 0
times 510-($-$$) db 0
dw 0xaa55