[英]Reading boot Sector of the hard disk
我正在嘗試以實模式學習匯編。我想閱讀硬盤的啟動扇區,所以下面是代碼
org 100h
start:
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, buff ; segment offset of the buffer
mov ax, 0201h ; AH = 02 (disk read), AL = 01 (number of sectors to read)
int 13h
jnc .read
.read:
mov ax, cs ; set up segments
mov ds, ax
mov es, ax
mov al, 03h
mov ah, 0
int 10h
mov si, buff
call print_string
.done:
jmp .done
print_string:
lodsb ; grab a byte from SI
test al, al ; logical or AL by itself
jz .done ; if the result is zero, get out
mov ah, 0x0E
int 0x10 ; otherwise, print out the character!
jmp print_string
.done:
ret
buff dw 512
我的執行環境是DosBox0.70,exe文件是.COM。 我期望在屏幕上看到512字節,但是當我運行.COM文件時,它只是空白屏幕。有幾個原因使我可以看到它的背后
1)是否給定的代碼沒有從Bios中斷正確返回(int 13h)。 2)字符串應以null結尾,這在這里沒有發生。
但不確定是否是上述原因導致了這種情況的發生,如果是,我該如何應對這些問題?
磁盤的引導扇區不包含ASCII數據,而是包含代碼。 最有可能的情況是,第一個字節之一將為NULL,並且可能剩下不可打印的代碼(例如CR,LF等)。
嘗試通過INT 10h打印緩沖區,該緩沖區將打印ascii代碼,並以0結尾,可能根本不顯示任何內容。
您應該將緩沖區的每個字節轉換為十六進制字符串,然后將這些字符串打印到顯示屏上。 這樣,您將獲得引導扇區的簡單十六進制轉儲。
Dos將.com文件加載到自己選擇的某個段中,並將ds
和es
設置為該段。 您的buff
處於該段中,而不是段0中! 您正在讀取第一個分段0的扇區,這可能會使您的IVT癱瘓。 別管es
。
讀取一個扇區后,檢查是否有進位標志(指示錯誤),但放入.read
是否設置了該標志。如果出錯,則可能要重置驅動器,然后再次嘗試讀取。 您可能需要解決此問題的“重試計數器”,因此您不會陷入無限循環。
buff
不會保留512字節,而是保留兩個字節,其值為512。由於它位於文件的末尾,因此可能不會造成任何危害,但它不是“正確的”。
成功讀取一個扇區后,您可以將其打印為ascii字符,但是您希望打印所有512字節,而不是在遇到的第一個0處停止。 十六進制轉儲可能更具可讀性。
如果您的MBR的第一個字節為零,那么我們就陷入了泥濘! 有效引導程序的第一個字節應該是短的jmp
后跟nop
或接近的jmp
。 我們對以這種方式啟動引導程序有點隨意,大多數BIOS都不檢查,但這就是“應該”存在的地方。 如果將0作為第一個字節,CPU將執行什么操作? (提示:這是一個add
)
我認為您的兩個主要問題是將es
設置為零,如果遇到零,則停止打印。 再試一遍。 FFS,在可靠地進行讀取之前,請勿嘗試將任何內容寫入驅動器!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.