2016-10-04 2 views
1

현재 저는 대학 과제를 수행하는 데 기본 OS를 사용하고 있습니다. 나는 x86 어셈블리 언어로 일하고있다. Bochs에서 응용 프로그램을 실행할 때 위의 오류가 발생하여 부트 로더의 두 번째 단계로 전환하는 데 문제가있는 것 같습니다. 테스트 결과, 오류는 응용 프로그램이 메모리에서 프로그램을 올바르게 읽지 못했기 때문에 발생했습니다. 부트 로더의 첫 번째 단계에서 실수가 있었거나 makefile에서 잘못된 부분이 있기 때문입니다. 나는 아래이 모두 포함됩니다 : 부트 로더의어셈블리 언어 OS 부트 로더 "존재하지 않는 세그먼트 레지스터 7 사용 중"오류

1 단계 :

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 

메이크 : 어떤 도움을 주시면 감사하겠습니다

.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 dl을 만지지도 않았는데, 0 부분은 그 다음을 보게 될 것이다. – FloppyCatfish

+0

어떤 이유로 든 담당자를 드릴 수 없습니다. – FloppyCatfish

답변

1

Int 13h/ah=2h에 대한 문서를 검토해야합니다. Ralf Brown's Interrupt guide은 도스 및 BIOS 인터럽트의 성경입니다. 가이드는이 말한다 :

디스크 - 메모리로 읽어 부문 (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 

반환 :

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을 0으로 설정하지 마십시오. BIOS는 코드로 전송하기 전에 DL을 부팅 드라이브로 설정합니다.
  • AH을 2로 설정하여 디스크를 읽으려는 경우 Int 13h을 알려줍니다.
  • 디스크 오류를 검사하기 위해 cmp al, 5jne Read_Failed이 아닌 캐리 플래그 (CF)를 확인할 수 있습니다. 바로 나는 또한 16 비트 리얼 모드 디버깅을위한 Bochs와 디버거를 사용하는 것이 좋습니다 Int 13h

후 간단한 jc Read_Failed와 그 라인을 모두 교체합니다. BOCHS 디버거가 시작될 때 b 0x7c00 명령을 사용하여 0x7c00에 중단 점을 설정 한 다음 c 명령을 사용하여 계속하십시오. 그러면 BOCHS이 시작되고 부팅 섹터 시작 부분에서 중단되어야합니다. 기본 명령 : 명령의 목록

  • help
  • n (다음)
  • s (단계)
  • c 다음 중단 점까지 계속됩니다.
  • b address 주소에서 휴식.예 : b 0x7c00