[Asembler][C] Problem z kompilacją OS

0

Witam!

Źródła Os'a zaczerpnąłem z jednego z kursów znajdujących się na tej witrynie.
Kompilując bootsector za pomocą NASM'a kompilator wyświetla błąd przy ORG

start.asm:3: error: unrecognised directive [ORG]

fragment wywołujący błąd:

...
; tak jak poprzednio BIOS nasz bootsektor zaladowal pod 0x7C00
[ORG 0x7C00] ; <-- Błąd

; w tybie rzeczywistym uzywamy 16 bitowego kodu
[BITS 16]
...

compile.bat

nasm -f coff start.asm -o start.o
gcc -c kernel.c -O2 -o kernel.o
ld -Tkernel.ld -o kernel.bin start.o kernel.o 
pause

Mam za sobą kilka nieprzespanych(nie dosłownie) nocy i już nie mogę nic więcej wymyślić.
Proszę o szybką odpowiedź.

Pozdrawiam Bartek

0

ty chociaz wiesz co robisz czy tylko masz zrodlo i chcesz to na sile kompilowac?

tak trudno poczytac skladnie nasma odnosnie org?

org to dyrektywa ktora tworzy nierelatywne adresy zaczynajac od jej argumentu.

czyli:
org 666
a:
mov eax,dword [ds:a]

adres a to 666

mozna powiedziec ze org to adres pod ktory leca wszsytkie dane

0

Dokładnie wiem co robię. Niedawno przesiadłem się z fasm'a na nasm'a.
Kiedy postanowiłem napisać jądro w C zaczęły się schody.
Więc ściągnąłem sobie jakiś kurs z 4prog(cz. 2) i spróbowałem skompilować.
Dla mnie C jest o wiele bardziej przejrzyste od asm.

Wiem nawet z czego wynika problem ale nie wiem jak to obejść.

0

Na pewno chcesz żeby bootsector był plikiem typu COFF? Na pewno nie chodzi o dane binarne, w przypadku których dyrektywa ORG ma sens?

0

Tutaj proszę już o gotowca w jaki sposób to skompilować.
Mnie już sił niestarcza. Teraz zająłem się implementacją merge.exe w c#.

moje merge

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace merge2
{
    class Program
    {
        static void Main(string[] args)
        {
            FileStream output = new FileStream(args[2], FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
            FileStream input1 = new FileStream(args[1], FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
            FileStream input2 = new FileStream(args[0], FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
            for (int a = 0; a <= input1.Length; a++)
            {
                output.WriteByte((byte)(input1.ReadByte()));
            }
            for (int a = 0; a <= input2.Length; a++)
            {
                output.WriteByte((byte)(input2.ReadByte()));
            }
            output.Close();
            input1.Close();
            input2.Close();
        }
    }
}

nowe compile.bat

nasm -f bin start.asm -o start.bin
gcc -c kernel.c -O2 -o kernel.o
ld -Tkernel.ld -o kernel.bin kernel.o 
merge2.exe start.bin kernel.bin os.bin
pause

wynikowy bin nie jest boot'owanlny
start.bin jest pusty
kiedy wynik jest typu bin EXTERN nie ma sensu
poza tym w kursie niby wynik jest typu coff

Pozdrawiam Bartek

0

a nie pomyslales ze moze zrodlo kre usilnie probujesz skompilowac jest do d**y?

0

pomyślałem dlatego proszę o pomoc jak mam z tego wybrnąć

0

a jaki ty w ogóle masz problem?
nie mozesz skompilowac czy co? czy moze nie bootuje sie i nie wiesz dlaczego.

aha, i coff to jest format pliku uzywany pod windowsem, loader ma byc czysty bin.

0

Najlepiej napisz sobie bootloadera, ktorego jedynym zadaniem bedzie wczytanie innego pliku oraz przekazanie mu sterowania, a w tym innym pliku wywoluj kod napisany w c++.

Jak chcesz wrzuc kod swojego bootloadera oraz co on tam ma ladowac i napisze Ci jak masz to skompilowac ;p

Ktos wyzej napisal, ze rozkazem ORG ustawia adres, pod ktory leca wszystkie dane, a to nie do konca prawda, poniewaz ORG ustawia adres segmentu kodu, czyli rejestr CS w tym przypadku.

@up: nawet jak niewie co robi to jak skompiluje zobaczy, ze jednak mozna, pokombinuje troche z kodem to na pewno sie czegos nauczy.

0

Powinien załadować pozostałe sektory dyskietki(1.44 M)
czyli jądro w c

Czy moja implementacja merge.exe jest poprawna?

1 użytkowników online, w tym zalogowanych: 0, gości: 1