2010-06-28 4 views
2

플로피의 1000h 부분에있는 내용을 부팅하는 부트 로더를 만들고 있습니다. 나는 Fasm을 사용하고 있었는데 (내 친구는 Fasm 만 사용하고 그는 이걸 도와 주었기 때문에), Nasm을 사용하는 것을 선호합니다. 이제 문법에 문제가 있습니다. 어떻게하면 좋을지 알고 싶습니다. NASM이 :두 개의 ORG를 함께 쓰다

org 7C00h 
    %include "boot.asm" 

org 1000h 
    %include "kernel.asm" 

PS : 이미 NASM 구문 스타일을 사용하여 %include 지시어를 넣어, FASM에 그냥 include해야한다.

답변

4

는 문제의 설명이나 무엇 질문에서 말하는 약간 하드이기 때문에 나는 그것이 생각 에 대한 here를 참조하십시오. 으로 질문을 게시 할 때 그것은 좋은 생각이 실제로 솔루션 here을 참조하십시오 (하지만 아래 참조 작동하지 않을 수 있습니다)

:-) 구문 문제 가 무엇인지 보여주기 위해 "나는 구문에 문제가있어" .

기본적으로 NASM의 org 문은 섹션의 기본 주소를 설정하기위한 것이므로 임의로 바이트를 스트림에 삽입하는 데 사용할 수 없습니다. 다음과 같이 사용하는 것이 좋습니다 :

org 1000h 
%include "kernel.asm" 
times 7c00h-($-$$) db 0 ; pad it out with zero bytes 
%include "boot.asm" 

그러나 당신이하려는 일에 대해 생각해 보았습니다. 메모리에로드 할 플랫 바이너리 파일을 만드는 경우 부트 섹터와 커널을 하나의 파일에 둘 다 원할 것이라고는 생각하지 않습니다.

BIOS는 부팅 섹터를 7c00 : 0의 단일 청크로로드하려고하며 해당 청크 시작 부분에 커널이있을 때 거의 확실하게 혼동합니다. 필자가해야 할 일은 부트 섹터 용과 커널 용의 두 가지 완전히 별개의 플랫 바이너리 파일을 만드는 것입니다. BIOS가 부트 섹터를로드하면 부트 섹터가 커널을로드합니다.

두 개의 소스 파일에 관련 org 문을 넣으면 문제가 해결 될 것입니다.

1

간단한 답은 이것이 NASM에서 수행 될 수 없다는 것입니다. org 문은 FASM에서 NASM과 동일하게 작동하지만 MASM에서는 다르게 작동합니다. NASM에서 예제 코드는 개별적으로 어셈블 링 한 다음 결합하여 최종 이미지를 생성해야합니다.

행복한 대답이 서로 다른 시작 주소와 코드 (NASM과) 결합 또는 단일로 (FASM로) 조립해야하는 드문 (아마도 전용) 경우가 있다는 것이다 영상. 부트 섹터가 BIOS에 의해 7C00h으로 전송됩니다. 부팅 섹터 (부팅 로더)가 시작 주소로 전송하는 페이로드로 미디어 (플로피 디스크, 하드 드라이브, USB 플래시 드라이브)에서 즉시 따라옵니다.