gpt4 book ai didi

c - C中的引导加载程序无法编译

转载 作者:IT王子 更新时间:2023-10-29 00:19:26 30 4
gpt4 key购买 nike

我是编写引导加载程序的新手。我用 asm 编写了一个 helloworld 引导加载程序,并且我现在正在尝试用 C 编写一个。我已经用 C 编写了一个 helloworld 引导加载程序,但我无法编译它。

这是我的代码。我究竟做错了什么?为什么不能编译?

void print_char();
int main(void){
char *MSG = "Hello World!";
int i;

__asm__(
"mov %0, %%SI;"
:
:"g"(MSG)
);
for(i=0;i<12;i++){
__asm__(
"mov %0, %%AL;"
:
:"g"(MSG[i])
);
print_char();
}

return 0;
}

void print_char(){
__asm__(
"mov $0X0E, %AH;"
"mov $0x00, %BH;"
"mov $0x04, %BL;"
"int $0x10"
);
}

最佳答案

让我在这里假设很多事情:你想在 x86 系统上运行你的引导加载程序,你在 *nix 机器上设置了 gcc 工具链。

编写引导加载程序时需要考虑一些要点:

  1. VBR 的 510 字节限制,由于分区表(如果您的系统需要),MBR 的限制甚至更少
  2. 实模式 - 16 位寄存器和 seg:off 寻址
  3. 引导加载程序必须是平面二进制文件,必须链接才能在物理地址 7c00h 运行
  4. 没有外部“库”引用(呃!)

现在如果你想让 gcc 输出这样的二进制文件,你需要对它玩点小把戏。

  1. 默认情况下,gcc 会拆分出 32 位代码。要使 gcc 输出代码在实模式下运行,请在每个 C 文件的顶部添加 __asm__(".code16gcc\n")
  2. gcc 在 ELF 中输出编译对象。我们需要一个静态链接在 7c00h 的 bin。使用以下内容创建文件 linker.ld

    ENTRY(main);
    SECTIONS
    {
    . = 0x7C00;
    .text : AT(0x7C00)
    {
    _text = .;
    *(.text);
    _text_end = .;
    }
    .data :
    {
    _data = .;
    *(.bss);
    *(.bss*);
    *(.data);
    *(.rodata*);
    *(COMMON)
    _data_end = .;
    }
    .sig : AT(0x7DFE)
    {
    SHORT(0xaa55);
    }
    /DISCARD/ :
    {
    *(.note*);
    *(.iplt*);
    *(.igot*);
    *(.rel*);
    *(.comment);
    /* add any unwanted sections spewed out by your version of gcc and flags here */
    }
    }
  3. bootloader.c 中编写您的引导加载程序代码并构建引导加载程序

    $ gcc -c -g -Os -march=i686 -ffreestanding -Wall -Werror -I. -o bootloader.o bootloader.c
    $ ld -static -Tlinker.ld -nostdlib --nmagic -o bootloader.elf bootloader.o
    $ objcopy -O binary bootloader.elf bootloader.bin
  4. 既然您已经使用 ASM 构建了引导加载程序,我想剩下的对您来说是显而易见的。

-取 self 的博客:http://dc0d32.blogspot.in/2010/06/real-mode-in-c-with-gcc-writing.html

关于c - C中的引导加载程序无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7079866/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com