2014-12-21 39 views
0

我正在開發一個小型OS引導裝載程序。我正在使用int 0x13函數來讀取硬盤的第一個扇區。問題是,如果我將它作爲緩衝區傳遞到地址0x7e00,我會從0x7d71開始獲取數據。Int 13h在緩衝區之前調用數據放置

出於測試目的,硬盤驅動器是2 KB填充字母'A'。我正在使用Qemu來測試我的引導程序。

以下是一段我的代碼:

mov ax, 0x7e00 ; Address to place data. 
shr ax, 4   ; Shift right for es index instead of bx 
mov es, ax  ; Put buffer address into es 
xor bx, bx  ; Zero out bx, because it is not needed 
mov ah, 0x02  ; Sub function to read disks 
mov al, 0x01  ; Read 1 sector 
xor ch, ch  ; At cylinder 0 
mov cl, 0x01  ; At sector 1 
xor dh, dh  ; At head 0 
mov dl, 0x80  ; On hard drive 0 
int 0x13 

後來,當我碰巧讀0x7d71:

mov al, byte [0x7d71] ; Get the character at 0x7d71 
mov ah, 0x0e    ; Sub function to teletype print al 
xor bx, bx    ; On page 0 
mov cx, 0x00001   ; 1 time 
int 0x10 

我得到的字母 'A'。而且我可以繼續沿着地址往上走,仍然可以得到'A'。

我在緩衝區發送到es:bx錯了嗎?這個bios搞砸了嗎? (我使用Qemu來模擬,nasm來組裝,而magiciso來產生iso)

+0

只是澄清,你沒有得到'0x7E00'的一個扇區長度所需的數據'AAAA ...'嗎? 「INT 0x13」指令執行後,AX寄存器的值是多少? –

回答

0

你可以嘗試不使用A填充該HD的第一個扇區,而是在第二個扇區中讀取。難道你當前的bootprogram的長度是0x0171字節嗎?我猜你的啓動引導程序沒有從第一個扇區物理加載,但QEMU確實在0x7C00處加載了A的整個扇區,然後在0x7C00處僅放置了0x0171字節的程序代碼

+0

我的程序位於插入機器的cd的第一個扇區中。我將硬盤的第一個扇區加載到0x7E00。我的代碼應該在0x7C00加載,並填充爲512字節長。我不知道機器是如何在0x7D71處寫'A'的。 – Zapparatus

+0

我確實相信,如果你的程序有0x0171字節沒有填充,事實可能會導致更好地理解問題。 –

0

問題本身就解決了。我必須手動指定緩衝區爲0x7C90才能將數據放置在0x7C00處。我清理了我的代碼並添加了更多內容,從而以某種方式解決了問題。感謝您的幫助。