?? boot1.txt
字號:
;2005.10.27.
;這是引導扇區代碼,Linus也是使用Intel的匯編語法寫的,這里使用了NASM的編譯器,;所以遵循NASM的語法,
; 而且也努力把后面的 HEAD.ASM 代碼也寫成NASM的,而不象Linus那樣用難懂的;AT&T語法!
; 重寫這些代碼僅僅是為了學習和自己動手調試,希望這里是個好開頭!:)
BOOTSEG equ 07C0H
SYSSEG equ 01000H
SYSLEN equ 17
start:
jmp BOOTSEG:go
go:
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0x400
;讀取A盤的第2個扇區開始的[SYSLEN]個扇區的數據,讀到[SYSSEG]:0處,第1個扇區是引導扇區!
; [為什么引導扇區不是第0個呢?奇怪!:)]
load_system:
mov dx,0
mov cx,2
mov ax,SYSSEG
mov es,ax
mov bx,0
mov ax,0x200+SYSLEN
int 0x13
jnc ok_load
mov ah,0
int 0x13
jmp load_system
ok_load:
cli
mov ax,cs
mov ds,ax
lidt [idt_48]
lgdt [gdt_48]
;現在要開始一段比較難懂的代碼了:(
mov al,0x11
out 0x20,al
out 0xA0,al
mov al,0x20
out 0x21,al
mov al,0x28
out 0xA1,al
mov al,0x04
out 0x21,al
mov al,0x02
out 0xA1,al
mov al,0x01
out 0x21,al
out 0xA1,al
mov al,0xFF
out 0x21,al
out 0xA1,al
;好了,現在要進入傳說中的保護模式了,哈哈!:)
mov bx,SYSSEG
mov ax,0x0001
lmsw ax
jmp 8:0
;段選擇子為8,也就是指向全局描述符表中的偏移為8個地方,那也就是第0個描述符后面的第1個描述符啦!
; 這個描述符指向基址為基址為0x10000,長度為8M的代碼段!從這里開始就是保護模式咯!呵呵!
;....
;本引導扇區工作完成!
; :)
;為調試而設置的臨時指令 :)
jmp go
gdt:
;每個描述符占8個字節,也就是4個雙字!
;第一個描述符
dw 0,0,0,0
;第二個描述符,基址為0x10000,長度為8M的代碼段
dw 0x07FF
dw 0x0000
dw 0x9A01
dw 0x00C0
;第三個描述符,基址為0x10000,長度為8M的數據段,與代碼段重合,這難道就是傳說中的“別名”技術么?:)
dw 0x07FF
dw 0x0000
dw 0x9201
dw 0x00C0
idt_48:
;將要賦值給IDT寄存器的6個字節,指明了中斷描述符表的基址和限長
dw 0x0000
dw 0x0000,0x0000
;在這里這個中斷描述符表指向0x0000:0000處,長度也為0,不要奇怪,沒有初始化而已,占個位置先!:)
gdt_48:
;將要賦值給GDT寄存器的6個字節,指明了全局描述符表的基址和限長
dw 0x07FF
dw 0x7C00+gdt,0x0000
;在這里全局描述符表的長度為0x800個字節(單位是字節哦!),也就是2K字節,每個描述符占8個字節,所以這里可以放256個描述符!
; 基址是在上面的標號gdt處!
message:
;定義[說明啟動正在開始]要顯示的字符串
db "xiaomin's OS is loading..."
db 13,10,13,10
message_end:
db 0
times 510-($-$$) db 0
dw 0xAA55
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -