Make your own free website on Tripod.com


アセンブラ(8086系)

その2 ためしてみよう2

今回もWindowsに添付されているDEBUG.EXEを使って

実際に役に立つ?実験をしてみます。


1.始める前に

DEBUG.EXEのみを使用します。

(DEBUG.EXEのある場所とコマンド一覧等は前回の「ためしてみよう1」を参照してください。)



2.ためしてみよう

今回は少し実用的な実験をしてみようと思います。

今回の目標は「現在つながっているHDDの情報をとってみる」です。

HDDを増設したときなどにPCにきちんとHDD繋がっているか知りたいときがあります。

こんなときに実際にBIOSからHDDがどのように認識されているかを知る方法です。

この方法はDOS/VとPC9800では異なりますので別々に説明します。



DOS/Vの場合

DOS/Vの場合HDDの情報を得るにはINT 13hの08hを使用します。実際の使いかたは次のとおりです。

・まずDOS上でDEBUG.EXEを実行する。

・Aと入力・実行しアセンブルモード?にはいる

・以下つぎのように入力する(左のアドレスは自動的に表示され環境によって異なる値になります)

1117:0100 MOV AH,08
1117:0102 MOV DL,80
1117:0104 INT 13
1117:0106 ここでENTERをおして終了する

・このあとPコマンドを使用してINT 13hまで実行する。

・INT 13h実行後に表示されるレジスタの1番右の方にNCかCYが表示されているはずなので確認してください。

ここがNCとなっていればINT 13hは成功です。(CYとなっている場合エラーが発生していますのでもう一度はじめからやってみてください)

・得られたHDDのデータを確認してみましょう。

・みる必要のあるレジスタはCXとDXです。まずDXレジスタを見てください。

 DX=FE03 のようになっている場合(この値はHDDの容量によって異なります)

上の2桁がBIOSで使用するヘッド数になります。(上の場合FEh=254ヘッドとなります)

・次にCXレジスタを見てください。

 CX=15FF のようになっている場合(この値はHDDの容量によって異なります)

ここにセクタ数とシリンダ数が書かれているのですが。少し変な書式で書かれています。

セクタ数はCXレジスタの下位6Bit分となります。(上の場合3Fh=63セクタとなります)

シリンダ数は全部で10Bit分ありCXの上位8Bitがシリンダ数の下位8Bitとなり、

CXの下位8Bit内の上位2Bitがシリンダ数の上位2Bitとなります。(ちょっと複雑)

上記のように

 CX=15FFの場合

CXの上位8Bitは15hであり、この値がシリンダ数の下位8Bitとなります。

CXの下位8BitはFFhですので2進数だと11111111となりこの中の上位2Bitは11で16進数にすると3hになります。

これを先ほどの15hの上に付けてシリンダ数は(315h=789シリンダとなります)

ちなみにドライブの総セクタ数は

セクタ×ヘッド×シリンダですのでこのドライブの総セクタ数は

63×254×789=12625578となりHDDのセクタ長は512バイトですので

12625578×512=6464295936(=6164MB)となり6GBのHDDであるとわかります。

・Qと入力・実行するとDEBUG.EXEを終了することができます。


※補足説明(DOS/V)

その1.上でINT 13hを実行する前にDLに80hをいれていますがこれはBIOSが認識している最初のHDDをあらわしています。

2番目のHDDは81h、3番目のHDDは82hとなります。


その2.IDE、SCSIともにこの方法でパラメータがとれます。


その3.この方法は8GBまでのHDDにしか対応していません。8GB以上の場合INT 13h Extensionsの48hを使用する必要があります。


その4.上記をみてわかるようにヘッド数が8Bit,セクタ数が6Bit,シリンダ数が10Bitしか用意されていません。

またCHSでHDDにアクセスする場合上記と同じレジスタ構成でCHSを指定しているため

CHSで指定できる最大セクタ数は24Bit(約8GB)となります。(これが所謂DOS/Vの8GBの壁です)



PC9800の場合

PC9800の場合HDDの情報を得るにはINT 1Bhの84hを使用します。実際の使いかたは次のとおりです。

・まずDOS上でDEBUG.EXEを実行する。

・Aと入力・実行しアセンブルモード?にはいる

・以下つぎのように入力する(左のアドレスは自動的に表示され環境によって異なる値になります)

1117:0100 MOV AX,8400
1117:0103 INT 1B
1117:0105 ここでENTERをおして終了する

・このあとPコマンドを使用してINT 1Bhまで実行する。

・INT 1Bh実行後に表示されるレジスタの1番右の方にNCかCYが表示されているはずなので確認してください。

ここがNCとなっていればINT 1Bhは成功です。(CYとなっている場合エラーが発生していますのでもう一度はじめからやってみてください)

・得られたHDDのデータを確認してみましょう。

・みる必要のあるレジスタはCXとDXです。まずDXレジスタを見てください。

 DX=0811 のようになっている場合(この値はHDDの容量によって異なります)

上の2桁がBIOSで使用するヘッド数になります。(上の場合8ヘッドとなります)

次に下の2桁がBIOSで使用するセクタ数になります。(上の場合11h=17セクタとなります)

・次にCXレジスタを見てください。

 CX=BO78 のようになっている場合(この値はHDDの容量によって異なります)

この値がシリンダ数になります。(上の場合B078h=45178シリンダとなります)

ちなみにドライブの総セクタ数は

セクタ×ヘッド×シリンダですのでこのドライブの総セクタ数は

17×8×45178=6143936となりHDDのセクタ長は512バイトですので

6143936×512=3145695232(=3000MB)となり3GBのHDDであるとわかります。

・Qと入力・実行するとDEBUG.EXEを終了することができます。



※補足説明(PC9800)

その1.上でINT 1Bhを実行する前にAXの下位8Bitに00hをいれていますがこれはBIOSが認識している最初のIDE HDDをあらわしています。

2番目のIDE HDDは01hとなります。SCSI HDDのパラメータをとる場合はSCSI ID0の場合20h,SCSI ID1の場合21hといったようになります。


その2.PC9800+IDE HDD場合、上記のヘッド数とセクタ数は4.3GBまではヘッド数8,セクタ数17で固定、

それ以上はHDDの持っているヘッド数(IdentifyのWORD3)、セクタ数(IdentifyのWORD6)となります。




今回は以上でおしまいです。

次回はアセンブラの基本命令について解説する予定です。


そふと工房入口へ戻る