Bootstrap код неправильно копирует ядро - PullRequest
0 голосов
/ 03 мая 2020

Загрузчик не копирует память с диска по адресу 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 секторов.

Кроме того, он работает нестабильно в bochs, но qemu просто перезагружает виртуальную машину.

1 Ответ

1 голос
/ 03 мая 2020

Этот код только что скопировал 11 секторов ... Хотя оригинал был 26 секторов.

Почему тогда вы пытаетесь загрузить 512 секторов? (TOTALSECTORCOUNT: dw 0x200)


Вы установили регистр сегмента DS на 0x07C0?

Вы должны использовать номер диска из регистра DL, который вы получили от B IOS на входе вместо жестко заданного mov dl, 0x00.

Вы уверены в геометрии диска? Это 18 секторов и 2 головы? Лучше использовать B IOS функцию int 13h, ah=08h, чтобы узнать!

START:
(...)

Для получения более подробной помощи, пожалуйста, введите фактический код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...