Компилятор C не генерирует допустимый вывод сборки - PullRequest
1 голос
/ 04 марта 2012

Я пишу простое ядро ​​на C и ASM (для вызова инструкций по сборке, генерируемых C compile).Я слежу за этой прекрасной статьей от osdev.org.После прочтения ядра, написанного на ассемблере, скомпилированного и выполненного, оно работало нормально, я вижу, что kernel.bin работает на qemu, фантастика.Но я действительно хочу написать это на C. Я нашел пример на той же веб-странице.

Я скомпилировал его и попытался запустить kernel.bin на qemu, но я получил "boot fail"со всех устройств: жесткий диск, floopd и CD-ROM.затем я разобрал kernel.bin, сгенерированный ks.o (kernel.asm, собранный с помощью nasm) и kernel.o (kernel.c, собранный с помощью gcc), собранный в bin-файл, используя ld.Kernel.bin:

http://pastebin.com/Y0pLFvij Я не вижу свою строку или какую-либо инструкцию по сборке, чтобы записать мою строку на видео.

Код C, который его генерирует:

#define WHITE_TXT 0x07 // white on black text
unsigned int k_printf(char *message, unsigned int line);
void k_clear_screen();

k_main() 
{
    k_clear_screen();
    k_printf("Hi!\nHow's this for a starter OS?", 0);
};

unsigned int k_printf(char *message, unsigned int line) // the message and then the line #
{
    char *vidmem = (char *) 0xb8000;
    unsigned int i=0;

    i=(line*80*2);

    while(*message!=0)
    {
        if(*message=='\n') // check for a new line
        {
            line++;
            i=(line*80*2);
            *message++;
        } else {
            vidmem[i]=*message;
            *message++;
            i++;
            vidmem[i]=WHITE_TXT;
            i++;
        };
    };

    return(1);
};

void k_clear_screen() // clear the entire text screen
{
    char *vidmem = (char *) 0xb8000;
    unsigned int i=0;
    while(i < (80*25*2))
    {
        vidmem[i]=' ';
        i++;
        vidmem[i]=WHITE_TXT;
        i++;
    };

и assembly, который его вызывает:

[bits 32]

[global start]
[extern k_main] ; this is in the c file

start:
  call k_main

  cli  ; stop interrupts
  hlt ; halt the CPU

link.ld

OUTPUT_FORMAT("binary")

ENTRY(start)

SECTIONS

{

  .text  0x100000 : {

    code = .; _code = .; __code = .;

    *(.text)

    . = ALIGN(4096);

  }

  .data  : {

    data = .; _data = .; __data = .;

    *(.data)

    . = ALIGN(4096);

  }

  .bss  :

  {

    bss = .; _bss = .; __bss = .;

    *(.bss)

    . = ALIGN(4096);

  }

  end = .; _end = .; __end = .;

}

и make-файл:

bin:
    nasm -f aout -o ks.o kernelbase.asm 
    gcc -Wall -c -o kernel.o kernel.c    
    ld -T link.ld -o kernel.bin ks.o kernel.o 
run1:
    qemu kernel.bin

clear:
    rm -f *.o

cbin:
    rm -f *.bin

и ядро ​​в чистой сборке, разобрали: http://pastebin.com/Bkvkq3YQ, который работал нормально для меня, и я вижу инструкции по записи на видео.

Моя ОС: Ubuntu 10.4
Компилятор: gcc
Ассемблер: NASM

Где я ошибаюсь?

1 Ответ

1 голос
/ 09 марта 2012

Я пытался сделать это руководство, и код тоже не удался.Наконец я сделал это:

Скомпилируйте оба файла для 32-битного:

nasm -f elf32 ks.asm -o kernelbase.o
gcc -m32 -c kernel.c -o kernel.o

И ссылка:

gcc -m32 kernelbase.o kernel.o -o Kernel.bin

Через некоторое время я обнаружил, что неполучить любые ошибки, используя gcc для ссылки.

Надеюсь, я помог: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...