Widzę, że nie źle się bawisz... ;D
Możemy się trochę nie dogadać,
bo ja korzystam z NASMa, a ty z FASMa.
___________________________________________
Pierwszy błąd:
mov dl, 0
'
Numer "urządzenia" z którego nastąpiło bootowanie
jest tam wpisywane przez BIOS,
więc nie powinieneś tego numeru zmieniać.
(Wykomentuj sobie tą instrukcję
dając średnik na początku lini :D )
Drugi błąd: (Tak na prawdę są to dwa problemy)
;==============================================
;SECTOR 1 ENDS HERE
;=============================================
org 0x1000
Asembler
zakłada, że początek tego kodu na pewno
znajdzie się na 0x1000-tym bajcie od początku segmentu.
Później... gdzieś dalej tworzysz symbol
loaded,
który znajduje się gdzieś kilkanaście bajtów dalej. (np. 0x1012)
Dlaczego to sprawia problem? Zaraz do tego wrócimy.
Według tego co wyczytałem pod etykietką
.readsec:
(Pomijając na siłę wybrany numer "urządzenia")
-dane ładujesz pod ES:BX, czyli u Ciebie 0x1000:0000
-ładujesz jeden sektor z 2giego cylindra? // 2gi sektor jest na 1szym cylindrze...
( Twój CHS : 1 0 2 (2gi cylinder, jego 1sza głowica, 2gi sektor tej głowicy ) )
//
Co ty tam trzymasz? 2gi sektor całej dyskietki jest "pod" pierwszym cylindrem! :
// CHS : 0 0 2 (tylko sektory są od 1 do 63, liczy się je normalnie, czyli nie "offsetowo")
Poczytaj
Int 13/AH=02h// na szczęście przypadkiem cały kod powinien się "tam" zmieścić,
// bo zajmuje wraz z tym "stringiem" mniej niż 512B
Miejsce gdzie
załadowałbyś(Załadowałeś nie ten sektor co trzeba)
2gi sektor to (jak wcześniej napisałem) 0x1000:0000.
Natomiast string oznaczony symbolem
loadedzaładowany został pod (przykładowym) adresem 0x1000:0012.
Jednak symbol
loaded jest zrozumiany jako 0x1012,
bo użyłeś tam
org 0x1000
, czyli tak na prawdę
odwołujesz się do miejsca w pamięci gdzie nic nie wstawiałeś.
Jak dobrze pamiętam pamięć po włączeniu komputera
ma w każdej komórce ustawioną wartość na 0,
więc i tak by się nic nie wypisało.
Notes: Errors on a floppy may be due to the motor failing to spin up quickly enough; the read should be retried at least three times, resetting the disk with AH=00h between attempts. |
Trzeci ... ? :
or al, al
'
Nie miało być czasem tam XOR do wyzerowania?
Czwarty błąd:
Wykonujesz operacje na stosie za pomocą call,
nie wiesz nawet co nadpisujesz,
bo nie zapewniłeś sobie miejsca.
Musisz ustawić odpowiednio SP i SS
(stack pointer i stack segment).
Za miejsce w pamięci które wybrałeś
sobie użyć, nie odpowiadam.
Sprawdź jeszcze:
jmp word 0x0000:start
'
niektóre biosy ładują pod segmentem 0x7c00,
a początek (org) jest wtedy pod 0x0000.
Polecam
jmp $
zamienić na:
halt:
hlt ; stays here forever
jmp halt
___________________________________________
Polecam:
Ralf Brown's Interrupt ListNie zapomnij również... oh... Przykro mi...
Sam zapomniałem co w tym miejscu chciałem napisać.
Może myślałem o tym, żebyś
bardziej
komentował kod w Assembly?!
Życzę powodzenia w dalszym pisaniu RyjOSa. ;D
Daj znać czy się udało i czy nadal są problemy.
Podrzuć kod po poprawkach.