2016-10-04 7 views
1

私は現在、大学の割り当てのために基本的なOSで作業しています。私はx86アセンブリ言語で作業しています。 Bochsでアプリケーションを実行しようとすると、上記のエラーが発生し、私のブートローダの第2段階に切り替える際に問題があるようです。私のテストでは、エラーは、アプリケーションがメモリからプログラムを正しく読んでいない結果であると考えています。ブートローダの最初の段階で間違っているか、またはmakefileに何か間違っているからです。ブートローダのアセンブリ言語OSブートローダ "存在しないセグメントレジスタ7を使用"エラー

第一段階:

BITS 16 

ORG 7C00h 
jmp  Real_Mode_Start 

%include "functions_16.asm" 

Read_Failed: 
    mov  si, boot_error 
    call Console_WriteLine_16 
    ret 

Real_Mode_Start: 
    cli         
    xor ax, ax      
    mov ss, ax 
    mov sp, 4000h 

    mov ds, ax      

    mov si, boot_message    
    call Console_WriteLine_16 

    mov al, 5      
    mov  bx, 9000h     
    mov  ch, 0      
    mov  dh, 0      
    mov  dl, 0 
    mov  cl, 2      
    int  13h 
    cmp  al, 5      
    jne  Read_Failed 

    jmp 9000h 

    hlt         


; Data 
boot_message: db 'MacOS Remastered' , 0 
boot_error:  db 'Boot Failed' , 0 

times 510 - ($ - $$) db 0 

dw 0AA55h 

のMakefile:

.DEFAULT_GOAL:=all 
Imgname=MacRemastered 
.SUFFIXES: .iso .img .bin .asm 

%.bin: %.asm 
nasm -w+all -f bin -o [email protected] $< 

boot.bin: boot.asm functions_16.asm 
boot2.bin: boot.asm functions_16.asm 

$(Imgname).iso: boot.bin boot2.bin 
cp floppy_image/$(Imgname).img $(Imgname).img 
dd status=noxfer conv=notrunc if=boot.bin of=$(Imgname).img 
dd status=noxfer conv=notrunc seek=1 if=boot2.bin of=$(Imgname).img 
rm -rf cdiso 
mkdir cdiso 
cp $(Imgname).img cdiso/$(Imgname).img 
mkisofs -o $(Imgname).iso -b $(Imgname).img cdiso/ 

all: $(Imgname).iso 

clean: 
rm -f boot.bin 
rm -f boot2.bin 
rm -f $(Imgname).img 
rm -f $(Imgname).iso 
rm -rf cdiso 

任意の助けをいただければ幸い私は以下のこれらの両方が含まれます。

+0

エラーを報告しているラインを教えてください。投稿したブートセクタは正常に見えます。それはあなたがロードしている後続のコードの中にある可能性があります。 –

+0

驚くばかりです、ああ2に固定してください。私はまだmov部分に触れていない、0部はまだそれを見ている。 – FloppyCatfish

+0

なんらかの理由であなたに代理人を与えることはできません – FloppyCatfish

答えて

1

のドキュメントを確認してください。 Ralf Brown's Interrupt guideは、DOSとBIOSの割り込みの聖書です。 READ SECTOR(S)メモリに

AH = 02h 
AL = number of sectors to read (must be nonzero) 
CH = low eight bits of cylinder number 
CL = sector number 1-63 (bits 0-5) 
high two bits of cylinder (bits 6-7, hard disk only) 
DH = head number 
DL = drive number (bit 7 set for hard disk) 
ES:BX -> data buffer 

戻る -

DISK:

CF set on error 
if AH = 11h (corrected ECC error), AL = burst length 
CF clear if successful 
AH = status (see #00234) 
AL = number of sectors transferred (only valid if CF set for some BIOSes) 

ほとんどの問題は、あなたのディスクの読み取りに関連しているガイドが、これは言います

  • バッファーが空であるため、ESを0に設定する必要があります。 ES:BXで指定されたアドレス。
  • DLをゼロに設定しないでください。 BIOSはコードに転送する前にDLをブートドライブに設定します。
  • AHを2に設定していないため、Int 13hにディスク読み取りを実行するように指示しています。
  • cmp al, 5jne Read_Failedディスクエラーをテストするのではなく、キャリーフラグ(CF)をチェックすることができます。右Int 13h

後、私はまた、16ビットの実モードのデバッグのためのBOCHSデバッガを使用することをお勧めします簡単なjc Read_Failedとこれらの行の両方を交換してください。 BOCHSデバッガが起動すると、コマンドb 0x7c00で0x7c00にブレークポイントを設定し、次にコマンドcを使用して処理を続行します。それはBOCHSの起動を開始するはずであり、起動セクタの先頭で壊れるはずです。基本的なコマンド:コマンドの一覧について

  • help
  • n(次の)
  • s(ステップ)
  • c次のブレークポイントまで継続します。
  • b addressアドレスでのブレーク。つまり:b 0x7c00
関連する問題