[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 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?

0

W Twoim przypadku merge ma niewielkie znaczenie poniewaz, jesli nie masz jakiegos systemu plikow tylko czytasz sektory to na windowsie:
copy /b boot.bin+jajko.bin os.img
i dziala, na Linuksie z kolei laczysz:
cat boot.bin jajko.bin > os.bin i nagrywasz.
Moze byc tak, ze wczytujesz te jajko funkcja 2 z 13h przerwania pod jakis tam adres, a w pliku linkera masz pod innym sekcje kodu, dlatego sie nie bootuje.

Wrzuc kod, bo moze byc wiele przyczyn tego, ze sie nie kompiluje, czy nie bootuje ;)

0

Z tym że używam emulatora (bosch)

Może ktoś zna kurs z którym nie ma problemów i nie wymaga GRUB

//edit:

Dobra po godzinie przyglądania się bootloader'owi zrozumiałem że to co tam naklepałem to totalna bzdura.
Mógłby ktoś podać przykład bootloader'a który załaduje i skoczy do jądra w C(oczywiście z przełączeniem na pmode)

0

przeciez chciales sie uczyc?

po cholere bierzesz sie za bootloadera, pierw opanuj asm x32, pisanie driverow, kernel mode, dopiero pozniej pisz w asm x16 (real mode).

i nie lacz c z asmem bo moze i sie nauczysz ale gowno zrozumiesz, tacy jak ty myla funkcje HLL z instrukcjami cpu.

0

To inne pytanie jak zainstalować GRUB'a?
Koniecznie chcę móc testować OS.
W teori mam już naklepany bardzo(powtórzyć nieskończenie wiele razy) prosty interfejs graficzny
Z asm problemu nie mam.
W asm x32 pisłem proste menu z kolorowymi znakami.
Wtedy nie było problemu z kompilacją.
Jednak ja wolę pisać w C

Pozdrawiam Bartek

0

Przepraszam za archeologię.
Chciałbym podziękować tym wszystkim którzy próbowali mi pomóc w tym temacie.
Wszystko działa już jak należy, widocznie potrzebowałem czasu żeby to wszystko ogarnąć.

Pozdrawiam Bartek

PS. jeszcze raz przepraszam za odkop

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