2012-01-29 30 views
1

我想在自身內我的引導裝載程序複製到硬盤的第一個扇區(512)(我應該使用BIOS中斷13h),我發現這個代碼:如何在硬盤與BIOS寫中斷13H

mov bx, buffer1  ; set BX to the address (not the value) of BlahBlah 
mov ah,03h   ;When ah=, int13 reads a disk sector 
mov al,5    ;Al is how many sectors to read 

mov cl,0    ;Sector Id 
mov dh,0    ;Head 
mov dl,80h   ;Drive (0 is floppy) 
mov cx,512   ;One sector /2 

mov ah, 0x3   ; set function 2h 
int 0x13 

它不起作用!

+1

複製麪食代碼從來不是一種好的做事方式。你應該學習一些彙編程序,並試着理解_why_你的代碼不起作用。然後你可以嘗試自己解決它,如果你陷入困境,來到這裏。 – Bojangles 2012-01-29 23:17:00

+1

你有沒有注意到這個評論說功能2h?但它實際上將0x3移動到啊 – iabdalkader 2012-01-29 23:19:32

+0

我知道代碼在做什麼!我實際改變它(3h是一個例子)!我不知道的是爲什麼它不工作! – Ocelot 2012-01-29 23:21:06

回答

9

您的代碼非常混亂。爲了正確使用int 13hAH = 3,還需要設置ES(其中BX所在的段,例如ES:BX是應該讀取和寫入硬盤的緩衝區的地址),並將CX設置爲組合的氣缸和扇區編號(cylinder = CL[7:6] || CH,sector = CL[5:0])。

假設你想從物理地址5000h一個扇區(512個字節)寫入CHS 0:0:硬盤0 1,您的代碼會是這個樣子:

xor ax, ax 
mov es, ax ; ES <- 0 
mov cx, 1  ; cylinder 0, sector 1 
mov dx, 0080h ; DH = 0 (head), drive = 80h (0th hard disk) 
mov bx, 5000h ; segment offset of the buffer 
mov ax, 0301h ; AH = 03 (disk write), AL = 01 (number of sectors to write) 
int 13h 

你應該還要記得在執行中斷之後檢查進位標誌是否被設置。如果函數已經正確執行,將會很清楚。如果已設置,則AH寄存器將包含錯誤代碼。

+0

TnX!它實際上工作! – Ocelot 2012-01-29 23:41:50

2

BIOS函數具有輸入參數。如果您沒有正確輸入所有輸入參數,BIOS功能無法猜測您的意思。對於BIOS功能,你使用看看:http://www.ctyme.com/intr/rb-0608.htm

據我所知,你錯過了兩個CH和ES理智的價值,所以BIOS能夠從一個完全不同的地址寫數據完全不同的部門。還要注意,CL是CX寄存器的最低一半 - 沒有意義將值加載到CL中,然後通過將值加載到CX來覆蓋它。

BIOS函數也返回值。在你的情況下,BIOS可能會返回一個狀態代碼,告訴你哪裏出了問題,並且因爲你不檢查你是否知道是否有問題或者如果有問題。