簡體   English   中英

如何在 Windows 上為我的操作系統編譯和鏈接 C 和 ASM

[英]How to compile and link C and ASM together on Windows for my OS

我的 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

在 Windows 上使用 GCC-TDM 和 NASM

因為您的目標是在沒有 C 運行時的絕對地址處加載操作系統,所以您需要確保編譯為獨立代碼; 你的asmC文件針對相同類型的對象(win32/PECOFF); 最后一步是將 PECOFF 文件轉換為二進制圖像。

要編譯C文件,您將使用以下內容:

gcc -m32 -ffreestanding -c JSinatra.c -o JSinatra.o

要組裝asm文件,您將使用以下內容:

nasm -f win32 boot.asm -o boot.o

要將它們鏈接在一起,您必須分兩步完成:

ld -m i386pe -T NUL -o sinatra.tmp -Ttext 0x100000 boot.o JSinatra.o

上面的ld命令將創建一個臨時文件sinatra.tmp ,它是一個 32 位 PECOFF 可執行文件。 然后,您需要使用如下命令將sinatra.tmp轉換為二進制圖像:

objcopy -O binary sinatra.tmp sinatra.img

然后你應該在文件sinatra.img有一個二進制圖像

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM