Interrupt 0x13
-
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