[ASM] Dlaczego nie działa?

0

Czy ktoś może mi powiedzieć dlaczego to nie działa? Mam 2 pliki:
kernel.asm:

[ORG 0000h]
[BITS 16]

[SEGMENT .text]
mov ax, 0x0100                          ; adres pod który bootloader załadował naszego kernel'a
mov ds, ax
mov es, ax
    
cli
mov ss, ax                              ; ustawiamy segment stosu
mov sp, 0xFFFF                          ; ustawiamy wskaznik stosu(max 64 kb)
sti

mov si, msgHello
Pisz:
    mov al, [si]
    cmp al, 0
    jz koniec
    mov ah, 09h
    mov bx, 7
    inc si
    int 10h
    jmp Pisz

koniec:
     jmp koniec

[SEGMENT .data]
msgHello db 'Czesc!',0

drugim plikiem jest bootloader. Tak jak napisali na OS Programming kompiluję i kopiuję bootLoader do MBR dyskietki, kernel zaś do drugiego sektora. Odpalam i nie działa. Dlaczego?

0

[BITS 16]
[ORG 0]
Mov Ax, 100h
Mov Ds, Ax
Mov Es, Ax

Cli
Mov	Ss,	Ax
Mov	Sp,	-1
Sti

Mov	Si,	msgHello
Mov	Ah,	0Eh
Mov	Bx,	7h

Pisz:
LodsB
Cmp Al, 0
Jz koniec
Int 0x10
Jmp Pisz

koniec:
jmp $

msgHello db 'Czesc!',0

zastosowałem funkcję 0Eh przerwania 10h i pare innych rzeczy. Przeanalizuj kod.

0

Twój program funkcjonalnie niczym się od mojego nie różni, i tak samo jak mój nie działa. Twój jest po prostu trochę szybszy. W każdym razie dołączę może kod bootloadera. Tak jak pisali na osp kompiluję nasmem, kopiujębootloader do zerowego sektora a kernel do pierwszego. Podejrzewam, że błąd jest gdzieś w określaniu położenia kodu (bootloader umieszcza kernel w 0x0800 a wkernelu ustawiane jest 0x0100), pomimo prób nie udało mi się jednak tego naprawić.

boot.asm

[ORG 0h]
jmp 07C0h:start       
msg  DB 'Witaj w boot sektorze.', 13, 10, 0
start:
mov ax, 07C0h          
cli                      ; przed ustawianiem stosu w celach
                         ; bezpieczeństwa powinno się wyłączyć przerwania
mov ss, ax               ; ustawiamy segment stosu 
mov sp, 03FEh            ; i wskaźnik pokazujący na szczyt stosu
sti                      ; włączamy przerwania
push cs
pop ds                           
pop es         ; odrazu wykorzystamy stos iniciując nasze rejestry segmentowe

;funkcyjka wyswietlajaca napis(w niezbyt dobrym stylu)
mov si, msg
next_char: 
mov al, [si]
cmp al, 0
jz char_end
inc si
mov ah, 0eh
int 10h
jmp next_char
char_end:

mov ah, 02h             ; odczytaj sektor z dyskietki
mov al, 1               ; ile sektorow
mov ch, 0               ; numer sciezki
mov cl, 2               ; numer sektora
mov dh, 0               ; glowica
mov dl, 0               ; numer dysku
mov bx, 0800h  
mov es, bx  
mov bx, 0               ; odczytany sektor zapisujemy pod adresem 0800:0000h
int    13h              ; i z tak przygotowanymi danymi wywolujemy przerwanie
     
jmp     0800h:0000h        ; skok do kernela ktory przed chwila wczytalismy z dyskietki
times 510-($-$$) db 0      ; uzupelnienie pliku tak aby zawieral 510 bajtow
dw 0xAA55                ; sygnaturka (2 bajty), plik ma razem 512 bajtow (200h)

0

Dobra. Zadziałało. Rzeczywiście bootloader ładuje gdzie indziej niż potem zostało podane w kernelu. W każdym razie dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1