int25h
-
Hallo,
für Zugriff auf die Sektoren einer HD habe ich bisher immer den
Interrupt 13h benutzt, funktioniert soweit.
Die andere Methode über Interrupt 25h (Absolute disk read)
habe ich bisher nicht hinbekommen, obwohl ich die Register
richtig ausgefüllt habe (meine ich jedenfalls).
Hat schon jemand mal mit Int25h gearbeitet?
Bin dankbar für ein paar Tips.Gruss
pacc99
-
frag lieber nochmal im assambler forum nach!!!
p.s.:ich mach mich mal kundig
-
Naja wenn er über C/C++ auf diesen Interrupt zugreifen will ist das Assemblerforum wohl eher falsch.
Allerdings kann ich dir in dieser Sache nicht helfen da ich noch die so "low" auf eine Platte zugegriffen habe.
MfG SideWinder
-
Wenn ich mich recht entsinne, legen die Funktionen vom int25h zusätzliche Werte auf dem Stack ab. Diese müssen dann von einem Programm erst geladen werden - sprich: das aufrufende Programm muss den Stack-index erst wieder berichtigen. Deswegen ist es so schwer, von einem 'Hochsprachenprogramm' aus diese Funktionen aufzurufen.
Ich lese aber noch mal heute Abend in meinem PC-Intern nach und gebe dann bescheid.
EDIT: ich habe gerade eben dieses Listing gefunden. Dort einfach mal nach "int 25h" suchen...
-
mady schrieb:
Wenn ich mich recht entsinne, legen die Funktionen vom int25h zusätzliche Werte auf dem Stack ab. Diese müssen dann von einem Programm erst geladen werden - sprich: das aufrufende Programm muss den Stack-index erst wieder berichtigen. Deswegen ist es so schwer, von einem 'Hochsprachenprogramm' aus diese Funktionen aufzurufen.
Ich lese aber noch mal heute Abend in meinem PC-Intern nach und gebe dann bescheid.
nein auf bios interrupts zuzugreifen verhindert der protected mode wenn dir das was sagt ...
-
1ntrud0r schrieb:
...
nein auf bios interrupts zuzugreifen verhindert der protected mode wenn dir das was sagt ...Int25h ist kein BIOS-Interrupt sondern ein DOS-API-Call. "pacc99" fragte ausdrücklich nach _diesem_ Interrupt - ohne genauer sein OS oder sonstiges zu nennen. Ich habe darauf geantwortet und werde meine Antwort nochmals prüfen - wenn ich bessere Unterlagen zur Hand habe.
Dein Beitrag ist IMHO OT.
Greets
-
Hallo,
habe erst jetzt gesehen, dass noch Beiträge kamen.
Also, laut msdn soll int25h durch int21h Fn 440Dh
minor code 41h ersetzt werden, na ja.
Wahrscheinlich ist die Sektoradressierung einfacher
in assembler durchzuführen. Das folgende Beispiel
zeigt, dass es auch eingeschränkt mit C geht:
Benutzter Compiler: Pacific-C-Compiler (Freeware)
Warnung: Fehler können zu Datenverlust auf der Festplatte
führen!/* Pacific */ /* liest Bootsektor 01 der HD und speichert in "bs01.dat" */ #include <dos.h> #include <stdio.h> void main(void) { union REGS regs; FILE* file; char buffer[512]; int i; regs.h.ah = 0x02; /* Read */ regs.h.al = 0x01; /* Anzahl zu lesende Sektoren */ regs.h.ch = 0x00; /* low byte Cylindernummer (0-255) */ regs.h.cl = 0x01; /* Sektornummer (1-63), bit 6+7: hi 2bits Cylinder */ regs.h.dh = 0x00; /* Headnummer (0-255) */ regs.h.dl = 0x80; /* Drivenummer */ regs.x.bx = FP_OFF(buffer); /* Adressenoffset in bx */ int86(0x13, ®s, ®s); /* Int 13h aufrufen */ file = fopen("bs01.dat","wb"); /* binär schreiben */ for(i = 0; i < 512; i++) { putc(buffer[i], file); } fclose(file); printf("Sektor 01 in Datei <bs01.dat> geschrieben.\n"); }
Tip: bei eigenen Experimenten Test-Festplatte verwenden.
MfG
pacc99