Assembly programozás, valaki tud segíteni?
Ha nem csinál semmit, akkor valamelyik memóriacímed rossz. Az a gyanú, hogy nem figyeltél oda a szegmens/offszet címekre, hanem feltételeztél valamit, ami nem jött be. Első körben fixáld a CS-t egy far jmp ugrással, majd töltsd be a többi szegmensregiszterbe CS értékét, hogy ne legyen kavarodás.
Induláskor az MBR a 0x7C00 címre töltődik be. Ez, megkötés híján, lehet 0x0000:0x7C00, de lehet 0x07C0:0000 is, vagy bármi más. A két esetben CS:[0002] mást jelent; az első esetben 0x0000:0x0002, míg a másodikban 0x07C0:0x0002. Értelemszerűen az eltérés probléma.
Mivel nem látom a kódot, így nem tudom pontosan megmondani, mit hibázhattál el, de nagy valószínűséggel a szegmenseknél csúszott el valami.
A címzésem:
mov bx, 0x8000
mov es, bx
int 0x13 lemezolvasás
jmp 0x8000:0x0000
így csináltam
Ezerféle baj lehet, amíg a kódot nem látjuk, fogalmunk nincs.
De tanulmányozhatod milyen egy igazi floppy boot szektor, ami ott működik, működnie kell neked is.
Hogy legalább a nyers kódod jó, azt simán kipróbálhatod bebootolva a virtuális gépedre egy létező kész dos image-t majd elindítva .com kiterjesztéssel a kódodat.
Ott debug alatt tudod nyomkövetni is.
Gyanus, hogy vagy az int13-at paraméterezed félre, vagy valami felesleges dolgot csinálsz -rosszul (minek resetelni az fdd kontrollert, ha már a te kóddodat onnan töltötte a bios?)
És mintha fogalomzavarban is lennél.
Helyesen írod, hogy az INT13 bios hívás, később kernelről(?!!) beszélsz, az itt sehol nincs, majd ha lesz oprendszer betöltve, annak a "magja" az a kernel, itt még csak bios létezik.
A beidézett kódod vagy hiányos, vagy rossz, mert ha igy :
mov bx, 0x8000
mov es, bx
int 0x13
csinálod, akkor es:bx-re, $8000:$8000-re olvasol, hiszen a bx-ben is $8000-t hagysz.
Utánna a jmp 8000:0 persze nem oda ugrik. Tehát ez igy biztos "elmegy az erdőbe", ha egyáltalán az olvasás megtörténik...mert még lehet tucat féle más baj is.
"mov bx, 0x8000
mov es, bx
int 0x13 lemezolvasás"
Épp most akartam én is írni, hogy a 0x8000:0x8000 címre olvasol, mivel BX regiszterben benne marad a 0x8000 (xor bx,bx segít), de látom, már a kolléga is megírta.
Azért a .com formátummal vigyázzunk, mert ott ott van a PSP, ami 256 bájttal eltol minden offszetet, ergo, ami ott működik, az lehet, hogy flat binárisként nem fog, illetve vice versa.
mov bx,8000h
mov es,bx
xor bx,bx
int 13h
De rossz megoldás egyébként az is, hogy abszolút címre ugrasz. Így bosszulja meg magát a hardcoding. Mivel int 13h emlékeim szerint az ES:BX értéket nem módosítja, így az olvasás után ugorhatsz ES:BX-re is, akkor meg teljesen mindegy, hogy hova töltötted a második szektort.
Persze, mert nincs ilyen utasítás hogy "jmp es:bx" :))
Jó oda a fix ugrás, az eredeti dos boot-ban is az van, csak akkor 8000:0-ra is töltsd a szektorodat, ha már oda ugrassz, tehát pl tegyél be az int 13 elé közvetlen egy "xor bx,bx"-et ami kinullázza neked.
És ez jó?
jmp es:[bx]
Ez mást csinál, az es:bx címen lévő értéket nézi meg, és oda ugrik amit ott a címen talál. Ugrótáblákban használják ezt, neked ide érdektelen.
Segítő szándékkal írom, "találgatva" nagyon nehéz ám programozni.
Először egyszerű példákat kellene megérteni, utasításokat tanulni, stb.
PL ebből:
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!