cのプログラミングでINT 13H延長を使用する方法
私達は私達がより早い章で使用していた同じc機能(int86 ()、int86x ()等)のINT 13Hの延長機能を呼んでもいい。 私達を例によってそれを学ぶことを許可しなさい。
次の例は3つの機能に焦点を与えたものだ(現在の点検延長延長読まれておよび伸ばされて書く)。 但し私達はこの章に拡張される使用に書く機能を行っていない。
プログラムは最初に延長が支えられるまたはない延長がINT 13Hのためにあればかどうか、それ読むディスクの絶対セクター0 (従ってMBR)を確認する。 プログラムのコーディングは次の方法で進む:
/* INT 13 bios延長を使用して8.46 GBを越えるセクターにアクセスするプログラム */
#include<stdio.h>
#include<dos.h>
/* データタイプに鑑定器を割り当てる */
typedef unsigned char Byte;
typedef unsigned int Word;
typedef unsigned long DWord;
/* disk_packetの構造はdsで荷を積まれる: 実行されるsiおよび命令 */
struct disk_packet
{
Byte size_pack; // 包みのサイズが16 16+
Byte reserved1; // 予約
Byte no_of_blocks;// 移動のためのブロックの数
Byte reserved2; // 予約
/* 区分の住所: オフセットのフォーマット */
Word offset; //オフセットの住所
Word segment; //区分の住所
/* 1152921504.607 GBの容量のディスクを支えるため */
DWord lba1;
DWord lba2;
}disk_pack;
/*延長が支えられるかどうか確認する機能 */
void check_ext_present()
{
union REGS inregs, outregs; /* 入力記録および出力 */
inregs.h.ah=0x41; /* 現在の延長を点検する機能 */
inregs.x.bx=0x55AA;
inregs.h.dl=0x80; /* 最初ハードディスクのために運転してはいけない */
int86(0x13,&inregs,&outregs); /*呼出し割り込み */
if(outregs.x.cflag)
{
/* 支えられない延長 */
printf("\nBios extension not supported");
exit(1);
}
if(outregs.x.bx==0xAA55)
if(outregs.x.cx & 0x1)
/*現在の延長*/
printf("\nExtended I/O supported");
}
/* セクターを読む機能 */
void read_sectors(void *buffer)
{
union REGS inregs, outregs; /* 入出力記録 */
struct SREGS segregs; // 区分は登録する
disk_pack.size_pack=16; // 16にサイズを置きなさい
disk_pack.no_of_blocks=1; // 1つのブロック
disk_pack.reserved1=0; // 予約語
disk_pack.reserved2=0; // 予約語
disk_pack.segment=FP_SEG(buffer);// 緩衝の区分
disk_pack.offset=FP_OFF(buffer); // 緩衝のオフセット
/* ハードディスク1のMBRのための要求 */
/* 絶対セクター0を読みなさい */
disk_pack.lba1=0; /* LBAの住所は、最初32ビットを含んでいる */
/* 私達は普通(ドライブ< 2.1 T.B)これだけ置くように要求する */
disk_pack.lba2=0; // 最後32のビット・アドレス
inregs.h.ah=0x42; // 読むべき機能
inregs.h.dl=0x80; // 最初ハードディスクのためのドライブ数inregs.x.si = FP_OFF (&disk_pack); /*Make ds: disk_packへのsiポイント */
segregs.ds = FP_SEG(&disk_pack);
/* 呼出し割り込み */
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");
}
//// セクター機能を書きなさい \\\\
void write_sector()
{
/* それはこの機能の0x43である機能数以外read_sectorsが作用すると同様に書かれる。 私達は次の章に延長を書く機能を論議する。
前にこの機能を使用して点検し、することを行っているであるもの確認しなさい。 有するしているものをの適切な知識をしようとべきである。 知識の欠乏のこの機能の使用はまたは不注意にあなたのデータを破壊するかもしれない。 */
}
/// 主関数 \\\\
void main()
{
int i=0;
/* MBRを保持する緩衝 */
Byte mbr[512];
clrscr();
/* bios延長現在のための点検 */
check_ext_present();
/* セクターを読みなさい */
read_sectors(&mbr);
printf("\n\n Data of MBR \n");
printf("▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n\n\n");
while(i++<512)
{
/* MBRの緩衝を表示しなさい */
printf("%c",mbr[i]);
}
}
プログラムのコーディングのコメント
typedefはデータタイプに鑑定器にそのような物をことtypedefの無署名の木炭バイト割り当てる; データタイプ木炭に鑑定器バイトを割り当てる。 同様に鑑定器の単語はintに割り当てられ、DWordは長くに割り当てられる。
disk_packetの構造はdsで荷を積まれる: siおよび命令は(延長読まれるのような、伸ばされる等を書くか、または確認しなさい)実行される。 前に与えられるIBM/MS INT 13H延長(作用する機能41H 49H)の機能を見なさい。
check_ext_present ()機能は延長が利用できるまたは支えられるまたはないかどうか確認する。 機能はBX=55AAH (inregs.x.bx=0x55AA;)と呼ばれる そして延長が支えられればBXの記録はAA55Hに置かれる。 (前に与えられる機能41Hを見なさい)
機能read_sectorsがdisk_pack.lba1によって指定されるディスクの絶対セクターを読むのに使用されている。 このプログラムでは私達はdisk_pack.lba1=0を与えた、従って私達はディスクのMBRを読むことをこうして行く絶対セクター0を(ノートを次に見なさい)読もうと思っている。
write_sector機能はまたread_sectorsによってが作用し、同じように異なった機能選択とである書かれる同じ。 私達は次の章でそれを使用する。
注:
私達は次の2つの方法でディスクセクターを読んだ:
- 相対的なセクターは読んだ(または書きなさい)
- 読まれる絶対セクター(または書きなさい)
読まれた相対的なセクターで私達はディスクのCHS (シリンダー、ヘッドおよびセクター)の幾何学に従ってディスクセクターを読んだ。 ディスク(ディスクの最初セクター)のMBR読まれる相対的なセクターではシリンダー0、頭部0およびセクター1にある。
ディスクセクターの絶対読書では、私達は私達のプログラムのシリンダーまたはヘッド数を指定する必要はない。 絶対セクターは絶対セクター0から数えられる。
従ってディスク(ディスクの最初セクター)のMBRを読もうと思えば私達は絶対セクター0を読もうと思っている。 それは対応するシリンダーの、ヘッドおよびセクター数に絶対セクター数を変えるbiosの仕事である。
相対的なセクターの読書(か執筆の場合には)、私達がCHSの絶対セクターの読書か執筆を計算するための従って3個のループを一度に動かす必要がある一方絶対セクターの読書(か執筆でように)、私達は全体のディスク読書のような操作のループ内の絶対セクターだけ計算しなければならないまたは執筆は、相対的なセクターの読書か執筆より大いに速い。
63のセクター、次に与えられるテーブルショープロシージャおよび両方の読書方法およびこうしてショーの相違を用いる例えば私達に16人の頭部絶対セクター・アプローチが操業にプログラムを(プログラム等を拭く全体のディスク読書執筆か全体のディスクのような)大いにより速く取る私達の時間をいかに作るかもしれないか(側面)が付いているハードディスクがあれば、12本のシリンダーおよび:
相対的なセクターの読むこと |
絶対セクターの読書 |
シリンダー=0、ヘッド=0のセクター= 1 |
絶対セクター= 0 |
シリンダー=0、ヘッド=0のセクター= 2 |
絶対セクター= 1 |
シリンダー=0、ヘッド=0のセクター= 3 |
絶対セクター= 2 |
.
.
.
. |
.
.
.
. |
シリンダー=0、ヘッド=0のセクター= 62 |
絶対セクター= 61 |
シリンダー=0、ヘッド=0のセクター= 63 |
絶対セクター= 62 |
シリンダー=0、ヘッド=1のセクター= 1 |
絶対セクター= 63 |
シリンダー=0、ヘッド=1のセクター= 2 |
絶対セクター= 64 |
シリンダー=0、ヘッド=1のセクター= 3 |
絶対セクター= 65 |
シリンダー=0、ヘッド=1のセクター= 4 |
絶対セクター= 66 |
.
.
.
. |
.
.
.
. |
シリンダー=0、ヘッド=1のセクター= 63 |
絶対セクター= 125 |
シリンダー=0、ヘッド=2のセクター= 1 |
絶対セクター= 126 |
シリンダー=0、ヘッド=2のセクター= 2 |
絶対セクター= 127 |
シリンダー=0、ヘッド=2のセクター= 3 |
絶対セクター= 128 |
.
.
.
. |
.
.
.
. |
シリンダー=0、ヘッド=15のセクター= 63 |
絶対セクター= 1007年 |
シリンダー=1、ヘッド=0のセクター= 1 |
絶対セクター= 1008年 |
シリンダー=1、ヘッド=0のセクター= 2 |
絶対セクター= 1009年 |
シリンダー=1、ヘッド=0のセクター= 3 |
絶対セクター= 1010年 |
.
.
.
. |
.
.
.
. |
シリンダー=1、ヘッド=0のセクター= 63 |
絶対セクター= 1070年 |
シリンダー=1、ヘッド=1のセクター= 1 |
絶対セクター= 1071年 |
シリンダー=1、ヘッド=1のセクター= 2 |
絶対セクター= 1072年 |
シリンダー=1、ヘッド=1のセクター= 3 |
絶対セクター= 1073年 |
.
.
.
. |
.
.
.
. |
シリンダー=1、ヘッド=15のセクター= 63 |
絶対セクター= 2015年 |
シリンダー=2、ヘッド=0のセクター= 1 |
絶対セクター= 2016年 |
シリンダー=2、ヘッド=0のセクター= 2 |
絶対セクター= 2017年 |
シリンダー=2、ヘッド=0のセクター= 3 |
絶対セクター= 2018年 |
.
.
.
. |
.
.
.
. |
シリンダー=11、ヘッド=15のセクター= 60 |
絶対セクター= 12092 |
シリンダー=11、ヘッド=15のセクター= 61 |
絶対セクター= 12093 |
シリンダー=11、ヘッド=15のセクター= 62 |
絶対セクター= 12094 |
シリンダー=11、ヘッド=15のセクター= 63 |
絶対セクター= 12095 |
用具を分析するあらゆるディスクMBRによって表示されるMBRの仕切りのテーブルの情報は下記のように与えられた:
上記の情報では、仕切りから自由、セクターの数に従って数えられる両方の仕切りの開始のための相対的なセクター数は63そしてそれぞれ11277630、ディスクで利用できるである。
|