Bootstrap代码未正确复制内核

问题描述 投票:0回答:1

引导加载程序不会将内存从磁盘复制到地址0x10000。实际上,前几个扇区已被很好地复制,但是在某个时候,它只是停止复制并跳转到内核。

这是我的代码:

[ORG 0x00]
[BITS 16]           

SECTION .text       

jmp 0x07C0:START    

TOTALSECTORCOUNT: dw 0x200

KERNEL32SECTORCOUNT: dw 0x05

START:
    (...)                

RESETDISK:                          

    mov ax, 0
    mov dl, 0
    int 0x13

    jc HANDLEDISKERROR


    mov si, 0x1000                  
    mov es, si                      
    mov bx, 0x0000                  

    mov di, word [ TOTALSECTORCOUNT ] 

READDATA:               
    cmp di, 0           
    je READEND          
    sub di, 0x1

    mov ah, 0x02                    
    mov al, 0x1                     
    mov ch, byte [ TRACKNUMBER ]    
    mov cl, byte [ SECTORNUMBER ]   
    mov dh, byte [ HEADNUMBER ]     
    mov dl, 0x00                    
    int 0x13                        
    jc HANDLEDISKERROR              

    add si, 0x0020      
    mov es, si          



    mov al, byte [ SECTORNUMBER ]   
    add al, 0x01                    
    mov byte [ SECTORNUMBER ], al   
    cmp al, 19                      
    jl READDATA                     


    xor byte [ HEADNUMBER ], 0x01   
    mov byte [ SECTORNUMBER ], 0x01 


    cmp byte [ HEADNUMBER ], 0x00   
    jne READDATA                    


    add byte [ TRACKNUMBER ] , 0x01 
    jmp READDATA                    
READEND:
    push LOADINGCOMPLETEMESSAGE     
    push 2                         
    push 0                        
    call PRINTMESSAGE               
    add sp, 6                   

    jmp 0x1000:0x0000


HANDLEDISKERROR:
    push DISKERRORMESSAGE   
    push 2                
    push 0               
    call PRINTMESSAGE       
    add sp, 6               

    jmp $                   

    (...)


SECTORNUMBER:       db  0x02    
HEADNUMBER:         db  0x00    
TRACKNUMBER:        db  0x00    



times 510 - ( $ - $$ )  db  0x00    


db 0x55             
db 0xAA             

此代码仅复制了11个扇区,但是原来是26个扇区。

而且,它在boch中运行不稳定,但是qemu只是重新引导了虚拟机。

assembly operating-system x86-16 bootloader bios
1个回答
1
投票

此代码仅复制了11个扇区...但是原来是26个扇区。

为什么要尝试加载512个扇区? (TOTALSECTORCOUNT: dw 0x200


您是否将DS段寄存器设置为0x07C0吗?

您应该使用进入时从BIOS接收的DL寄存器中的驱动器号,而不是硬编码的mov dl, 0x00

您确定磁盘的几何形状吗?是18个扇区和2个负责人吗?最好使用BIOS功能int 13h, ah=08h进行查找!

START:
(...)

[以获得更好的帮助,请填写实际代码。

© www.soinside.com 2019 - 2024. All rights reserved.