簡體   English   中英

讀取硬盤的啟動扇區

[英]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文件加載到自己選擇的某個段中,並將dses設置為該段。 您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM