2

32 ビット プロテクト モード OS プロジェクト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);
}

絶対アドレスから始まる OS をロードする必要があります0x100000。コードを適切にコンパイルおよびリンクして、バイナリ イメージを作成するにはどうすればよいですか?

4

2 に答える 2

2

まず第一に、ELF にコンパイルする場合、アセンブリで関数の前に最初のアンダースコアを追加してはなりません。

ここで、異なるソース ファイルをリンクするには、それらを共通の基盤 (この場合はオブジェクト コード) に関連付ける必要があります。

だから、あなたがすることは次のとおりです。

  1. アセンブリ ソース ファイルをオブジェクト コードにアセンブルします。
  2. C ソース ファイルをコンパイルしますが、オブジェクト コードにリンクしません。gcc で:gcc -c file.c -o file.o
  3. それらをリンクします。gcc で:gcc cfile.o asfile.o -o app
于 2015-08-28T21:13:17.767 に答える
1

Windows での GCC-TDM と NASM の使用

C ランタイムなしで絶対アドレスに読み込まれる OS をターゲットにしているため、独立したコードとしてコンパイルする必要があります。asmファイルとCファイルが同じタイプのオブジェクト (win32/PECOFF) をターゲットにしていること。最後のステップは、PECOFF ファイルをバイナリ イメージに変換することです。

Cファイルをコンパイルするには、次のようなものを使用します。

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

asmファイルをアセンブルするには、次のようなものを使用します。

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

それらをリンクするには、次の 2 つの手順で行う必要があります。

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

上記のコマンドは、32 ビットの PECOFF 実行可能ファイルでldある一時ファイルを作成します。次に、次のようなコマンドを使用してバイナリ イメージsinatra.tmpに変換する必要があります。sinatra.tmp

objcopy -O binary sinatra.tmp sinatra.img

次に、ファイルにバイナリ イメージが含まれている必要があります。sinatra.img

于 2015-08-28T22:49:49.493 に答える