2013-02-09 40 views
0

我一直试图做一个引导程序。在我得到它的一点,但现在它不再工作。当我运行它时,它会打印出一个A和一个B.所以这意味着它实际上做了读取,但由于某种原因,当它跳转时,它不会执行我放在USB驱动器第二个扇区的代码。引导程序 - 不要jmp或正确加载第二个扇区

我不知道我的地址或跳转有问题吗?

我包括放置在第二个扇区我的USB记忆

[bits 16] 
[org 0x7C00] 

jmp Start 

;%include "BIOS_Parameter_Block.inc" 
;%include "Extensions.inc" 
;%include "Print.inc" 

; Prepare Stack Segment 
;----------------------------------------------------------------- 
Start: 
xor ax, ax 
mov ds, ax 
mov es, ax 
mov fs, ax 
mov gs, ax 
mov ss, ax 

mov sp, 0x7C00    ; Move Stack into SP 
mov bp, sp     ; Store current Stack Base 

; Print Character to Make Sure Bootloader Has Reached this Point 
;----------------------------------------------------------------- 
mov ah, 0x0E    ; Print Character to Screen 
mov bh, 0x00    ; No Page Numbering 
mov bl, 0x07    ; White Text, Black Background 
mov al, 65     ; Print Letter A 
int 0x10 

; Check if INT0x13 Extentions are Supported 
;----------------------------------------------------------------- 
mov ah, 0x41    ; Set Function 0x41 
mov word bx, 0x55AA   
push dx      ; Save old Drive Identifier 
mov dl, 0x80    ; Load 'Active' ID Into dl 
int 0x13     ; Call Interupt 
jc short unsupported  ; If Extentions aren't Supported, Jump 
clc       ; Clear Carry Bit 

; Read from the device. 
;----------------------------------------------------------------- 
mov si, DAPS    ; Load DAPS Struct to DS:SI 
mov ah, 0x42    ; Read Functions (AL Ignored) 
mov dl, 0x80    ; Load 'Active' ID Into dl 
int 0x13 
jc short unsupported  ; If something goes wrong... 

mov ah, 0x0E    ; Print Character to Screen 
mov bh, 0x00    ; No Page Numbering 
mov bl, 0x07    ; White Text, Black Background 
mov al, 66     ; Print Letter B 
int 0x10 

; IT DOES PRINT THIS ABOVE 

jmp 0x0:0x7E00     ; Jump to main 

; Errors 
;----------------------------------------------------------------- 
unsupported: 
mov ah, 0x0E    ; Print Letter F, Gives Indication of Failure 
mov bh, 0x00 
mov bl, 0x07 
mov al, 70 
int 0x10 

clc 
hlt 
; Memory Data Structures and Other Variables 
;----------------------------------------------------------------- 
; Disk Address Packet Structure (Used For Loading Rest of OS) 
DAPS: db 0x10    ; Size of Structure (16 bytes) 
     db 0     ; Always 0 
     dw 1     ; Number of Sectors to Read (1x512) 
     dw 0x7E00    ; Offset to load to. 
     dw 0x0000    ; Segment to load to. 
     dq 1     ; Read from Second Block 

; Fill Out Rest of Bootloader 
;----------------------------------------------------------------- 
times 510-($-$$) db 0 

db 0x55, 0xAA    ; Add Boot Record Signature 

2阶段的图像

[ORG 0x7E00] 
[bits 16] 

mov ah, 0x0E    ; Print Character to Screen 
mov bh, 0x00    ; No Page Numbering 
mov bl, 0x07    ; White Text, Black Background 
mov al, 67     ; Print Letter C 
int 0x10 
cli 
hlt 

希望你们能帮助我!

Memory of Bootloader

回答

1

INT 0×13 BIOS调用通常使用的驱动器ID在DL寄存器 - 0x80的通常是第一HDD的ID。您可能需要更改此设置,以便从USB驱动器(这可能不是第一个HDD)加载额外的扇区。

+0

我明白你的意思,但我怎么知道我的USB的驱动器ID是什么? – 2013-02-09 12:22:33

+1

这是一个很好的问题 - 我不能马上记住过去我是如何处理这个问题的。我怀疑它会出现在HD范围(> 0x80),但我无法证实这一点。显然,Windows驱动器号和BIOS驱动器ID(http://support.microsoft.com/kb/62571)之间存在_some_对应关系,并且您可能能够使用int 0x13 AH = 0x48(http ://www.delorie.com/djgpp/doc/rbinter/id/21/7.html) – Michael 2013-02-09 12:41:04

+0

非常感谢您的信息! – 2013-02-09 12:45:49