1. 程式人生 > >編寫主引導扇區

編寫主引導扇區

在看《x86組合語言從真實模式到保護模式》這本書時,因為我是用fedora進行學習的,所以書上的很多工具是用不了的,只能用另外的方法來建立硬碟了:

nasm mbr.asm
qemu-img  create -f qcow disk.img 128M
dd if=mbr of=./disk.img
qemu disk.img

我們知道處理器加電或復位之後,如果硬碟是首選的啟動裝置,那麼,ROM-BIOS將試圖讀取硬碟的0面0道1扇區。傳統上,這就是主引導扇區。

主引導扇區的資料有512位元組,ROM-BIOS程式將他載入到邏輯地址0x0000:0x7c00處,也就是實體地址0x07c00處,然後判斷它是否有效。

一個有效的主引導扇區,其最後兩個字應該是0x55和0xaa。ROM-BIOS程式首先檢測這兩個標誌,如果主引導扇區有效,則跳到0x0000:0x7c00執行。

編寫一個硬碟主引導扇區

eg:

    mov ax,0xb800
    mov es,ax



    mov byte[es:0x00],'L'
    mov byte[es:0x01],0x07
    mov byte[es:0x02],'a'
    mov byte[es:0x03],0x07
    mov byte[es:0x04],'b'
    mov byte[es:0x05],0x07
    mov byte[es:0x06],'e'
    mov byte[es:0x07],0x07
    mov byte[es:0x08],'l'
    mov byte[es:0x09],0x07
    mov byte[es:0x0a],' '
    mov byte[es:0x0b],0x07
    mov byte[es:0x0c],'o'
    mov byte[es:0x0d],0x07
    mov byte[es:0x0e],'f'
    mov byte[es:0x0f],0x07
    mov byte[es:0x10],'f'
    mov byte[es:0x11],0x07
    mov byte[es:0x12],'s'
    mov byte[es:0x13],0x07
    mov byte[es:0x14],'e'
    mov byte[es:0x15],0x07
    mov byte[es:0x16],'t'
    mov byte[es:0x17],0x07
    mov byte[es:0x18],':'
    mov byte[es:0x19],0x07


    mov ax,number
    mov bx,10


    mov cx,cs
    mov ds,cx


    mov dx,0
    div bx
    mov [0x7c00+number+0x00],dl


    xor dx,dx
    div bx
    mov [0x7c00+number+0x01],dl


    xor dx,dx
    div bx
    mov [0x7c00+number+0x02],dl
    
    xor dx,dx
    div bx
    mov [0x7c00+number+0x03],dl


    xor dx,dx
    div bx
    mov [0x7c00+number+0x04],dl


    mov al,[0x7c00+number+0x04]
    add al,0x30
    mov [es:0x1a],al
    mov byte [es:0x1b],0x04


    mov al,[0x7c00+number+0x03]
    add al,0x30
    mov [es:0x1c],al
    mov byte [es:0x1d],0x04


    mov al,[0x7c00+number+0x02]
    add al,0x30
    mov [es:0x1e],al
    mov byte [es:0x1f],0x04


    mov al,[0x7c00+number+0x01]
    add al,0x30
    mov [es:0x20],al
    mov byte [es:0x21],0x04


    mov al,[0x7c00+number+0x00]
    add al,0x30
    mov [es:0x22],al
    mov byte [es:0x23],0x04


    mov byte [es:0x24],'D'
    mov byte [es:0x25],0x04


infi:
    jmp near infi


number db 0,0,0,0,0


times 203 db 0
          db 0x55,0xaa