|
Wie man INTERNE Verlängerungen 13H bei der C Programmierung verwendet
Wir können die Erweiterungsfunktionen INTERNEN 13H mit den gleichen C Funktionen (int86 (), int86x () etc.) benennen, die wir in den früheren Kapiteln verwendeten. Uns es durch ein Beispiel erlernen lassen.
Das folgende Beispiel gibt den Fokus zu den drei Funktionen (die vorhandenen überprüfung Verlängerungen, ausgedehntes gelesen und verlängert schreiben). Jedoch gehen wir nicht zum verlängerten Gebrauch schreiben Funktion in dieses Kapitel.
Die des Programms überprüfungen zuerst, wenn Verlängerungen gestützt werden, oder nicht wenn die Verlängerungen für INTERNES 13H anwesend sind, liest es den absoluten Sektor 0 (so MBR) der Scheibe. Die Kodierung des Programms fährt in die folgende Weise fort:
/* Programm, zum der Sektoren über 8.46 GBs hinaus mit INTERNEN 13 BIOS-Verlängerungen zugänglich zu machen */
#include<stdio.h>
#include<dos.h>
/* Assigns the identifier to the data type */
typedef unsigned char Byte;
typedef unsigned int Word;
typedef unsigned long DWord;
/* disk_packet structure is loaded in DS:SI and command
executed */
struct disk_packet
{
Byte size_pack; // Size of packet must be 16 or 16+
Byte reserved1; // Reserved
Byte no_of_blocks;// Number of blocks for transfer
Byte reserved2; // Reserved
/* Address in Segment:Offset format */
Word offset; //offset address
Word segment; //segment address
/* To Support the Disk Even of Capacity of
1152921504.607 GB */
DWord lba1;
DWord lba2;
}disk_pack;
/* Function to check if the Extensions are supported */
void check_ext_present()
{
union REGS inregs, outregs; /* Input Registers and
Output */
inregs.h.ah=0x41; /* Function to Check
Extension Present */
inregs.x.bx=0x55AA;
inregs.h.dl=0x80; /* Drive No for first Hard Disk */
int86(0x13,&inregs,&outregs); /*Call interrupt */
if(outregs.x.cflag)
{
/* Extension Not Supported */
printf("\nBios extension not supported");
exit(1);
}
if(outregs.x.bx==0xAA55)
if(outregs.x.cx & 0x1)
/* Extension Present */
printf("\nExtended I/O supported");
}
/* Function to read the Sector */
void read_sectors(void *buffer)
{
union REGS inregs, outregs; /* Input and Output
Registers */
struct SREGS segregs; // Segment Registers
disk_pack.size_pack=16; // Set size to 16
disk_pack.no_of_blocks=1; // One block
disk_pack.reserved1=0; // Reserved Word
disk_pack.reserved2=0; // Reserved Word
disk_pack.segment=FP_SEG(buffer);// Segment of buffer
disk_pack.offset=FP_OFF(buffer); // Offset of buffer
/* request for MBR of hard disk 1 */
/* Read Absolute sector 0 */
disk_pack.lba1=0; /* LBA address, Contains first
32 bits */
/* We normally require( drives < 2.1 T.B) to set
only this */
disk_pack.lba2=0; // Last 32 bit address
inregs.h.ah=0x42; // Function to read
inregs.h.dl=0x80; // Drive Number for First Hard Disk inregs.x.si = FP_OFF(&disk_pack); /*Make DS:SI point
to disk_pack */
segregs.ds = FP_SEG(&disk_pack);
/* Call Interrupt */
int86x(0x13,&inregs,&outregs,&segregs);
if(outregs.x.cflag)
printf("\n\nError %d\n",outregs.h.ah);
else
printf("\n\nI hope Everything is all Right");
}
//// Write Sector Function \\\\
void write_sector()
{
/* It will be written in the same way as read_sectors function, except Function Number, which will be 0x43 in this function. We’ll discuss extended write function in next chapters.
Before Using this Function please check and verify what are you going to do. You should have the proper knowledge of what you are going to do. Use of this function in lack of knowledge or carelessly may destroy your data. */
}
/// Main Function \\\\
void main()
{
int i=0;
/* buffer to hold MBR */
Byte mbr[512];
clrscr();
/* check for BIOS extension present */
check_ext_present();
/* read sector */
read_sectors(&mbr);
printf("\n\n Data of MBR \n");
printf("▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n\n\n");
while(i++<512)
{
/* display the MBR buffer */
printf("%c",mbr[i]);
}
}
Anmerkungen zur Kodierung des Programms
typedef weist dem Bezeichner der Datenart so daß typedef nicht unterzeichnetes Putzfrau Byte zu; weist Bezeichner Byte für die Datenart Putzfrau zu. Ähnlich wird Bezeichner Wort internem zugewiesen und DWord wird zugewiesen, um sich zu sehnen.
Die disk_packet Struktur wird in DS geladen: SI und der Befehl (wie ausgedehntes gelesen, verlängert etc. schreiben oder überprüfen), wird durchgeführt. Die Funktionen IBM/MS DER INTERNEN Verlängerungen 13H (die Funktion 41H sehen, zum zu arbeiten 49H) vorher gegeben.
Die check_ext_present () Funktionsüberprüfungen, wenn die Verlängerungen vorhanden/oder nicht gestützt sind. Die Funktion wird benannt mit BX=55AAH (inregs.x.bx=0x55AA;) und wenn Verlängerungen gestützt werden, wird das BX Register auf AA55H eingestellt. (Die Funktion 41H sehen, die vorher gegeben wird)
Die Funktion read_sectors wird verwendet, um den absoluten Sektor der Scheibe zu lesen, spezifiziert durch disk_pack.lba1. In diesem Programm haben wir disk_pack.lba1=0 gegeben, so werden wir den absoluten Sektor 0 lesen (die Anmerkung unten sehen), folglich gehend, das MBR der Scheibe zu lesen.
Die write_sector Funktion ist auch selbe, die die read_sectors arbeiten und in die gleiche Weise aber mit den unterschiedlichen Funktion Wahlen geschrieben werden werden. Wir verwenden sie in den folgenden Kapiteln.
Anmerkung:
Wir lasen die Scheibe Sektoren in den folgenden zwei Weisen:
- Relativer Sektor las (oder schreiben)
- Absoluter Sektor gelesen (oder schreiben)
Im relativen Sektor, der lasen wir gelesen wurde, die Scheibe Sektoren in übereinstimmung mit CHS (Zylinder, Haupt und Sektor) Geometrie der Scheibe. Im relativen Sektor, der dem MBR der Scheibe gelesen wird (erster Sektor der Scheibe) ist auf Zylinder 0, Kopf 0 und Sektor 1.
Im absoluten Messwert der Scheibe Sektoren, brauchen wir nicht, die Zylinder- oder Spurnummern in unserem Programm zu spezifizieren. Die absoluten Sektoren werden von absolutem Sektor 0 gezählt.
So, wenn wir das MBR der Scheibe (erster Sektor der Scheibe) lesen werden, werden wir absoluten Sektor 0 lesen. Es ist die Arbeit des BIOS, zum der absoluten Sektorzahl in seine entsprechende Zylinder-, Haupt- und Sektorzahl umzuwandeln.
Wie im absoluten Sektormesswert (oder im Schreiben), müssen wir nur die absoluten Sektoren innerhalb der Schleife in den Betrieben wie gesamtem Scheibe Messwert errechnen, oder Schreiben, während im Falle des relativen Sektormesswertes (oder des Schreibens), wir drei Schleifen für CHS absoluten Sektormesswert/-schreiben folglich errechnen hintereinander laufen lassen müssen, ist viel schneller als relativer Sektormesswert/-schreiben.
Z.B. wenn wir irgendeine Festplatte mit den 16 Köpfen (Seiten) haben, 12 Zylinder und mit 63 Sektoren, der Tabelle zunächst gegeben, den Erscheinen das Verfahren und Unterschied beider Lesemethoden und folglich -erscheinen, wie absolute Sektorannäherung unsere Zeit bilden kann viel, die schneller nimmt Programme (wie gesamtes Scheibe Leseschreiben oder gesamte Scheibe, die Programme etc. abwischen) zum Durchlauf:
Relatives Sektor-Ablesen |
Absoluter Sektormesswert |
Zylinder =0, Haupt=0, Sektor = 1 |
Absoluter Sektor = 0 |
Zylinder =0, Haupt=0, Sektor = 2 |
Absoluter Sektor = 1 |
Zylinder =0, Haupt=0, Sektor = 3 |
Absoluter Sektor = 2 |
.
.
.
. |
.
.
.
. |
Zylinder =0, Haupt=0, Sektor = 62 |
Absoluter Sektor = 61 |
Zylinder =0, Haupt=0, Sektor = 63 |
Absoluter Sektor = 62 |
Zylinder =0, Haupt=1, Sektor = 1 |
Absoluter Sektor = 63 |
Zylinder =0, Haupt=1, Sektor = 2 |
Absoluter Sektor = 64 |
Zylinder =0, Haupt=1, Sektor = 3 |
Absoluter Sektor = 65 |
Zylinder =0, Haupt=1, Sektor = 4 |
Absoluter Sektor = 66 |
.
.
.
. |
.
.
.
. |
Zylinder =0, Haupt=1, Sektor = 63 |
Absoluter Sektor = 125 |
Zylinder =0, Haupt=2, Sektor = 1 |
Absoluter Sektor = 126 |
Zylinder =0, Haupt=2, Sektor = 2 |
Absoluter Sektor = 127 |
Zylinder =0, Haupt=2, Sektor = 3 |
Absoluter Sektor = 128 |
.
.
.
. |
.
.
.
. |
Zylinder =0, Haupt=15, Sektor = 63 |
Absoluter Sektor = 1007 |
Zylinder =1, Haupt=0, Sektor = 1 |
Absoluter Sektor = 1008 |
Zylinder =1, Haupt=0, Sektor = 2 |
Absoluter Sektor = 1009 |
Zylinder =1, Haupt=0, Sektor = 3 |
Absoluter Sektor = 1010 |
.
.
.
. |
.
.
.
. |
Zylinder =1, Haupt=0, Sektor = 63 |
Absoluter Sektor = 1070 |
Zylinder =1, Haupt=1, Sektor = 1 |
Absoluter Sektor = 1071 |
Zylinder =1, Haupt=1, Sektor = 2 |
Absoluter Sektor = 1072 |
Zylinder =1, Haupt=1, Sektor = 3 |
Absoluter Sektor = 1073 |
.
.
.
. |
.
.
.
. |
Zylinder =1, Haupt=15, Sektor = 63 |
Absoluter Sektor = 2015 |
Zylinder =2, Haupt=0, Sektor = 1 |
Absoluter Sektor = 2016 |
Zylinder =2, Haupt=0, Sektor = 2 |
Absoluter Sektor = 2017 |
Zylinder =2, Haupt=0, Sektor = 3 |
Absoluter Sektor = 2018 |
.
.
.
. |
.
.
.
. |
Zylinder =11, Haupt=15, Sektor = 60 |
Absoluter Sektor = 12092 |
Zylinder =11, Haupt=15, Sektor = 61 |
Absoluter Sektor = 12093 |
Zylinder =11, Haupt=15, Sektor = 62 |
Absoluter Sektor = 12094 |
Zylinder =11, Haupt=15, Sektor = 63 |
Absoluter Sektor = 12095 |
Die Informationen der Fachtabelle von MBR, das durch jede mögliche Scheibe angezeigt wird MBR, die Werkzeug analysiert, sind unten gegeben worden:
In den oben genannten Informationen sind die relativen Sektorzahlen für das Beginnen beider Fächer 63 und 11277630 beziehungsweise, die von den Fächern frei sind und entsprechend der Zahl Sektoren gezählt, vorhanden in der Scheibe.
|
|