Kezdőoldal » Számítástechnika » Programozás » Assembly programozás, valaki...

Assembly programozás, valaki tud segíteni?

Figyelt kérdés
Nos, az a helyzet hogy egy floppy lemezképfájl első 512 bájtjába (első szektor) írtam egy bootloadert. A második szektorba (második 512 bájt) írtam egy rövid kódot ami képes kiírni egy nagy 'H' betűt a képernyőre. A bootloader elvégzi a floppy lemez resetjét (ah(0x00), dl(0x00(az első meghajtó-floppy)), int 0x13 BIOS lemezkezelési megszakítás), ,majd elvégeztem a lemez első oldalának első cilinderének második szektorán az olvasást (ahova írtam a karakterkiíró kódot) a 0x8000:0x0000 célcímre, majd jmp utasítással a címre ugrok, de nem csinál semmit. Tulajdonképpen kernelhívást akarok csinálni bootloaderből. A lemezképfájlt Oracle VM Virtualboxban futtatom. Valaki tud segíteni?
2014. nov. 20. 16:08
1 2
 1/20 A kérdező kommentje:
A lemezképfájl szektoraiba hex editorral írtam be az utasításokat hex számokkal.
2014. nov. 20. 16:10
 2/20 anonim ***** válasza:

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.

2014. nov. 20. 16:18
Hasznos számodra ez a válasz?
 3/20 A kérdező kommentje:

A címzésem:


mov bx, 0x8000

mov es, bx

int 0x13 lemezolvasás


jmp 0x8000:0x0000


így csináltam

2014. nov. 20. 16:24
 4/20 A kérdező kommentje:
valami ötlet?
2014. nov. 20. 16:25
 5/20 Reiber Péter ***** válasza:

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.


[link]


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.

2014. nov. 20. 17:10
Hasznos számodra ez a válasz?
 6/20 anonim ***** válasza:

"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.

2014. nov. 20. 17:47
Hasznos számodra ez a válasz?
 7/20 A kérdező kommentje:
az es:bx re való ugrásnál a következő hibaüzenettel szembesülök: Invalid opcode parameter
2014. nov. 20. 17:57
 8/20 Reiber Péter ***** válasza:

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.

2014. nov. 20. 18:50
Hasznos számodra ez a válasz?
 9/20 A kérdező kommentje:

És ez jó?


jmp es:[bx]

2014. nov. 20. 19:02
 10/20 Reiber Péter ***** válasza:

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:


[link]

2014. nov. 20. 19:09
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!