Kapitel – 8
Disk-BIOS-Funktionen und Interrupt-Handling mit C
Einführung
In diesem Kapitel besprechen wir die wichtigen Funktionen des Disk-BIOS und andere wichtige Funktionen, die uns die Freiheit geben, Interrupts in unserem C-Programm auf einfache und kurze Weise zu verwenden und zu handhaben. Diese Funktionen bilden die Grundlage der Programmierung zur Datenwiederherstellung und Festplattenfehlerbehebung. Dies sind die Funktionen, die die Sprache C zu einer „Assemblersprache auf höherer Ebene “ machen .
Funktionen von biosdisk und _bios_disk
Diese beiden Funktionen sind für unsere Zwecke der Datenwiederherstellung und der Programmierung zur Festplattenfehlerbehebung am wichtigsten. Wir werden diese Funktionen die meiste Zeit nutzen.
Diese beiden Funktionen sind BIOS-Festplattenlaufwerkdienste und werden in bios.h definiert, wo biosdisk unterhalb der Dateiebene auf Rohsektoren arbeitet. Werden diese Funktionen auch nur bei der geringsten Unachtsamkeit verwendet, können sie den Inhalt von Dateien und Verzeichnissen auf Ihrer Festplatte zerstören. Sowohl die Funktion „Biosdisk“ als auch die Funktion „_bios_disk“ verwenden den Interrupt 0x13, um Festplattenvorgänge direkt an das BIOS weiterzuleiten. Die Funktion _bios_disk wird im Programm wie folgt deklariert:
unsigned _bios_disk(unsignierter Befehl, Struktur diskinfo_t *dinfo);
Und die Deklaration für die BIOS-Disk-Funktion sieht folgendermaßen aus:
int biosdisk(int cmd, int Laufwerk, int Kopf, int Spur,
int Sektor, int nsects, void *Puffer);
Die Bedeutung dieser Parameter wird in der folgenden Tabelle beschrieben:
Parameter |
Funktion |
Was ist es oder was macht es |
cmd |
Beide |
Gibt den auszuführenden Vorgang an, z. B. Lesen, Schreiben, Prüfen usw. (Siehe die Beschreibung von cmd unten) |
dinfo |
_bios_disk |
Zeigt auf eine diskinfo_t-Struktur, die die restlichen für den Vorgang erforderlichen Parameter enthält. (siehe die Beschreibung der diskinfo_t-Struktur weiter unten) |
Auto fahren |
BIOS-Disk |
Gibt an, welche Festplatte verwendet wird (0 für a:, 1 für b:, 0x80 für die erste physische Festplatte, 0x81 für die zweite usw.). |
Kopfflugbahnsektor
|
BIOS-Disk |
Sie definieren die Position des Startsektors, von dem aus die Operation beginnen soll. |
Insekten |
BIOS-Disk |
Anzahl der zu lesenden, zu schreibenden, zu prüfenden usw. Sektoren. |
Puffer |
BIOS-Disk |
Die Speicheradresse, von der Daten gelesen oder geschrieben werden sollen. |
In beiden Funktionen werden Daten gelesen und in einen Puffer von 512 Bytes pro Sektor geschrieben, was der logischen Sektorgröße der Festplatte entspricht, und der Rückgabewert beider Funktionen ist der Wert des AX-Registers, der durch den BIOS-Aufruf INT 0x13H festgelegt wurde.
Bei erfolgreicher Ausführung der Funktion ist das High-Byte = 0, was einen erfolgreichen Abschluss bedeutet, und das Low-Byte enthält die Anzahl der gelesenen, geschriebenen oder überprüften Sektoren usw.
Wenn jedoch ein Fehler auftritt und die Funktion nicht erfolgreich ausgeführt wird, entspricht der Wert des High-Bytes einem der folgenden Fehlercodes, die in der folgenden Tabelle beschrieben werden:
Wert |
Beschreibung |
0x00 |
Erfolgreicher Abschluss (kein Fehler!!) |
Nummer: |
Schlechtes Team |
Version: |
Adressaufkleber nicht gefunden |
Version: |
Versuch, auf eine schreibgeschützte Festplatte zu schreiben |
Version: |
Sektor nicht gefunden |
Version: |
Zurücksetzen fehlgeschlagen (Festplatte) |
Version: |
Die Festplatte wurde seit dem letzten Vorgang geändert. |
Version: |
Die Ausführung der Antriebsparameteraktion ist fehlgeschlagen. |
Version: |
DMA-Überlauf (Direct Memory Access) |
Version: |
Versuch, DMA über die 64K-Grenze auszuführen (Datengrenzfehler oder Sektoren >80H) |
Version: |
Fehlerhafter Sektor erkannt |
Version: |
Fehlerhafter Track erkannt |
0x0C |
Nicht unterstützter Titel |
Version: |
Falsche Sektorenanzahl beim Formatieren (PS/2-Festplatte) |
Version: |
Kontrolldaten-Adressmarkierung erkannt (Festplatte) |
Version: |
DMA-Schiedsgerichtsebene außerhalb des Bereichs (Festplatte) |
0 x 10 |
Falscher CRC/ECC beim Lesen der Festplatte |
Version: 0x11 |
CRC/ECC-Datenkorrekturfehler (kein wirklicher Fehler) |
0x20 |
Der Controller ist defekt |
Version: |
Es befindet sich kein Medium im Laufwerk (IBM/MS INT 13-Erweiterungen) |
Version: 0x32 |
Falscher Datenträgertyp im CMOS gespeichert (Compaq) |
0x40 |
Der Suchvorgang ist fehlgeschlagen. |
Version: 0x80 |
Anhang hat nicht reagiert |
Seriennummer: |
Datenträger nicht bereit (nur Festplatte) |
OS-Version: |
Das Volume ist nicht an die Festplatte gebunden (INT 13-Erweiterungen) |
OS-Nummer: |
Auf Festplatte gesperrtes Volume (INT 13-Erweiterungen) |
OS-Version: |
Nicht entfernbares Volume (INT 13-Erweiterungen) |
OS-Version: |
Nutzungsvolumen (INT 13 Erweiterungen) |
OS-Version: |
Anzahl Sperren überschritten (INT 13 Erweiterungen) |
OS-Version: |
Eine gültige Throw-Anforderung konnte nicht ausgeführt werden (INT-Erweiterungen 13) |
OS-Nummer: |
Ein nicht näher bezeichneter Fehler ist aufgetreten (nur Festplatte) |
Versionsnummer: |
Es ist ein Aufzeichnungsfehler aufgetreten |
Version: |
Statusregisterfehler |
Versionsnummer |
Operation Sense ist fehlgeschlagen |
In der nachfolgenden Tabelle sind die Betriebsbefehle aufgeführt, die mit dem Parameter cmd ausgeführt werden sollen. Schauen wir uns zunächst die allgemeine Funktionsweise beider Funktionen an.
BIOS-Disk |
_bios_disk |
Was macht er? |
0 |
_DISK_RESET |
Setzt das Festplattensystem zurück und zwingt den Laufwerkscontroller zu einem Kaltstart. Alle anderen Parameter werden ignoriert. |
1 |
_DISK_STATUS |
Gibt den Status der letzten Festplattenoperation zurück. Ignoriert alle anderen Parameter |
2 |
_DISK_READ |
Liest einen oder mehrere Festplattensektoren in den Speicher |
3 |
_DISK_WRITE |
Schreibt einen oder mehrere Festplattensektoren aus dem Speicher |
4 |
_DISK_VERIFY |
Verifiziert einen oder mehrere Sektoren |
5 |
_DISK_FORMAT |
Formatiert einen Track |
Sie können zwar entweder cmd = 0, 1, 2, 3, 4,5 oder cmd = _DISK_RESET, _DISK_STATUS, _DISK_READ, _DISK_WRITE, _DISK_VARIFY, _DISK_FORMAT verwenden und beide Optionen haben dieselbe Wirkung. Es wird jedoch empfohlen, dass Sie sich angewöhnen, Wortoptionen wie cmd = _DISK_FORMAT anstelle von cmd = 5 zu verwenden, da Sie so Fehler vermeiden können, die auftreten können, wenn Sie eine falsche Befehlsnummer für cmd eingegeben haben.
Wenn wir in der Deklaration der Funktion biosdisk oder _bios_disk cmd = _DISK_RESET angeben, setzt die Funktion das Festplattensystem zurück, indem sie alle anderen Parameter ignoriert, und _DISK_STATUS gibt den Status des letzten Festplattenvorgangs zurück, wobei alle anderen Parameter ignoriert werden.
Für cmd =_DISK_READ, _DISK_WRITE oder _DISK_VERIFY (2, 3 oder 4) verwenden die Funktionen biosdisk und _bios_disk auch andere, unten gezeigte Parameter:
Parameter |
Was es bewirkt |
Kopfspursektor
|
Diese drei geben den Speicherort des Startsektors für den angegebenen Vorgang an. (Die minimal möglichen Werte sind Kopf = 0, Spur = 0 und Sektor = 1.) |
Sektoren |
Dies gibt die Anzahl der zu lesenden oder zu schreibenden Sektoren an |
Puffer |
Es zeigt auf den Puffer, in dem Daten gelesen und geschrieben werden sollen |
Wenn der Wert von cmd = 5 (_DISK_FORMAT) ist, verwenden biosdisk und _bios_disk die folgenden Parameter gemäß der Beschreibung in der Tabelle. Es wird immer empfohlen, dass Sie bei der Verwendung von _DISK_FORMAT vorsichtig sind und wissen, was Sie tun. Mangelndes Wissen oder sogar ein kleiner Fehler können zu einem großen Datenverlust führen.
Parameter |
Was es bewirkt |
Kopfspur
|
Diese geben den Speicherort des zu formatierenden Titels an |
Puffer |
Es verweist auf eine Tabelle mit Sektor-Headern, die auf die benannte Spur geschrieben werden sollen. |
Es gibt einige zusätzliche cmd-Werte, die nur von Biosdisk-Funktionen verwendet werden. Diese cmd-Werte sind nur für XT, AT, PS/2 und kompatible Geräte zulässig. Die Werte werden in der folgenden Tabelle beschrieben:
cmd |
Was es bewirkt |
6 |
Formatiert einen Track und setzt Flags für fehlerhafte Sektoren |
7 |
Formatiert das Laufwerk beginnend bei einer bestimmten Spur |
8 |
Gibt die aktuellen Antriebsparameter in den ersten 4 Bytes des Puffers zurück |
9 |
Initialisiert Laufwerkspaareigenschaften |
10 |
Führt einen langen Lesevorgang aus (512 plus 4 zusätzliche Bytes pro Sektor) |
11 |
Führt einen langen Schreibvorgang aus (512 plus 4 zusätzliche Bytes pro Sektor) |
12 |
Sucht eine Platte |
13 |
Alternativer Festplattenreset |
14 |
Liest Sektorpuffer |
15 |
Schreibt Sektorpuffer |
16 |
Testet, ob das benannte Laufwerk bereit ist |
17 |
Kalibriert das Laufwerk neu |
18 |
Controller-RAM-Diagnose |
19 |
Laufwerksdiagnose |
20 |
Controllerinterne Diagnose |
diskinfo_t-Struktur
Die Struktur diskinfo_t wird von der Funktion _bios_disk verwendet. Die Beschreibung der Struktur lautet wie folgt:
Struktur diskinfo_t {
unsigniertes Laufwerk, Kopf, Spur, Sektor, nSektoren;
void weit *Puffer;
};
Dabei gibt Laufwerk das zu verwendende Laufwerk an. Denken Sie immer daran, dass bei Festplatten das physische Laufwerk angegeben wird, nicht die Festplattenpartition. Wenn Sie Partitionen verwenden möchten, muss das Anwendungsprogramm auch die Partitionstabelleninformationen dieser Festplatte selbst interpretieren.
Die Werte von head, track und sector geben den Speicherort des Startsektors für die Operation an. nsectors gibt die Anzahl der zu lesenden oder zu schreibenden Sektoren an und buffer verweist auf den Puffer, in dem Daten gelesen und geschrieben werden. Abhängig vom Wert von cmd werden die anderen Parameter in der diskinfo_t-Struktur möglicherweise benötigt oder nicht.
Der Wert für die Spezifikation des Festplattenlaufwerks, der in den Funktionen „biosdisk“ und „_bios_disk“ verwendet werden soll, ist in der folgenden Tabelle angegeben:
Antriebswert |
Zu verwendendes Laufwerk |
0 |
Erstes Diskettenlaufwerk |
1 |
Zweites Diskettenlaufwerk |
2 |
Drittes Diskettenlaufwerk |
.... |
(und so weiter) |
Version: 0x80 |
Erstes Festplattenlaufwerk |
OS-Nummer: |
Zweites Festplattenlaufwerk |
OS-Version: |
Drittes Festplattenlaufwerk |
.... |
(und so weiter) |
Genug der Theorie! Sehen wir uns nun einige praktische Dinge und einige Beispiele dieser Funktionen an. Das folgende Beispiel liest die Sektoren auf beiden Seiten der vier Spuren der Diskette und speichert den Inhalt in der vom Benutzer angegebenen Datei. Es spielt keine Rolle, ob Sie die Dateien von Ihrer Festplatte gelöscht haben, da das Programm direkt die Oberfläche der Festplatte liest.
Um die gelöschten Daten anzuzeigen, nehmen Sie am besten eine vollständig formatierte Diskette und kopieren einige Textdateien, z. B. den Code Ihres .c-Programms oder andere Textdateien (damit Sie den Inhalt der Dateien verstehen), die ungefähr 73 KB belegen (Daten werden in vier Spuren, zwei Seiten und 18 Sektoren in jeder Spur gespeichert. Jeder Sektor ist 512 Byte groß). Das Programm wurde entwickelt, um das Beispiel zu demonstrieren. Sie können es jedoch ändern und weiterentwickeln, um Daten wiederherstellen zu können.
/* Programm zum Lesen von 4 Spuren (0, 1, 2 und 3) einer Diskette und Schreiben des Inhalts in die angegebene Datei */
#include <bios.h>
#include <stdio.h>
#include<conio.h>
Leere Haupt(Leere)
{
int Kopf, Spur;
int Ergebnis,i,Sektor;
char Dateiname[80];
char *Puffer;
Struktur diskinfo_t dinfo;
statisches Zeichen dbuf[512];
DATEI *tt;
clrscr();
/// Prüfen, ob das Laufwerk bereit ist oder nicht \\\
wenn(!(biosdisk(4,0,0,0,0,1,buffer) & 0x02))
{
printf(" Laufwerk A: Nicht bereit:\n Diskette in Laufwerk A einlegen:
und drücke eine beliebige Taste\n");
getch();
}
/* Holen Sie sich den Dateinamen, um die Daten der Sektoren der Festplatte zu speichern */
printf("\nGeben Sie den Zieldateinamen mit vollständigem Pfad ein
um die Daten zu speichern \n\n >");
bekommt(Dateiname);
wenn((tt= fopen(Dateiname, "wb"))==NULL)
{
printf("Datei konnte nicht geöffnet werden!!!");
getch();
}
für (Spur = 0; Spur < 4; Spur ++)
{
für (Kopf = 0; Kopf <= 1; Kopf ++)
{
für (Sektor = 1; Sektor <= 18; Sektor ++)
{
dinfo.drive = 0; /* Laufwerksnummer für A: */
dinfo.head = head; /* Festplattenkopfnummer */
dinfo.track = Titel; /* Titelnummer */
dinfo.sector = Sektor; /* Sektornummer */
dinfo.nsectors = 1; /* Sektorenanzahl */
dinfo.buffer = dbuf; /* Datenpuffer */
/// Den Status anzeigen \\\
gotoxy(10,10); printf("Daten werden gelesen von: Head=%d
Spur=%d Sektor=%d",
Kopf, Spur, Sektor);
fprintf(tt,"\n Daten gelesen von: Kopf=%d Spur=%d Sektor=%d\n",
Kopf, Spur, Sektor);
/// Die angegebenen Sektoren lesen \\\
Ergebnis = _bios_disk(_DISK_READ, &dinfo);
/// Den Inhalt in der angegebenen Datei speichern \\\
wenn ((Ergebnis & 0xff00) == 0)
{
für (i = 0; i < 512; i++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* Fehlermeldung auf dem Bildschirm und in der Datei für „Fehler beim Lesen eines Sektors“ drucken */
anders
{
printf("\n Kann nicht lesen bei Head= %d Track= %d
Sektor= %d\n",Kopf,Spur,Sektor);
fprintf(tt,"\n Kann nicht lesen bei Head= %d Track= %d
Sektor =%d\n",Kopf,Spur,Sektor);
}
}
}
}
fclose(tt);
}
Das Beispiel zeigt die Verwendung der Funktionen biosdisk und _bios_disk. Die Funktion biosdisk prüft, ob die Festplatte bereit ist oder nicht und ob eine Adressmarkierung gefunden wurde. Die Funktion _bios_disk liest die Sektoren beider Seiten bis zu vier Spuren.
Die Reihenfolge des Lesens (oder Schreibens) auf der Oberfläche der Platte sollte wie folgt sein:
absread- und abswrite-Funktionen
Diese Funktionen wurden in Dos.h definiert . Die Funktion absread liest absolute Festplattensektoren und die Funktion abswrite schreibt absolute Festplattensektoren. Die Funktion absread verwendet den DOS-Interrupt 0x25, um bestimmte Festplattensektoren zu lesen, und die Funktion abswrite verwendet den DOS-Interrupt 0x26, um bestimmte Festplattensektoren zu schreiben.
Absolute Lese- oder Schreibvorgänge erfolgen sequenziell durch schrittweises Erhöhen der Sektoren und sind völlig unabhängig von Kopf- und Spurnummern usw. Es ist die Aufgabe des BIOS des Computers, die absoluten Sektoren in die jeweiligen Spur-, Kopf- und Sektornummern zu übersetzen.
Absolute Lese- und Schreibvorgänge werden in solchen Programmen empfohlen, in denen wir Lese-/Schreibvorgänge auf der gesamten Festplatte durchführen und zusätzliche Codierung und Schleifen in unserem Programm vermeiden möchten, um die Programmgeschwindigkeit auf das Höchstmaß zu erhöhen.
Die beiden Funktionen absread und abswrite ignorieren die logische Struktur einer Festplatte und achten nicht auf Dateien, FATs oder Verzeichnisse. Diese Funktionen führen absolute Lese- und Schreibvorgänge direkt auf der Oberfläche der Festplatte aus. Aus diesem Grund kann abswrite bei unsachgemäßer Verwendung Dateien, Verzeichnisse und FATs überschreiben.
Die Deklaration der absread-Funktion lautet wie folgt:
int absread(int Laufwerk, int nsects, long lsect,
void *Puffer);
und die Funktion abswrite wird wie folgt deklariert:
int abswrite(int Laufwerk, int nsects, long lsect,
void *Puffer);
Dabei haben die Parameter folgende Bedeutung:
Param. |
Was es ist/tut |
fahren |
Laufwerksnummer zum Lesen (oder Schreiben): 0 = A, 1 = B usw. |
Insekten |
Anzahl der zu lesenden (oder zu schreibenden) Sektoren |
lsekt |
Beginnende logische Sektornummer |
Puffer |
Speicheradresse, an der die Daten gelesen (oder geschrieben) werden sollen |
Bei Erfolg geben beide Funktionen 0 zurück. Wenn ein Fehler auftritt, geben beide -1 zurück und setzen die Fehlernummer auf den Wert des AX-Registers, das vom Systemaufruf zurückgegeben wurde.
Die Anzahl der Sektoren für Lese- oder Schreibvorgänge ist auf 64 KB oder die Größe des Puffers begrenzt, je nachdem, welcher Wert kleiner ist. In den nächsten Kapiteln lernen wir jedoch, wie man großen Speicher verwendet, um die Speichergrenze von 64 KB zu überschreiten und ein sehr schnelles Programm zu entwickeln.
|
Interrupt-Behandlung mit C
C wird manchmal als Assemblersprache auf hohem Niveau bezeichnet, da es mithilfe einiger seiner definierten Funktionen verschiedene Interrupts aufrufen kann. Einige wichtige Funktionen sind die folgenden:
- int86: Ruft MS-DOS-Interrupts auf.
- int86x: Ruft MS-DOS-Interrupt mit Segmentregisterwerten auf.
- intdos: ruft den MS-DOS-Dienst unter Verwendung anderer Register als DX und AL auf
- intdosx: ruft den MS-DOS-Dienst mit Segmentregisterwerten auf.
- segread: Liest Segmentregister
Wir werden diese Funktionen im Detail besprechen. Zunächst besprechen wir einige vordefinierte Strukturen und Vereinigungen, die häufig oder notwendigerweise mit diesen Funktionen verwendet werden.
SREGS-Struktur
Diese Struktur wurde in dos.h definiert und ist eine Struktur der Segmentregister, die an die Funktionen int86x, intdosx und segread übergeben und von ihnen ausgefüllt werden. Die Deklaration der Struktur lautet wie folgt:
Struktur SREGS {
vorzeichenlose Ganzzahlen;
vorzeichenlose Ganzzahl cs;
vorzeichenlose Ganzzahl ss;
vorzeichenlose Ganzzahl ds;
};
REGS-Gewerkschaft
REGS ist die Vereinigung zweier Strukturen. Die Vereinigung REGS wurde in dos.h definiert und wird verwendet, um Informationen an die Funktionen int86, int86x, intdos und intdosx zu übergeben und von diesen zu empfangen. Die Deklaration der Vereinigung lautet wie folgt:
Gewerkschaftsreglemente {
Struktur WORDREGS x;
Struktur BYTEREGS h;
};
BYTEREGS- und WORDREGS-Strukturen
Die BYTEREGES- und WORDREGS-Strukturen wurden in dos.h definiert und werden zum Speichern von Byte- und Wortregistern verwendet. Die WORGREGS-Struktur ermöglicht dem Benutzer den Zugriff auf die CPU-Register als 16-Bit-Mengen, während die BYTEREGES-Struktur den Zugriff auf die einzelnen 8-Bit-Register ermöglicht.
Die BITEREGS-Struktur wird wie folgt deklariert:
Struktur BYTEREGS {
vorzeichenloses Zeichen al, ah, bl, bh;
vorzeichenloses Zeichen cl, ch, dl, dh;
};
Und die WORDREGS-Struktur wird wie folgt deklariert:
Struktur WORDREGS {
vorzeichenlose Ganzzahl ax, bx, cx, dx;
vorzeichenloses int ja, von, cflag, Flags;
};
int86- und int86x-Funktionen
Diese Funktionen sind die allgemeinen 8086-Software-Interrupt-Schnittstellen, die in dos.h definiert sind. Register werden auf die gewünschten Werte gesetzt und diese Funktionen werden aufgerufen, um die MS-DOS-Interrupts aufzurufen. Die Deklaration der int86-Funktion lautet wie folgt:
int int86(int intno, union REGS *inregs,
Gewerkschaftsreglemente *Outregs);
int86x ist die Variante der int86-Funktion. Sie wird wie folgt deklariert:
int int86x(int intno, union REGS *inregs,
Gewerkschafts-REGS *Outregs, Struktur-SREGS *Segregs);
Sowohl die Funktion int86 als auch die Funktion int86x führen einen 8086-Software-Interrupt aus, der durch das Argument intno angegeben wird. Oder wir können sagen, dass der zu generierende Interrupt durch intno angegeben wird.
Mit der Funktion int86x ist der Zugriff nur auf ES und DS möglich, nicht aber auf CS und SS. Sie können daher einen 8086-Software-Interrupt auslösen, der einen anderen DS-Wert als das Standarddatensegment annimmt und/oder ein Argument in ES annimmt.
Diese Funktionen kopieren Registerwerte aus inregs in die Register, bevor der Software-Interrupt ausgeführt wird. Die Funktion int86x kopiert auch die Werte von segregs->ds und segregs->es in die entsprechenden Register, bevor der Software-Interrupt ausgeführt wird. Mit dieser Funktion können Programme, die Far-Pointer oder ein großes Datenspeichermodell verwenden, angeben, welches Segment für den Software-Interrupt verwendet werden soll.
Die Funktionen kopieren die aktuellen Registerwerte in Outregs, den Status des Carry-Flags in das Feld x.cflag in Outregs und den Wert des 8086-Flags-Registers in das Feld x.flags in Outregs, nachdem der Software-Interrupt zurückgekehrt ist. Die Funktion int86x stellt außerdem DS wieder her und setzt die Felder segregs->es und segregs->ds auf die Werte der entsprechenden Segmentregister.
In beiden Funktionen können Inregs und Outregs auf dieselbe Struktur zeigen und beide Funktionen geben den Wert von AX nach Abschluss des Software-Interrupts zurück. Wenn das Carry-Flag gesetzt ist, zeigt dies normalerweise an, dass ein Fehler aufgetreten ist.
Die in C verwendeten REGS-Union-Elemente, die der Assemblersprache entsprechen, sind in der folgenden Tabelle aufgeführt:
16 Bit |
8 Bit |
C-Sprache |
Assemblersprache |
C-Sprache |
Assemblersprache |
inregs.x.ax |
AXT |
inregs.h.al |
AL |
|
|
inregs.h.ah |
AH |
inregs.x.bx |
BX |
inregs.h.bl |
BL |
|
|
inregs.h.bh |
BH |
inregs.x.cx |
Kundenerfahrung |
inregs.h.cl |
CL |
|
|
inregs.h.ch |
CH |
inregs.x.dx |
DX |
inregs.h.dl |
DL |
|
|
inregs.h.dh |
DH |
inregs.x.si |
UND |
|
|
inregs.x.of |
AUS |
|
|
inregs.x.cflag |
CF |
|
|
Sehen wir uns die Beispiele der Funktionen int86 und int86x an. Das folgende Programm scannt jeden Sektor der Diskette und druckt den Status jedes Sektors auf dem Bildschirm aus.
/* Programm zum Scannen aller Sektoren der Diskette und Drucken des Status */
#include<dos.h>
#include<conio.h>
void main()
{
int Kopf, Spur, Sektor, i;
char *buf;
Gewerkschaftsreglemente, Inregs, Outregs;
Struktur SREGS sregs;
clrscr();
/// Initialisierung der Festplatte durch Zurücksetzen des Festplattensystems \\\
gotoxy(10,2); printf("Datenträger wird initialisiert...");
für (i = 0; i < 3; i++)
{
inregs.h.ah=0x00; // Funktionsnummer
inregs.h.dl=0x00; // Diskette
int86(0x13,&Eingänge,&Ausgänge);
}
gotoxy(10,2); printf("Der Status der Festplatte ist wie....\n");
/* Scanne die Diskette von 0 bis 79 Spuren (insgesamt 80 Spuren) */
für (Spur=0;Spur<=79;Spur++)
für (Kopf=0;Kopf<=1;Kopf++)
für (Sektor = 1; Sektor <= 18; Sektor ++)
{
inregs.h.ah = 0x04; /// Funktion Nummer
inregs.h.al = 1; /// Anzahl der Sektoren
inregs.h.dl = 0x00; /// Diskette
inregs.h.ch = verfolgen;
inregs.h.dh = Kopf;
inregs.h.cl = Sektor;
inregs.x.bx = FP_OFF(buf);
sregs.es = FP_SEG(buf);
int86x(0x13,&inregs,&outregs,&sregs);
//// Den Status des gescannten Sektors drucken \\\\
Schalter (outregs.h.ah)
{
Fall 0x00:
cprintf("STATUS: Kein Fehler !!");
brechen;
Fall 0x01:
cprintf("STATUS: Ungültiger Befehl ");
brechen;
Fall 0x02:
cprintf("STATUS: Adressmarke nicht gefunden ");
brechen;
Fall 0x03:
cprintf("STATUS: Versuch, zu schreiben in
schreibgeschützte Festplatte ");
brechen;
Fall 0x04:
cprintf("STATUS: Sektor nicht gefunden ");
brechen;
Fall 0x05:
cprintf("STATUS: Zurücksetzen fehlgeschlagen (Festplatte) ");
brechen;
Fall 0x06:
cprintf("STATUS: Datenträger geändert seit dem letzten
Betrieb ");
brechen;
Fall 0x07:
cprintf("STATUS: Antriebsparameteraktivität
fehlgeschlagen") ;
brechen;
Fall 0x08:
cprintf("STATUS: Direkter Speicherzugriff (DMA)
überlaufen ");
brechen;
Fall 0x09:
cprintf("STATUS: Versuch, DMA durchzuführen über
64K-Grenze ");
brechen;
Fall 0x0A:
cprintf("STATUS: Fehlerhafter Sektor erkannt ");
brechen;
Fall 0x0B:
cprintf("STATUS: Fehlerhafte Spur erkannt ");
brechen;
Fall 0x0C:
cprintf("STATUS: Medientyp nicht gefunden ");
brechen;
Fall 0x0D:
cprintf("STATUS: Ungültige Anzahl von Sektoren auf
formatieren (Festplatte) ");
brechen;
Fall 0x0E:
cprintf("STATUS: Kontrolldaten-Adressmarkierung
erkannt (Festplatte) ");
brechen;
Fall 0x0F:
cprintf("STATUS: DMA-Schiedsgerichtsbarkeitsebene außerhalb
Bereich (Festplatte) ");
brechen;
Fall 0x10:
cprintf("STATUS: Falscher CRC/ECC beim Lesen der Festplatte ");
brechen;
Fall 0x11:
cprintf("STATUS: CRC/ECC korrigierter Datenfehler ");
brechen;
Fall 0x20:
cprintf("STATUS: Controller ist ausgefallen ");
brechen;
Fall 0x31:
cprintf("STATUS: Kein Medium im Laufwerk (IBM/MS INT 13H
Erweiterungen) ");
brechen;
Fall 0x32:
cprintf("STATUS: Falscher Laufwerkstyp gespeichert in
CMOS (Compaq) ");
brechen;
Fall 0x40:
cprintf("STATUS: Suchvorgang fehlgeschlagen ");
brechen;
Fall 0x80:
cprintf("STATUS: Anhang konnte nicht antworten
(Datenträger-Zeitüberschreitung) ");
brechen;
Fall 0xAA:
cprintf("STATUS: Laufwerk nicht bereit (Festplatte
nur) ");
brechen;
Fall 0xB0:
cprintf("STATUS: Datenträger im Laufwerk nicht gesperrt (INT
13H-Erweiterungen) ");
brechen;
Fall 0xB1:
cprintf("STATUS: Datenträger im Laufwerk gesperrt (INT 13H-Erweiterungen) ");
brechen;
Fall 0xB2:
cprintf("STATUS: Datenträger nicht entfernbar (INT 13H
Erweiterungen) ");
brechen;
Fall 0xB3:
cprintf("STATUS: Datenträger im Einsatz (INT 13H
Erweiterungen) ");
brechen;
Fall 0xB4:
cprintf("STATUS: Anzahl der Sperren überschritten (INT 13H
Erweiterungen) ");
brechen;
Fall 0xB5:
cprintf("STATUS: Gültige Auswurfanforderung fehlgeschlagen (INT
13H-Erweiterungen) ");
brechen;
Fall 0xBB:
cprintf("STATUS: Undefinierter Fehler aufgetreten (hard
nur Festplatte) ");
brechen;
Fall 0xCC:
cprintf("STATUS: Schreibfehler aufgetreten ");
brechen;
Fall 0xE0:
cprintf("STATUS: Statusregisterfehler ");
brechen;
Fall 0xFF:
cprintf("STATUS: Sense-Operation fehlgeschlagen ");
brechen;
Standard: cprintf("STATUS: UNBEKANNTER Statuscode ");
}
printf("\nAktuelle Position= Spur:%d Kopf:%d Sektor:%d \n",
Spur, Kopf, Sektor);
}
gotoxy(10,24);printf("Scannen abgeschlossen!! Drücken Sie eine beliebige Taste, um
Ausfahrt..");
getch();
}
Das Programm zeigt das Anwendungsbeispiel der Funktionen int86 und int86x. In diesem Programm initialisiert die Funktion int86 die Festplatte durch Zurücksetzen des Festplattensystems mithilfe der Funktion 00H von INT 13H. Die Funktion int86x überprüft jeden Sektor der Diskette (1,44 MB, 3½ Diskette) von beiden Seiten, bis zu 0 bis 79 Spuren (insgesamt 80 Spuren), mithilfe der Funktion 04H von INT 13H.
segread-Funktion
Diese Funktion wurde in dos.h definiert. Diese Funktion liest die Segmentregister. Die Deklaration der Funktion lautet wie folgt:
void segread(struct SREGS *segp);
wobei segread die aktuellen Werte der Segmentregister in die Struktur *segp einträgt. Die Funktion gibt nichts zurück und der Aufruf ist für die Verwendung mit intdosx und int86x gedacht. Sehen wir uns ein Beispiel an
#include <stdio.h>
#include <dos.h>
void main()
{
SREGS-Segmente strukturieren;
segread(&segs);
printf("Aktuelle Segmentregistereinstellungen\n\n");
printf("CS: %X DS: %X\n", segs.cs, segs.ds);
printf("ES: %X SS: %X\n", segs.es, segs.ss);
getch();
}
Und die Ausgabe des Programms wird ungefähr so aussehen:
Aktuelle Segmentregistereinstellungen
CS: EED DS: 10BA
ES: 10BA SS: 10BA
intdos- und intdosx-Funktionen
Diese Funktionen wurden in dos.h definiert. Dies sind die allgemeinen DOS-Interruptschnittstellen. Die Funktion intdos ruft MS-DOS-Dienstregister und dann DX und AL auf, während die Funktion intdosx den MS-DOS-Dienst mit Segmentregisterwerten aufruft.
Die Deklaration der intdos-Funktion lautet wie folgt:
int intdos(Union REGS *inregs, Union REGS *outregs);
und die Deklaration der Intdosx-Funktion lautet:
int intdosx(union REGS *inregs, union REGS *outregs,
Struktur SREGS *segregs);
Die Funktionen intdos und intdosx führen den DOS-Interrupt 0x21 aus, um eine bestimmte DOS-Funktion aufzurufen. Der Wert von inregs->h.ah gibt die aufzurufende DOS-Funktion an. Die Funktion intdosx kopiert außerdem die Werte von segregs ->ds und segregs ->es in die entsprechenden Register, bevor sie die DOS-Funktion aufruft, und stellt dann DS wieder her.
Mit dieser Funktion können Programme, die Fernzeiger oder ein großes Datenspeichermodell verwenden, angeben, welches Segment für die Funktionsausführung verwendet werden soll. Mit der Funktion intdosx können Sie eine DOS-Funktion aufrufen, die einen anderen DS-Wert als das Standarddatensegment annimmt und/oder ein Argument in ES annimmt.
Beide Funktionen geben nach Abschluss des DOS-Funktionsaufrufs den Wert von AX zurück und wenn das Carry-Flag gesetzt ist (outregs -> x.cflag != 0), zeigt dies an, dass ein Fehler aufgetreten ist.
Nachdem der Interrupt 0x21 zurückgegeben wurde, kopieren die Funktionen die aktuellen Registerwerte in Outregs, den Status des Carry-Flags in das Feld x.cflag in Outregs und den Wert des 8086-Flags-Registers in das Feld x.flags in Outregs. Sowohl Inregs als auch Outregs können auf dieselbe Struktur verweisen. Sehen wir uns die Beispiele dieser Funktionen an.
Nachfolgend ist ein Beispiel für die Verwendung der Intdos-Funktion aufgeführt. Dieses Programm erhält die ausgewählten Informationen über das Diskettenlaufwerk (1,44 MB, 3½ Zoll). Dieses Programm stellt die Zuordnungsinformationen einer Diskette bereit.
/* Informationen zur Laufwerkszuordnung für die Datenträgernutzung abrufen */
#include <dos.h> /* für intdos() und Union REGS */
#include <stdio.h> /* für printf() */
Gewerkschaftsreglemente, Inregs, Outregs;
void main()
{
inregs.h.ah = 0x36; /* freien Speicherplatz auf der Festplatte abrufen
Funktionsnummer */
inregs.h.dl = 0x01; /* Laufwerk A: */
intdos(&inregs, &outregs);
printf("%d Sektoren/Cluster,\n%d Cluster,\n%d Bytes/Sektor,
\n%d Cluster insgesamt",
outregs.x.ax,outregs.x.bx,
outregs.x.cx, outregs.x.dx);
getch();
}
Die Ausgabe des Programms sieht folgendermaßen aus:
1 Sektoren/Cluster,
1933 Cluster,
512 Bytes/Sektor,
2843 Cluster insgesamt
Sehen wir uns nun ein Beispiel der Funktion intdosx an . Das folgende Beispiel zeigt die Verwendung der Funktion intdosx . Das Programm gibt einen String an die Standardausgabe aus.
/* Das Programm zur Ausgabe von „String“ auf der Standardausgabe. */
#include <dos.h>
Gewerkschaftsreglemente, Inregs, Outregs;
SREGS-Segregationen strukturieren;
char far *string = "Dieser String ist nicht im
Standarddatensegment$";
void main()
{
inregs.h.ah = 0x09; /* Funktionsnummer */
inregs.x.dx = FP_OFF(string);/*DS:DX ist weit
Adresse von 'Zeichenfolge */
segregs.ds = FP_SEG(Zeichenfolge);
intdosx(&inregs, &outregs, &segregs);
getch();
}
Und die Ausgabe des Programms sieht wie folgt aus:
Diese Zeichenfolge befindet sich nicht im Standarddatensegment |
Hier drucken wir den angegebenen String mit der Funktion intdosx, durch Funktion 09H von INT 21H. Es sollte immer beachtet werden, dass der angegebene String immer mit dem Zeichen „$“ enden sollte.
So ermitteln Sie die physische Festplattennummer
Die physische Festplattennummer ist sehr wichtig und muss genau angegeben werden. Eine ungültige Laufwerksspezifikation kann zu einem erheblichen Datenverlust führen. Wir müssen uns bei der Datenwiederherstellung oder der Festplattenfehlerbehebung auf die Laufwerksnummer verlassen können. Wie Sie die Laufwerksnummer einer beliebigen Festplatte mit unterschiedlicher Festplattenanordnung ermitteln, können Sie anhand der folgenden Beispiele abschätzen.
Einem sehr verbreiteten Mythos zufolge richten sich die physischen Laufwerksnummern nach dem Anschlussstatus der Festplatte. In manchen Sonderfällen kann es jedoch auch vom Startvorgang oder den Starteinstellungen Ihres Betriebssystems abhängen.
Hier wurde die allgemeinste Vorstellung der vom BIOS bereitgestellten physischen Laufwerksnummer gegeben, aber selbst dann müssen Sie die Konfiguration des Laufwerks mithilfe eines beliebigen Laufwerkbearbeitungstools oder mit den in den nächsten Kapiteln angegebenen Programmen bestätigen. Nachdem Sie sich vergewissert haben, sollten Sie eine Entscheidung über die Ausführung solcher Programme treffen, die die Daten beschädigen oder beschädigen können, wenn sie illegal oder ohne Wissen verwendet werden.
Wenn zwei Festplatten an das System angeschlossen sind und eine die primäre Master- und die andere die sekundäre Master-Festplatte ist, wird in der Regel zuerst die primäre Master-Festplatte (und dann die primäre Slave-Festplatte, sofern verfügbar) und dann die sekundäre Master-Festplatte (und dann die sekundäre Slave-Festplatte, sofern verfügbar usw.) bevorzugt und die physische Nummer wird entsprechend der jeweiligen Präferenz vergeben.
Nehmen wir an, dass Ihr System maximal vier Festplatten gleichzeitig unterstützt. Alle vier Festplatten können wie folgt angeschlossen werden:
Primärer Meister |
Primärer Slave |
Sekundärer Master |
Sekundärer Slave |
Betrachten wir nun einige Fälle für die Anzahl der physischen Laufwerke. Dabei gehe ich davon aus, dass Sie die Laufwerke mit den richtigen Jumpereinstellungen, wie vom Laufwerkhersteller angegeben, und in den richtigen Master-Slave-Einstellungen angeschlossen haben:
- Wenn alle vier Festplatten an das System angeschlossen sind: Wenn alle vier Festplatten an das System angeschlossen sind, lauten die physischen Laufwerksnummern wie folgt:
Primär/Sekundär (Master/Slave) |
Status |
Physische Laufwerksnummer und Beschreibung |
Primärer Meister |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 80H. In diesem Fall wird die Festplatte als erste Festplatte bezeichnet . |
Primärer Slave |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 81H. In diesem Fall wird die Festplatte als zweite Festplatte bezeichnet . |
Sekundärer Master |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 82H. In diesem Fall wird die Festplatte als dritte Festplatte bezeichnet . |
Sekundärer Slave |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 83H. In diesem Fall wird die Festplatte als vierte Festplatte bezeichnet . |
- Wenn drei Festplatten an das System angeschlossen sind: Wenn drei Festplatten an das System angeschlossen sind, werden die physischen Laufwerksnummern entsprechend ihrer Anschlusseinstellungen vergeben. Die folgenden Beispiele stellen einige der Anordnungen dar:
Primär/Sekundär (Master/Slave) |
Status |
Physische Laufwerksnummer und Beschreibung |
Primärer Meister |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 80H. In diesem Fall wird die Festplatte als erste Festplatte bezeichnet . |
Primärer Slave |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 81H. In diesem Fall wird die Festplatte als zweite Festplatte bezeichnet . |
Sekundärer Master |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 82H. In diesem Fall wird die Festplatte als dritte Festplatte bezeichnet . |
Sekundärer Slave |
Datenträger nicht vorhanden |
---------------------------------- |
Primär/Sekundär (Master/Slave) |
Status |
Physische Laufwerksnummer und Beschreibung |
Primärer Meister |
Datenträger nicht vorhanden |
---------------------------------- |
Primärer Slave |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 80H. In diesem Fall wird die Festplatte als erste Festplatte bezeichnet . |
Sekundärer Master |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 81H. In diesem Fall wird die Festplatte als zweite Festplatte bezeichnet . |
Sekundärer Slave |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 82H. In diesem Fall wird die Festplatte als dritte Festplatte bezeichnet . |
Primär/Sekundär (Master/Slave) |
Status |
Physische Laufwerksnummer und Beschreibung |
Primärer Meister |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 80H. In diesem Fall wird die Festplatte als erste Festplatte bezeichnet . |
Primärer Slave |
Datenträger nicht vorhanden |
---------------------------------- |
Sekundärer Master |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 81H. In diesem Fall wird die Festplatte als zweite Festplatte bezeichnet . |
Sekundärer Slave |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 82H. In diesem Fall wird die Festplatte als dritte Festplatte bezeichnet . |
Primär/Sekundär (Master/Slave) |
Status |
Physische Laufwerksnummer und Beschreibung |
Primärer Meister |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 80H. In diesem Fall wird die Festplatte als erste Festplatte bezeichnet . |
Primärer Slave |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 81H. In diesem Fall wird die Festplatte als zweite Festplatte bezeichnet . |
Sekundärer Master |
Datenträger nicht vorhanden |
---------------------------------- |
Sekundärer Slave |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 82H. In diesem Fall wird die Festplatte als dritte Festplatte bezeichnet . |
- Wenn zwei Festplatten an das System angeschlossen sind: Wenn zwei Festplatten an das System angeschlossen sind, werden die physischen Laufwerksnummern entsprechend ihrer Anschlusseinstellungen vergeben. Das folgende Beispiel veranschaulicht dies:
Primär/Sekundär (Master/Slave) |
Status |
Physische Laufwerksnummer und Beschreibung |
Primärer Meister |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 80H. In diesem Fall wird die Festplatte als erste Festplatte bezeichnet . |
Primärer Slave |
Datenträger nicht vorhanden |
---------------------------------- |
Sekundärer Master |
Datenträger nicht vorhanden |
---------------------------------- |
Sekundärer Slave |
Datenträger ist vorhanden |
Die physische Laufwerksnummer ist 81H. In diesem Fall wird die Festplatte als zweite Festplatte bezeichnet . |
- Wenn eine einzelne Festplatte an das System angeschlossen ist: Keine Sorge, wenn nur eine Festplatte verfügbar ist, lautet die physische Laufwerksnummer 80H.
Interrupt 13H (INT 13H), ROM-BIOS-Disk-Treiberfunktionen
Hier wurde die Beschreibung der INT 13H-Funktionen gegeben. Diese Funktionen sollten mit Sorgfalt erlernt werden, da der Missbrauch dieser Funktionen oder die Verwendung ohne Sorgfalt oder ohne Wissen zu großen Datenverlusten oder vielen anderen Problemen führen kann. Bei angemessener und richtiger Verwendung helfen diese Funktionen jedoch, die Codierung Ihres Programms zu minimieren und Ihre Programmierung einfach und leicht zu gestalten.
INT 13H (0x13)
Funktion 00H (0x00) Festplattensystem zurücksetzen
Anruf mit AH = 00H
DL = Antrieb
00H-7FH-Diskette
80H-FFH Festplatte
Gibt zurück: Wenn die Funktion erfolgreich ist
Carry-Flag = löschen
AH = 00H
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Setzt den Festplattencontroller zurück und kalibriert die angeschlossenen Laufwerke neu. Der Lese-/Schreibarm wird zu Zylinder 0 bewegt und bereitet den Festplatten-E/A vor.
Diese Funktion sollte nach einem fehlgeschlagenen Lese-, Schreib-, Prüf- oder Formatierungsvorgang für eine Diskette aufgerufen werden, bevor der Vorgang erneut versucht wird. Wenn die Funktion mit einem Festplattenlaufwerk aufgerufen wird (d. h. wenn DL>=80H ausgewählt wird), werden der Diskettencontroller und dann der Festplattencontroller zurückgesetzt.
INT 13H (0x13)
Funktion 01H (0x01) Festplattensystemstatus abrufen
Anruf mit: AH = 01H
DL = Antrieb
00H-7FH-Diskette
80H-FFH Festplatte
Gibt zurück: AH = 00H
AL = Status des vorherigen Festplattenvorgangs
(Fehler finden Sie in der zuvor angegebenen Tabelle.)
und Beschreibung der Statuscodes).
Kommentare:
Gibt den Status der letzten Festplattenoperation zurück
INT 13H (0x13)
Funktion 02H (0x02) Sektor lesen
Anruf mit: AH = 02H
AL = Anzahl der Sektoren
CH = Zylinder
CL = Sektor
DH = Kopf
DL = Antrieb
00H-7FH-Diskette
80H-FFH Festplatte
ES:BX = Segment: Offset des Puffers
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00H
AL = Anzahl der übertragenen Sektoren
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion liest einen oder mehrere Sektoren von der Festplatte in den Speicher. Auf Festplatten mit fester Festplatte werden die oberen 2 Bits der 10-Bit-Zylindernummer in die oberen 2 Bits des Registers CL gelegt.
INT 13H (0x13)
Funktion 03H (0x03) Sektor schreiben
Anruf mit: AH = 03H
AL = Anzahl der Sektoren
CH = Zylinder
CL = Sektor
DH = Kopf
DL = Antrieb
00H-7FH-Diskette
80H-FFH Festplatte
ES: BX = Segment: Offset des Puffers
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00H
AL = Nummer des übertragenen Sektors
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion schreibt einen oder mehrere Sektoren aus dem Speicher auf die Festplatte. Auf Festplatten werden die oberen 2 Bits der 10-Bit-Zylindernummer in die oberen 2 Bits des Registers CL gelegt.
INT 13H (0x13)
Funktion 04H (0x04) >> Sektor überprüfen
Anruf mit: AH = 04H
AL = Anzahl der Sektoren
CH = Zylinder
CL = Sektor
DH = Antrieb
00H-7FH-Diskette
80H-FFH Festantrieb
ES: BX = Segment: Offset des Puffers
Gibt zurück: Wenn die Funktion erfolgreich ist
Carry-Flag = löschen
AH = 00H
AL = Anzahl der überprüften Sektoren
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion überprüft die Adressfelder eines oder mehrerer Sektoren. Bei dieser Operation werden keine Daten in den Speicher oder aus dem Speicher übertragen. Auf Festplatten werden die oberen 2 Bits der 10-Bit-Zylindernummer in die oberen 2 Bits des Registers CL übertragen.
Mit dieser Funktion kann getestet werden, ob sich ein lesbares Medium in einem Diskettenlaufwerk befindet. Das anfordernde Programm sollte das Diskettensystem zurücksetzen (INT 13H Funktion 00H) und den Vorgang dreimal wiederholen, bevor es davon ausgeht, dass keine lesbare Diskette vorhanden ist. Dies wird bei den meisten Initialisierungsvorgängen für Disketten empfohlen.
INT 13H (0x13)
Funktion 05H (0x05) >> Spur formatieren
Anruf mit: AH = 05H
AL = Interleave (PC/XT-Festplatten)
CH = Zylinder
DH = Kopf
DL = Antrieb
00H-7FH-Diskette
80H-FFH Festplatte
ES: BX = Segment: Offset der Adressfeldliste
(Außer PC/XT-Festplatte)
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00H
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status (siehe Statustabelle unten)
früher)
Kommentare:
Initialisiert die Adressfelder der Diskettensektoren und -spuren auf der angegebenen Spur. Auf Disketten besteht die Adressfeldliste aus einer Reihe von 4-Byte-Einträgen, ein Eintrag pro Sektor. Das Format ist in der folgenden Tabelle angegeben.
Auf Festplatten werden die oberen 2 Bits der 10-Bit-Zylindernummer in den oberen 2 Bits des Registers CL platziert.
Byte |
Inhalt |
0 |
Zylinder |
1 |
Kopf |
2 |
Sektor |
3
|
Sektorgrößencode
Wert |
Beschreibung |
00 Uhr |
128 Byte pro Sektor |
01 Uhr |
256 Byte pro Sektor |
02 Uhr |
512 Byte pro Sektor |
03 Uhr |
1024 Byte pro Sektor |
|
INT 13H (0x13)
Funktion 06H (0x06) >> Fehlerhafte Spur formatieren
Anruf mit: AH = 06H
AL = Interleave (Verschachtelung)
CH = Zylinder
DH = Kopf
DL = Antrieb
80H-FFH Festplatte
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00H
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion ist nur für PC/XT-Festplattenlaufwerke definiert. Sie initialisiert eine Spur, schreibt Festplattenadressfelder und Datensektoren und setzt Flags für fehlerhafte Sektoren.
INT 13H (0x13)
Funktion 07H (0x07) >> Laufwerk formatieren
Anruf mit: AH = 07H
AL = Interleave (Verschachtelung)
CH = Zylinder
DL = Antrieb
80H-FFH Festplatte
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00H
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status (siehe Statustabelle unten)
früher)
Kommentare:
Diese Funktion ist nur für PC/XT-Festplattenlaufwerke definiert. Sie formatiert das gesamte Laufwerk und schreibt, beginnend beim angegebenen Zylinder, Festplattenadressfelder und Datensektoren.
INT 13H (0x13)
Funktion 08H (0x08) >> Antriebsparameter abrufen
Anruf mit: AH = 08H
DL = Antrieb
00H-7FH-Diskette
80H-FFH Festplatte
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
BL = Laufwerkstyp (PC/AT und PS/2 Diskettenlaufwerk
Scheibe)
Wert |
Beschreibung |
01 Uhr |
360 KB, 40 Spuren, 5,25 Zoll |
02 Uhr |
1,2 MB, 80 Spuren, 5,25 Zoll |
03 Uhr |
720 KB, 80 Spuren, 3,5 Zoll |
04 Uhr |
1,44 MB, 80 Spuren, 3,5 Zoll |
CH = untere 8 Bits des maximalen Zylinders
Nummer
CL = Bits 6-7 höchstwertige 2 Bits von maximal
Zylindernummer Bits 0-5 maximal
Sektornummer
DH = maximale Kopfzahl
DL = Anzahl der Laufwerke
ES: DI = Segment: Offset des Laufwerks
Parametertabelle
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion gibt verschiedene Parameter für das angegebene Laufwerk zurück. Der im Register DL zurückgegebene Wert spiegelt die tatsächliche Anzahl der physischen Laufwerke wider, die an den Adapter für das angeforderte Laufwerk angeschlossen sind.
INT 13H (0x13)
Funktion 09H (0x09) >> Festplatteneigenschaften initialisieren
Anruf mit: AH = 09H
DL = Antrieb
80H-FFH Festplatte
Auf dem PC/XT Vector für INT 41H
muss auf den Disk-Parameterblock zeigen oder auf dem PC/AT und PS/2
Vektor für INT 41H muss auf die Festplatte zeigen
Parametersatz für Antrieb 0
Vektor für INT 46H muss auf die Festplatte zeigen
Parametersatz für Antrieb 1
Gibt zurück : Wenn die Funktion erfolgreich war
Carry-Flag = löschen
AH = 00H
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion initialisiert den Festplattencontroller für nachfolgende E/A-Vorgänge unter Verwendung der Werte, die in den Festplattenparameterblöcken des ROM-BIOS gefunden wurden. Die Funktion wird nur auf Festplatten unterstützt. Das Parameterblockformat für PC- und PC/XT-Festplatten lautet wie folgt:
Änderung(en) |
Inhalt |
00H-01H |
Maximale Zylinderanzahl |
02 Uhr |
Maximale Anzahl Köpfe |
03 Std.-04 Std. |
Zylinder mit reduziertem Schreibstrom wird gestartet |
05.00-06.00 Uhr |
Starten des Schreibvorkompensationszylinders |
07 Uhr |
Maximale ECC-Burstlänge |
08 Uhr
|
Antriebsoption
Bit(s) |
Bedeutung (sofern festgelegt) |
0 – 2 |
Antriebsoption |
3 – 5 |
reserviert (0) |
6 |
ECC-Einträge deaktivieren |
7 |
Deaktivieren Sie Wiederholungsversuche für den Festplattenzugriff. |
|
09 Uhr |
Standard-Timeoutwert |
0AH |
Timeout-Wert für das Formatieren des Laufwerks |
0BH |
Timeout-Wert für Kontrollfahrt |
0CH-0FH |
Reserviert |
Das Parameterblockformat für PC/AT- und PS/2-Festplatten ist wie folgt:
Änderung(en) |
Inhalt |
00H_01H |
maximale Zylinderzahl |
02 Uhr |
Maximale Anzahl Köpfe |
03 Std.-04 Std. |
Reserviert |
05.00-06.00 Uhr |
Start des Schreibvorkompensationszylinders |
07 Uhr |
maximale ECC-Burstlänge |
08 Uhr |
Laufwerksoptionen
Bit(s) |
Bedeutung (sofern festgelegt) |
0 – 2 |
nicht genutzt |
3 |
mehr als 8 Köpfe |
4 |
nicht genutzt |
5 |
Herstellerdefektkennfeld vorhanden bei
maximalem Zylinder +1 |
6 – 8 |
ungleich Null (10, 01 oder 11), wenn Wiederholungsversuche deaktiviert sind |
|
09H-0BH |
Reserviert |
0CH-0DH |
Landezonenzylinder |
0EH |
Sektor pro Spur |
0FH |
Reserviert |
INT 13H (0x13)
Funktion 0A H (0x0A oder 10) >> Sektor lang lesen
Anruf mit: AH = 0AH
AL = Anzahl der Sektoren
CH = Zylinder
CL = Sektor
DH = Kopf
DL = Antrieb
80H-FFH Festplatte
ES: BX = Segment: Offset des Puffers
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00H
AL = Anzahl der übertragenen Sektoren
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion liest einen oder mehrere Sektoren von der Festplatte in den Speicher, zusammen mit einem 4-Byte-Error Correcting Code (ECC) für jeden Sektor. Anders als bei der normalen Funktion „Sektor lesen“ (INT 13H (0x13) Funktion 02H) werden ECC-Fehler nicht automatisch korrigiert. Mehrsektorübertragungen werden nach jedem Sektor mit einem Lesefehler beendet.
Diese Funktion wird nur auf Festplatten unterstützt. Die oberen 2 Bits der 10-Bit-Zylindernummer werden in die oberen 2 Bits des Registers CL gelegt.
INT 13H (0x13)
Funktion 0BH (0x0B oder 11) >> Sektor lang schreiben
Anruf mit: AH = 0BH
AL = Anzahl der Sektoren
CH = Zylinder
CL = Sektor
DH = Kopf
DL = Antrieb
80H-FFH Festplatte
ES: BX = Segment: Offset des Puffers
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00H
AL = Anzahl der übertragenen Sektoren
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion schreibt einen oder mehrere Sektoren vom Speicher auf die Festplatte. Auf die Daten jedes Sektors muss sein 4-Byte-ECC-Code folgen. Die oberen 2 Bits der 10-Bit-Zylindernummer werden in die oberen 2 Bits des Registers CL eingefügt. Diese Funktion wird nur auf Festplatten unterstützt.
INT 13H (0x13)
Funktion 0CH (0x0C oder 12) >> Suchen
Anruf mit: AH = 0CH
CH = untere 8 Bits des Zylinders
CL = obere 2 Bits des Zylinders in Bits 6-7
DH = Kopf
DL = Antrieb
80H-FFH Festplatte
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00H
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion positioniert die Lese-/Schreibköpfe der Festplatte auf den angegebenen Zylinder, ohne Daten zu übertragen. Die oberen 2 Bits der Zylindernummer werden in die oberen 2 Bits des Registers CL gesetzt. Diese Funktion wird nur auf Festplatten unterstützt.
INT 13H (0x13)
Funktion 0DH (0x0D oder 13) >> Festplattensystem zurücksetzen
Anruf mit: AH = 0DH
DL = Antrieb
80H-FFH Festplatte
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00H
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status (siehe INT 13H Funktion 01H)
Kommentare:
Diese Funktion setzt den Festplattencontroller zurück, kalibriert angeschlossene Laufwerke neu, bewegt den Lese-/Schreibarm zu Zylinder 0 und bereitet den nachfolgenden Festplatten-E/A vor.
INT 13H (0x13)
Funktion 0EH (0x0E oder 14) >> Sektorpuffer lesen
Anruf mit: AH = 0EH
ES: BX = Segment: Offset des Puffers
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Mit dieser Funktion wird der Inhalt des internen Sektorpuffers des Festplattenadapters in den Systemspeicher übertragen. Es werden keine Daten vom physischen Laufwerk gelesen.
INT 13H (0x13)
Funktion 0FH (0x0F oder 15) >> Sektorpuffer schreiben
Anruf mit: AH = 0FH
ES: BX = Segment: Offset des Puffers
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion überträgt Daten vom Systemspeicher in den internen Sektorpuffer des festen Adapters. Es werden keine Daten auf das physische Laufwerk geschrieben. Diese Funktion sollte aufgerufen werden, um den Inhalt des Sektorpuffers zu initialisieren, bevor das Laufwerk mit INT 13H Funktion 05H formatiert wird.
INT 13H (0x13)
Funktion 10H (0x10 oder 16) >> Laufwerksstatus abrufen
Anruf mit: AH = 10H
DL = Antrieb
80H-FFH Festplatte
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00H
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion prüft, ob das angegebene Festplattenlaufwerk betriebsbereit ist, und gibt den Status des Laufwerks zurück. Diese Funktion wird nur auf Festplatten unterstützt.
INT 13H (0x13)
Funktion 11H (0x11 oder 17) >> Laufwerk neu kalibrieren
Anruf mit: AH =11H
DL = Antrieb
80H-FFH Festplatte
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00H
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion bewirkt, dass sich der Festplattenadapter für das angegebene Laufwerk neu kalibriert, den Lese-/Schreibarm auf Zylinder 0 positioniert und den Status des Laufwerks zurückgibt. Diese Funktion wird nur auf Festplatten unterstützt.
INT 13H (0x13)
Funktion 12H (0x12 oder 18) >> Controller RAM Diagnose
Anruf mit: AH = 12H
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion veranlasst den Festplattenadapter, einen integrierten Diagnosetest seines internen Sektorpuffers durchzuführen und anhand des zurückgegebenen Status anzuzeigen, ob der Test bestanden wurde.
INT 13H (0x13)
Funktion 13H (0x13 oder 19) >> Controller-Laufwerkdiagnose
Aufruf mit: AH = 13H
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion bewirkt, dass der feste Adapter interne Diagnosetests des angeschlossenen Laufwerks durchführt und durch den zurückgegebenen Status angibt, ob der Test bestanden wurde.
INT 13H (0x13)
Funktion 14H (0x14 oder 20) >> Controllerinterne Diagnose
Anruf mit: AH = 14H
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00H
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion veranlasst den Festplattenadapter, einen integrierten Diagnose-Selbsttest durchzuführen und durch den zurückgegebenen Status anzuzeigen, ob der Test bestanden wurde.
INT 13H (0x13)
Funktion 15H (0x15 oder 21) >> Datenträgertyp ermitteln
Anruf mit: AH = 15H
DL = Antrieb
00H-7FH-Diskette
80H-FFH Festplatte
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = Antriebstypencode
00H wenn kein Laufwerk vorhanden
01H wenn Diskettenlaufwerk ohne Change-Line-Unterstützung
02H wenn Diskettenlaufwerk mit Change-Line-Unterstützung
03H wenn Festplatte
|
Und wenn Festplatte (AH =03H)
CX: DX = Anzahl der 512-Byte-Sektoren
Wenn die Funktion nicht erfolgreich ist
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion gibt einen Code zurück, der den Typ der Diskette oder Festplatte angibt, auf die durch den angegebenen Laufwerkscode verwiesen wird.
INT 13H (0x13)
Funktion 16H (0x16 oder 22) >> Datenträgeränderungsstatus abrufen
Anruf mit: AH = 16H
DL = Antrieb
00H-7FH-Diskette
Rückgabewert: Wenn die Änderungszeile inaktiv ist und die Festplatte nicht gewechselt wurde
Carry-Flag = löschen
AH = 00H
Wenn die Änderungszeile aktiv ist und die Festplatte möglicherweise geändert wurde
Carry-Flag = gesetzt
AH = 06H
Kommentare:
Diese Funktion gibt den Status der Änderungszeile zurück und gibt an, ob die Diskette im Laufwerk seit dem letzten Zugriff auf die Diskette ausgetauscht wurde. Wenn diese Funktion mit gesetztem Carry-Flag zurückkehrt, wurde die Diskette nicht unbedingt ausgetauscht und die Änderungszeile kann durch einfaches Entriegeln und Verriegeln der Laufwerksklappe aktiviert werden, ohne die Diskette herauszunehmen.
INT 13H (0x13)
Funktion 17H (0x17 oder 23) >> Disktyp festlegen
Anruf mit: AH = 17H
AL = Diskettentypcode
Wert |
Beschreibung |
00 Uhr |
Nicht verwendet |
01 Uhr |
320/360 KB Diskette im 360 KB Laufwerk |
02 Uhr |
320/360 KB Diskette im 1,2 MB Laufwerk |
03 Uhr |
1,2 MB Diskette in 1,2 MB Laufwerk |
04 Uhr |
720 KB-Diskette im 720 KB-Laufwerk |
SL = Antrieb
00H-7FH-Diskette
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00X
Wenn die Funktion fehlschlägt
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion wählt den Diskettentyp für das angegebene Laufwerk aus.
INTERN 13H (0x13)
Funktion 18H (0x18 oder 24) >> Medientyp für Format festlegen
Anruf von: AH = 18H
CH = Anzahl der Zylinder
CL = Sektor pro Spur
DL = Antrieb
00H-7FH-Diskette
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00X
ES: DI = Segment: Plattenversatz
Parametertabelle für den Medientyp
Wenn die Funktion fehlschlägt
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion wählt die Medieneigenschaften für das angegebene Laufwerk aus, das Laufwerk muss also über eine Diskette verfügen.
INTERN 13H (0x13)
Funktion 19H (0x19 oder 25) >> Köpfe parken
Anruf von: AH = 19H
DL = Antrieb
80H-FFH Festscheibe
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00X
Wenn die Funktion fehlschlägt
Carry-Flag = gesetzt
AH = Status
Kommentare:
Diese Funktion verschiebt den Lese-/Schreibhebel auf eine Spur, die nicht zur Datenspeicherung verwendet wird, sodass die Daten beim Ausschalten des Laufwerks nicht beschädigt werden.
INTERN 13H (0x13)
Funktion 1AH (0x1A oder 26) >> ESDI-Diskette formatieren
Call mit: AH = 1AH
AL = Relative Blockadresse (RBA)
Anzahl der Defekte in der Tabelle
0, wenn keine RBA-Tabelle vorhanden ist
>0, wenn eine RBA-Tabelle verwendet wird
CL = Formatmodifizierungsbits
Seite(n) |
Bedeutung (sofern festgelegt) |
0 |
Ignorieren Sie die primäre Defektkarte |
1 |
Sekundäre Defektkarte ignorieren |
2 |
Karte der sekundären Defekte aktualisieren |
3 |
Führen Sie erweiterte Oberflächenanalysen durch |
4 |
Generieren Sie einen periodischen Interrupt |
5-7 |
Reserviert (muss 0 sein) |
DL = Antrieb
80H-FFH Festscheibe
ES:BX = Segment:RBA-Tabellenoffset
Rückgabewert: Bei erfolgreicher Funktion
Carry-Flag = löschen
AH = 00X
Wenn die Funktion fehlschlägt
Carry-Flag = gesetzt
AH = Status (siehe INT 13H Funktion 01H)
Kommentare:
Diese Funktion initialisiert die Festplattensektor- und Tracking-Adressfelder auf einer Festplatte, die an einen ESDI-Festplattenadapter angeschlossen ist.
Der Vorgang dieser Funktion wird als Low-Level-Formatierung bezeichnet und bereitet die Festplatte für physische Lese-/Schreibvorgänge auf Sektorebene vor. Anschließend muss die Festplatte mit dem Befehl FDISK partitioniert und dann mit dem Befehl FORMAT hochrangig formatiert werden, um das Dateisystem zu installieren.