Interrupt 0x13
-
Welchen Compiler benutzt du? Turbo C++ hat beispielsweise ein biosdisk-Funktion, mit der das ganze noch einfacher geht (die ruft natürlich auch nur den Int 13h auf.)
-
geinlinedes asm is aber ein ganzes stückl kleiner und schneller...
mit asm oder __asm dürfte das kein problem sein, du musst in Ah die Funktionsnummer, in diesem Fall 0x02/02h für Sektor lesen stecken, die Register (weiß ich jetzt nicht ganz sicher, deshalb poste ich das lieber nicht!) musst du entsprechend mit paar MOVs füllen... anschließend musst du in ES:BX noch die adresse deines puffers reinschreiben, geht auch in einer C-Funktion ganz einfach:
void read_mbr (char * buffer) { ... asm mov bx,[buffer] asm mov ax,[buffer+2] asm mov es,ax ... }
setzt aber vorraus, dass char * ein far-zeiger ist (bei Borland gibts das, d.h. du kannst void read_mbr (char far * buffer) schreiben, ist aber kein standard...) das mit [buffer] und [buffer+2] hab ich möglicherweise verdreht, einfach ausprobieren
-
Vielen Dank.
Aber was meinst du mit far? Wor ist der unterschied far/near?
Wieso buffer+2?
-
der BIOS-Int braucht eine Segment und eine Offset-Adresse, da beide 16 Bit groß sind (obwohl die absolute Adresse in 20 Bit passen) muss man sowohl ES mit dem Segment bestücken, als auch in BX die Offset-Adresse des Puffers reinschreiben. Bei near zeigern wird vorrausgesetzt, dass das richtige Segment in DS steht, ist ja hier nicht der fall und außerdem benutzt das BIOS nicht DS... Deshalb musst du einen Far-Zeiger übergeben, wo auch die Seg-Adresse deines Puffers steht... Wenn du einen statischen, globalen Puffer hast, könntest du auch einfach DS in ES kopieren, ist aber u.U. gefährlich... [buffer+2] liefert den zweiten 16Bit-Int von dem Zeiger (der ja 32 Bit groß ist) in [buffer] steht die offset-adresse und in [buffer+2] die seg-adresse, bin mir aber wie gesagt nicht ganz sicher, ob ich das verdreht hab...
-
todo schrieb:
geinlinedes asm is aber ein ganzes stückl kleiner und schneller...
Das macht überhaupt nichts aus, wenn du danach eh auf die Festplatte warten musst. Zugriffszeiten sind meines Wissens immer noch im Millisekundenbereich, also einige Millionen Takte. Da sind die paar die du durch inline-Assembler sparst ein Witz. Manchmal muss man Prioritäten setzen.
-
Was mach ich denn falsch?
Es wird nichts eingelesen.void read_mbr(char far* mbr) { _asm { mov bx,[mbr] mov ax,[mbr+2] mov es,ax mov ah,0x02 ;Subfunktion mov al,0x01 ;Erster Sektor mov cx,0x01 mov dx,0x80 ;Erste Platte int 0x13 } } int main() { char X[512]; read_mbr(X); }
[edit]cpp-tag repariert[/edit]
-
da du aber auf die festplatte warten musst, NACHDEM du das zeug alles gemacht hast, wäre das REIN THEORETISCH von belang, ansonsten stimm ich dir da zu, auch wenns mir hier mehr ums prinzip ging, nicht speziell auf diese festplatten-op. beschränkt
-
Aber in meinen char-Array stehen nicht die Daten des MBR!! Wieso?
-
mov bx,[mbr] mov ax,[mbr+2] mov es,ax mov ah, 02 ; BIOS read sector function mov al, 01 ; read one sector mov ch, 01 ; Track to read mov cl, 02 ; Sector to read mov dh, 01 ; Head to read mov dl, 0x80 ; Drive to read int 0x13
(http://osdev.neopages.net/tutorials/loading_sectors.php?the_id=86)
warn paar fehler beim "ausfüllen" der register... wenn das jetzt nicht geht, dann probier noch mal, das mit [mbr] und [mbr+2] zu tauschen...
-
Nö, geht weder so noch so.
Es wird einfach nicht in das array geschrieben, kommt aber auch kein fehler oder sonstwas hoch ??
-
todo schrieb:
auch wenns mir hier mehr ums prinzip ging
Merkt man. Hauptsache mal ein Wenig die Assembler-Kenntnisse herumgezeigt, ob sinnvoll oder nicht :p
-
Welche Möglichkeit hab ich dann noch?
Aber es muss odch mit ASM funktionieren
-
Bashar schrieb:
todo schrieb:
auch wenns mir hier mehr ums prinzip ging
Merkt man. Hauptsache mal ein Wenig die Assembler-Kenntnisse herumgezeigt, ob sinnvoll oder nicht :p
was haben geinlineder asm und die möglichkeit mit int86 mit Assembler-Kenntnisse-Herumzeigen zu tun??
-
Jogy schrieb:
Welche Möglichkeit hab ich dann noch?
Aber es muss odch mit ASM funktionierenwas geht denn jetzt konkret nicht? stürzt er ab oder wie??
-
Nein stürtzt nicht ab und läuft ohne Fehler durch.
Aber irgendwie wird nichts in das char-array mbr geschrieben.
-
wie checkst du ab, ob was im puffer drinne ist??
probier ansonsten mal folgendes in deiner Funktion:
int off = FP_OFF(buffer); int segment = FP_SEG(buffer); asm mov bx,off asm mov ax,segment asm mov es,ax
-
Danke jetzt scheints zu funktionieren.
Aber wo ist genau er Unterschied?
-
FP_OFF und FP_SEG sind C-Makros, die jeweils die Segment oder Offset-Adresse eines Pointers zurückgeben... das mit dem [buffer] scheint wohl nicht immer zu funktionieren, bei mir hats immer geklappt