2011-08-20 5 views
3

간단한 운영 체제를 만들려고하는데 아직 부트 로더를 컴파일 할 때 오류가 발생합니다.부트 로더 오류 : 어셈블리의 도움말

error: binary output format does not support external references 

이 오류의 의미를 알고 있지만 바이너리 형식으로 컴파일 할 때 외부 참조를 만들 수 있습니까? ? 여기 내 완벽한 코드가있다 :

;Bootloader.s 
[BITS 16]  
[ORG 0x7C00] 
global loader 
extern kmain 

loader: 
call kmain 
times 510-($-$$) db 0 
dw 0xAA55 

그리고 내 커널 :

/*kernel.c*/ 
void kmain() 
{ 
    unsigned char *vidmem = (unsigned char *) 0xb8000; 
    int i 
    for(i=1;i<=11;i+=2) 
    { 
     vidmem[i]=0x07; 
    } 
    vidmem[0]='H'; 
    vidmem[2]='e'; 
    vidmem[4],vidmem[6]='l'; 
    vidmem[8]='o'; 
    videmem[10]='!'; 
} 

내가 컴파일 한 방법 :

nasm -o '/home/myusername/Cubed OS/Bootloader.o' '/home/myusername/Cubed OS/Bootloader.s' 

답변

3

에만 연결 가능하다 오브젝트 파일 형식에서 외부 참조를 가질 수 있습니다 여기 내 전체 코드입니다. 베어 바이너리가 아니기 때문에 직접 할 수는 없습니다.

내가 이것에 대해가는 세 가지 방법을 참조 (. 그리고 당신은 당신이 AFAIK C 함수를 호출하기 전에 스택을 설정해야합니다) :

  • 가 멀티 부팅이있는 부트 로더를 사용하고, ELF 이미지로 커널을 작성하십시오. 예를 들어 OSDev Bare bones을 참조하십시오.
  • 어셈블리에 전체 내용을 씁니다. 예를 들어 How to write a simple operating system을 참조하십시오.
  • 모두를 C에 작성하고 링커 트릭을 사용하여 원하는 위치에 배치하십시오. GCC 툴체인의 예는 다음에서 찾을 수 있습니다 : Real mode in C with gcc : writing a bootloader
+0

"ORG"지시문을 사용할 수있는 형식은 무엇입니까? – smilinggoomba