【发布时间】:2015-08-28 20:52:24
【问题描述】:
我的 32 位保护模式操作系统项目 Sinatra 有问题。我可以将源代码编译为目标文件,但我不知道如何将它们链接在一起。我在 Windows 上使用 NASM 和 TDM-GCC。我已经修复了我的代码的问题,因此它可以编译。为简洁起见,我删除了 cmets。
我的档案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 开始加载我的操作系统。如何正确编译和链接我的代码以创建二进制图像?
【问题讨论】:
-
您使用的是什么编译器和链接器工具链?使用 GCC 和 GNU binutils,这是微不足道的。 C 和汇编文件都会生成
ld知道如何链接的 ELF 文件。抱歉,您的问题非常含糊,我认为您需要先了解一些基础知识,然后再询问我们如何帮助您的操作系统项目。 -
我正在使用 GCC/G++(在我看来,它们是相同的)和 Netw。 Windows 中的汇编程序。正如我所说,我有源文件,但我不明白 ld 也不知道应该如何使用链接器脚本。
-
什么“Windows 中的汇编程序”?听起来很糟糕。
-
很抱歉,这对于 Stack Overflow 来说太宽泛了。我们不可能在一个问题中教你所有你需要知道的关于编译器、汇编器、链接器、链接器脚本等的知识。我强烈建议您自己进行研究,通过查找教程和示例代码,您可以从中学习。
-
对不起,宽泛。正如我所说,我不知道链接器脚本,我正在在线添加其中一个 ld 脚本。
标签: c assembly x86 nasm tdm-gcc