2012-01-24 16 views
1

大丈夫、これは私のコード..ですint 13h ah = 08h、何が間違っていますか?

mov ah,08h 
mov dl,80h ;have Tried for 81h,82h.... 
int 13h 


mov ah,0Eh 
    int 10h ; printing the value in al. 

のint 10hが、結果は常に80Hを含むすべてのための "スマイリーASCII文字"、81Hである を起動後、画面

のASCII文字を印刷します82H .. 出力画面は、ここでhttp://postimage.org/image/5twm1ml5j/ それは私がハードディスクを、試す前に私のラップトップにUSBS ...

を添付しましたああ= 0

の場合はnullですです

私は何をしていますか?

これは私の全体のコードであるQEMUのPCエミュレータとNASM

を使用。

BITS 16 

start: 
mov ax, 1984 ; Set up 4K stack space after this bootloader 
add ax, 288  ; (4096 + 512)/16 bytes per paragraph 
mov ss, ax 
mov sp, 4096 

mov ax, 1984  ; Set data segment to where we're loaded 
mov ds, ax 




mov ah,08h 
mov dl,80h 
int 13h 


mov ah,0Eh 
int 10h 








times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s 
dw 0xAA55  ; The standard PC boot signature 
+0

が、私は約20年前に書いた作業ブートローダのコードです:https://gist.github.com/546634 –

答えて

2

なぜあなたはint 13hを呼び出していますか?それはディスクサービスのためです。特に、最初のドライブのパラメータを求めているああ08hです! (hereにチェック)。
次に、印刷する文字であるah(確かにtheseのいずれか)にあるものをすべてalに移動します。印刷された顔はアスキー・ナンバー1なので、hereを再度見て、間違ったパラメータをint 13hに渡しました。 ;)

+0

私は、ドライブのパラメータをしたい..先頭トラックやセクター!。 ...なぜ私はいつも私のリターンとして01を得るかどうか?私に正しいパラメータを教えてください。 – wolfgang

+0

@TejeshWayne:ahには常に01hが含まれ、alにはステータスが含まれます。他のレジスタには、あなたが探している情報が入っています(私の最初のリンクを確認してください) – BlackBear

+0

私の間違いはごめんなさい! org/image/fg69cd0wn /これは私が推測しているのはASCIIコード192です。理由は何ですか? – wolfgang

2

最初に、常に "jmp"(ブートシグネチャではなく古代のCompaqシステムで必要なブートローダ)を起動し、SSとSPをロードするときにIRQを無効にする(CPUが8086の場合) (16進数を使用して)アドレスとセグメントを書き込むことはありません.BIOSはデバイス番号をDLで知らせます(あなた自身のハードコーディングはしないでください)。CPUにデータ/ゴミ箱を実行させないでください$ "または何か" int 0x10 "の後ろ)。

次に、「スマイリーASCII文字」はASCII文字ではありません。 「コードページ437」の文字セット(あなたが見ているもの)には、スマイリーの2つのキャラクター - スマイリーアウトライン(キャラクター0x01)と固いスマイリー(キャラクター0x02)があります。これらはエラーコード "0x01 = AHの無効な機能または無効なパラメータ"または "0x02 =アドレスマークが見つかりません"に対応します。最初のエラーははるかに可能性が高いです。

DLに間違った値(たとえば、デバイス番号が間違っている)があると、「AHの無効な機能または無効なパラメータ」エラーが発生する可能性があります。または、デバイス番号が正しいかもしれませんが、そのデバイスで機能がサポートされていない可能性があります。ディスクサイズの問題のために、古い "int 0x13"関数はハードドライブにはもう使用されません(1024シリンダ、256ヘッド、63セクタ、または約7.875 GiBまたは8.455 GBに制限されています。大きい)。ハードドライブの場合は、「int 0x13、ah = 0x48」(http://www.ctyme.com/intr/rb-0715.htmを参照)の代わりに、「int 0x13 extensions」を試してください。

+0

+ 1私の方法より良い私;) – BlackBear

+0

@Brendan 返信いただきありがとうございます:)私はint 13h&ah = 48hを使用してみました。そして、私がalのレジスタを印刷すると、ASCIIコード192またはC0hです。悲しいことに、ここではhttp://postimage.org/image/fg69cd0wn/ ..です。私のコードはhttp://pastebin.com/M7JTfDHCです。 int 13hで小さなコードを書くことができたら嬉しいです。私は試してみることができます:) – wolfgang

+0

@Tejesh:BIOSはAHでステータスを返しますが、ALを表示しています。私はとにかく一緒に叩いたものがあります:http://pastebin.com/BEnjfwBs – Brendan

0
INT 13h AH=08h: Read Drive Parameters 
Parameters: 

Registers 
AH 08h = function number for read_drive_parameters 
DL drive index (e.g. 1st HDD = 80h) 
ES:DI[4] set to 0000h:0000h to work around some buggy BIOS 

Results: 

CF Set On Error, Clear If No Error 
AH Return Code 
DL number of hard disk drives 
DH[4] logical last index of heads = number_of - 1 (because index starts with 0) 
CX [7:6] [15:8][4] logical last index of cylinders = number_of - 1 (because index starts with 0) 
[5:0][4] logical last index of sectors per track = number_of (because index starts with 1) 

BL[4] drive type (only AT/PS2 floppies) 
ES:DI[4] pointer to drive parameter table (only for floppies) 
ここ

http://en.wikipedia.org/wiki/INT_13H

関連する問題