Autor Thema: Neues Problem--> Bios int 13h/ LBA-->CHS  (Gelesen 11213 mal)

Biehler Productions

  • Beiträge: 51
    • Profil anzeigen
    • http://bielos.de.tk
Gespeichert
« am: 31. December 2005, 15:48 »
Hi,
nu hab ich mich extra wegen so nem dummen Fehler hier angemeldet :(
Hoffentlich könnt ihr mir helfen.

Es geht um folgendes:

Ich schreibe gerade mein eigenes OS (wie wohl viele hier :) ).
Da man natürlich auch Programme laden können sollte, habe ich eben soetwas impletiert.



Die Sachlage:
Ich lade hiermit ein programm an 07c0h:1a00h

Zitat

mov al,1
mov ah,05h
lea bx,[programm]
int 21h

(Das sind eigene Int Funktionen)


Dann will ich an diese Stelle springen, aber nicht irgendwie, sondern CS muss die physikalische Adresse im RAM von 07c0h:1a00h haben und der IP muss 0h haben.
Also hab ich mal schnell die physikalische Adresse berechnet:
07c0h*16+1a00h=9600h
Dann mach ich also einen far Call dahin.
call 9600h:0h

Aber da hängt sich dann Bochs in einer Endlosschleife auf und in der Logdatei steht tausendmal:


00060811446i[CPU0 ] LOCK prefix unallowed (op1=0x1, attr=0x300, mod=0xc0, nnn=6)


Yo, das LOCk ein Befehl iss, weis ich, aber dieser Befehl kommt in dem geladenen Programm überhaupt nicht vor:


programm:
mov ah,0h
mov al,"!"
int 21h
jmp $


wenn ich das Programm ganz normal anspringe, mit:
call 1a00h funktioniert es.

wie kann ich also CS richtig laden?



btw, noch eine Frage:
Ich lese des öfteren, dass man im RealMode keine 32 Bit Register verwenden kann.
Stimmt das? Weil zumindest dieser TEstcode:


inc si
lodsd
mov ebx,1400h
mov dword edx,[bx]
add bx,4
cmp eax,edx
JE asdfg


lief unter Bochs und einem sehr altem Notebook.


Da ich nicht vor habe, in den PM zu schalten, die Bearbeitung von DWords bei der Stringbearbeitung aber doch angenehmer ist, als Wordweises bearbeiten, hätte ein 32 Bit Modus doch einige Vorteile...

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 31. December 2005, 15:59 »
Du kannst 32Bit Register/Befehle im RM benutzen, jedoch werden diese Befehle nur laufen, wenn der Prozessor 32Bit Register hat (also ab dem 386).

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #2 am: 31. December 2005, 16:02 »
07C0h*10h+1A00h=9600h

Diese musst du dann noch durch 10h teilen = 0960h

Und dann so springen:

call 0960h:0h ;falls der Assembler das kann

Natürlich kannst du 32Bit im RM verwenden.

bitmaster
In the Future everyone will need OS-64!!!

drccpp

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 31. December 2005, 16:08 »
Du hast vergessen 9600h wieder durch 16 zu teilen.
Es muss also

call 960h:0h

heißen.

Und zu deiner Frage mit dem 32 Bit im RM, kann natürlich sein, dass das funktioniert. Wenn der Code unter 16Bit läuft und man 32-bit register nehmen will, wird ein OPERANDSIZE Prefix-Byte (66h) vor die Instruction gesetzt.

EDIT: Oh sorry, war jetzt gleichzeitig

Biehler Productions

  • Beiträge: 51
    • Profil anzeigen
    • http://bielos.de.tk
Gespeichert
« Antwort #4 am: 31. December 2005, 17:38 »
thx @all
Stundenlang hab ich mir umsonst den Kopf darüber zerbrochen, und jetzt gehts dank euch :D



Zitat


Und zu deiner Frage mit dem 32 Bit im RM, kann natürlich sein, dass das funktioniert. Wenn der Code unter 16Bit läuft und man 32-bit register nehmen will, wird ein OPERANDSIZE Prefix-Byte (66h) vor die Instruction gesetzt.


nu steht meinem OS endlich nix mehr im Weg :mrgreen:

Biehler Productions

  • Beiträge: 51
    • Profil anzeigen
    • http://bielos.de.tk
Gespeichert
« Antwort #5 am: 01. January 2006, 10:30 »
Zitat von: T0ast3r
übrigens ist "lock" kein Befehl sondern ein Prefix
und wennst du einen far call ausführen möchtest, so schreibe
call dword Segment:Offset
(siehe nasm doku)
da gibts nämlich bei dem call und jmp befehl viele möglichkeiten, eingige beudeten far, andere near!
(Mehrere Wege führen nach Rom! ) :wink:

ist das nur auf den nasm bezogen?
ich progg hier mit dem fasm, find den besser als nasm.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 01. January 2006, 17:15 »
Soweit ich weiß, werden Jumps/Calls immer FAR, wenn man ein Segment angibt. Das jmp dword sorgt nur dafür, das der jmp kein short jump wird.

Biehler Productions

  • Beiträge: 51
    • Profil anzeigen
    • http://bielos.de.tk
Gespeichert
« Antwort #7 am: 01. January 2006, 17:48 »
Zitat von: SSJ7Gohan
Soweit ich weiß, werden Jumps/Calls immer FAR, wenn man ein Segment angibt. Das jmp dword sorgt nur dafür, das der jmp kein short jump wird.


ok. werd mir das mal merken, vieleicht brauchts man mal :mrgreen:


nun gut, ich hab hier ein weiteres Problem:


diesmal handelt es sich um den BIOS int 13h.
Die Funktion zum Sektorschreiben sieht ja folgendermaßen aus:


ah=03h
al=sektroanzahl
bx=offset buffer
dl=laufwerk
dh=kopf
cl=sektor
ch=spur


Nun will ich z.b. den Sektor 20 auf die FD schreiben.
Ich rechne dass dann in die CHS Nummer um, dann käme das hier raus:

dh=0
cl=2
ch=1

Aber da wird scheinbar irgendwas falsches geschrieben.
Denn die Dateigröße klettert von 11kb auf 20kb.
Es scheint also, als würden einige Sektoren übersprungen werden.

Der Code sieht dann im ganzen so aus:


mov ah,03h
mov al,1
mov ch,1
mov cl,3
mov dh,0
mov dl,0
mov bx,8000h
int 13h
add al,48
mov ah,0h
int 21h


Ich hab mir mal al Ausgeben lassen, um zu sehen, ob vielleicht mehr als ein Sektor geschrieben wird.
Aber es wird 1 ausgegeben.
Naja. Ich denke mir, dass ich vielleicht das falsch umrechne, aber wie macht mans richtig?

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #8 am: 02. January 2006, 00:24 »
Sektor 20? Also den 21sten Sektor (null ist der erste) oder wie?

Dann würde es so aussehen:

cl = 3 = Sektor3
ch = 0 = Spur0
dh = 1 = Seite1

Ich weiß nicht wie du auf deine Werte kommst, aber die sind total falsch.

bitmaster
In the Future everyone will need OS-64!!!

Biehler Productions

  • Beiträge: 51
    • Profil anzeigen
    • http://bielos.de.tk
Gespeichert
« Antwort #9 am: 02. January 2006, 10:20 »
Zitat von: bitmaster
Sektor 20? Also den 21sten Sektor (null ist der erste) oder wie?

Dann würde es so aussehen:

cl = 3 = Sektor3
ch = 0 = Spur0
dh = 1 = Seite1

Ich weiß nicht wie du auf deine Werte kommst, aber die sind total falsch.

bitmaster

Meinte den 20. Sektor ;)
Der 20. Sektor würde auf der Seite 1 liegen?
???
Für die Werte war ich zu faul, ne Berechnungsmethode im Net zu suchen und hab dann selber überlegungen gemacht.

Aber laut dem CHS Tutorial auf lowlevel sind es die Werte:

Zitat

Von LBA zu CHS:

Head = LBA_Sektor / (Kapazität / HeadAnzahl)
Temp = LBA_Sektor % (Kapazität / HeadAnzahl)
Cylinder = Temp / SectorsPerTrack
Sector = Temp % SectorsPerTrack + 1

Von CHS zu LBA:

LBA = (Head * (Kapazität / HeadAnzahl)) + (Cylinder * SectorsPerTrack) + (Sector + 1)


Head=20/(2880/2)=0
Temp=20 % (2880/2)=20
Cyl=20/18=1
Sec=20 % 18 + 1=3

Wie kommst du auf Seite 1?

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #10 am: 02. January 2006, 11:22 »
Hast du es denn ausprobiert? Also meins ist auf jeden Fall richtig. Wie die da im Tutorial rechnen und was die z.B. mit Kapazität meinen weiß ich nicht (Anzahl der Sektoren?). Die Rechnung ist sowieso viel zu groß und kompliziert als meine. Ich rechne so:

Sektoranzahl / SektorproSpur = Temp Rest+1=Sektor

Das wäre dann z.B. der Sektor. Du sagtest den 20sten Sektor? Also Sektor 19?

19/18 = 1 Rest = 1, 1+1=2 Sektor=2

Ich glaube in dem Tutorial beschreiben die, die Diskette falsch. Der 19te Sektor befindet sich auf Seite1 und der 37ste befindet sich wieder auf Seite0. Wenn du z.B. alle Sektoren einer Diskette auslesen willst, wird die Seite nicht zweimal gewechselt sondern 80mal. Die Diskette wechselt dann alle 18 Sektore die Seite.

;Die Zahlen in diesem Text beziehen sich auf einer 1,44 MByte Diskette.

PS: Ich würde an denen Ihrer Stelle kein Tutorial schreiben wenn ich davon keine Ahnung hätte.

bitmaster
In the Future everyone will need OS-64!!!

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 02. January 2006, 11:26 »
Folgende Formel benutze ich immer:

cylinder = lbaSector / 36
head = (lbaSector / 18) % 2
sector = lbaSector % 18 + 1


18 entspricht hier der Anzahl Sektoren pro Spur. 36 natürlich Anzahl Sektoren pro Spur mal Anzahl Köpfe.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #12 am: 02. January 2006, 12:12 »
Zitat von: elfish_rider
Folgende Formel benutze ich immer:

cylinder = lbaSector / 36
head = (lbaSector / 18) % 2
sector = lbaSector % 18 + 1


18 entspricht hier der Anzahl Sektoren pro Spur. 36 natürlich Anzahl Sektoren pro Spur mal Anzahl Köpfe.
Ja, das funktioniert zum Beispiel.
In the Future everyone will need OS-64!!!

Biehler Productions

  • Beiträge: 51
    • Profil anzeigen
    • http://bielos.de.tk
Gespeichert
« Antwort #13 am: 02. January 2006, 13:30 »
Zitat von: bitmaster
Hast du es denn ausprobiert? Also meins ist auf jeden Fall richtig. Wie die da im Tutorial rechnen und was die z.B. mit Kapazität meinen weiß ich nicht (Anzahl der Sektoren?). Die Rechnung ist sowieso viel zu groß und kompliziert als meine. Ich rechne so:

Klar ausprobiert, und es trat dann der beschriebene "Fehler" auf.
Ja, mit Kapazität meinen die die Anzahl an sektoren auf der Disk (2880).

Zitat

Sektoranzahl / SektorproSpur = Temp Rest+1=Sektor

Das wäre dann z.B. der Sektor. Du sagtest den 20sten Sektor? Also Sektor 19?

19/18 = 1 Rest = 1, 1+1=2 Sektor=2

thx. auch thx @ elfish
werd das mal heute abend ausprobieren

Zitat

Ich glaube in dem Tutorial beschreiben die, die Diskette falsch. Der 19te Sektor befindet sich auf Seite1 und der 37ste befindet sich wieder auf Seite0. Wenn du z.B. alle Sektoren einer Diskette auslesen willst, wird die Seite nicht zweimal gewechselt sondern 80mal. Die Diskette wechselt dann alle 18 Sektore die Seite.

Oha, das wusste ich nicht, ging auch leider nicht aus dem Tutorial hervor :(

Zitat

PS: Ich würde an denen Ihrer Stelle kein Tutorial schreiben wenn ich davon keine Ahnung hätte.

bitmaster

:mrgreen:

Da muss ich nun dank dem Tutorial meine gesamten Dateisystemfunktionen umschreiben :(

naja, zum Glück sinds erst 2
 :lol:

btw--> http://lowlevel.brainsware.org/index.php?pagename=tutorials&showtut_id=45
könnt natürlich auch sein, dass ich aus dem Tutorial den falschen Zusammenhang gezogen hab.

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 02. January 2006, 20:19 »
Zitat von: T0ast3r
ojemine...
hmmm...

Ich wusst nicht das jeder 19te Sektor wieder auf der anderen Seite leigt, nur das bei einer Diskette 18 Sektoren pro Spur Standart ist.

(...)


Ist eigentlich logisch, da die beiden Lese-/Schreibköpfe nicht unabhängig voneinander bewegt werden können. So kann das Lesen und Schreiben beschleunigt werden.

Leider wird das in den Tutorials viel zu wenig betont, ich habe das auch lange nicht gewusst.

Biehler Productions

  • Beiträge: 51
    • Profil anzeigen
    • http://bielos.de.tk
Gespeichert
« Antwort #15 am: 02. January 2006, 21:39 »
Zitat von: T0ast3r
ojemine...
hmmm...

Ich wusst nicht das jeder 19te Sektor wieder auf der anderen Seite leigt, nur das bei einer Diskette 18 Sektoren pro Spur Standart ist.

(...)


oh  mist, ich hätt dir ne Mail schreiben sollen, dass da eventuell ein Fehler drinne iss.
Sorry, aber bist ja trotzdem draufgekommen ;)

 

Einloggen