c - 如何在 Windows 上为我的操作系统编译和链接 C 和 ASM

标签 c assembly x86 nasm tdm-gcc

我的 32 位保护模式操作系统项目有问题 Sinatra 。我可以将源代码编译为目标文件,但我不知道如何将它们链接在一起。我在 Windows 上使用 NASMTDM-GCC。我已经修复了代码的问题,因此可以编译。为了简洁起见,我删除了评论。

我的文件boot.asm:

[BITS 32]
[global start]
[extern _JlMain]
start: 
    cli
    call _JlMain
    hlt

我的文件JSinatra.h:

#ifndef __SINATRA_H__
#define __SINATRA_H__

#define JWhiteText 0x07
void JlMain();
void JlClearScreen();
unsigned int JlPrintF(char * message, unsigned int line);

#endif

我的文件JSinatra.c:

#include "JSinatra.h"

void JlClearScreen() // clear entire screen
{
    char * vidmem = (char * ) 0xb8000;
    unsigned int i = 0;
    while (i < (80 * 25 * 2)) {
        vidmem[i] = ' ';
        i += 1;
        vidmem[i] = JWhiteText;
        i += 1;
    }
}
unsigned int JlPrintF(char * message, unsigned int line) {
    char * vidmem = (char * ) 0xb8000;
    unsigned int i = 0;
    i = line * 80 * 2;
    while ( * message != 0) {
        if ( * message == '\n') {
            line += 1;
            i = (line * 80 * 2); * message += 1;
        } else {
            vidmem[i] = * message; * message += 1;
            i += 1;
            vidmem[i] = JWhiteText;
            i += 1;
        }
    }
    return (1);
}
void JlMain() {
    JlClearScreen();
    JlPrintF("Sinatra v0 Virgin/Kernel Mode\n", 0);
}

我需要从绝对地址0x100000开始加载我的操作系统。如何正确编译和链接我的代码以创建二进制图像?

最佳答案

首先,如果您要编译为 ELF,则不得在汇编中的函数之前添加开头的下划线。

现在,为了将不同的源文件链接在一起,显然必须使它们达到共同点,在本例中就是目标代码。

所以,你要做的是:

  1. 将汇编源文件汇编为目标代码。
  2. 编译但不将 C 源文件链接到目标代码。在gcc中:gcc -c file.c -o file.o
  3. 将它们链接在一起。在 gcc 中:gcc cfile.o asfile.o -o app

关于c - 如何在 Windows 上为我的操作系统编译和链接 C 和 ASM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32279598/

相关文章:

c++ - Xcode:malloc 大小似乎无关紧要

c - 使用变量声明数组的大小

c++ - mov bl 在汇编中做了什么

assembly - 将字数组复制到双字数组 NASM 程序集

assembly - 如何通过AND运算得到SF = 1?

c - 从文件中读取多行并将其转换为单行字符串的程序

c - 查找字符串中字符串分隔符的数量

assembly - MIPS : clear $t0 中的清除指令

c++ - 为什么 std::optional<int> 的构造比 std::pair<int, bool> 更昂贵?

assembly - 如何在x86程序集中比较带符号的值和无符号的值