Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - OS_3000

Seiten: 1 2 [3]
41
Natürlich, kann ich Batchdateien erstellen.
Doch darin kann man meines Wissens nicht die Ausgabe eine Programmes in eine MSDOS-Variable umleiten.
42
Ich wüsste nicht, wie ich das in einem Script machen soll.
Wahrscheinlich bist du Linuxumgebungen gewöhnt, da geht sowas wahrscheinlich.   :roll:

Zu Case23:
Dieses Problem hat sich eigentlich bereits geklärt.  :wink:
Was ich noch nicht so ganz verstanden hab ist, warum "extern static" immer geinlined wird.
43
Ihr seit echt super, jetzt gehts!  :-D
Bläht aber ein bisschen den Kernel auf. (8kb -> 40kb)

Gibt es eine Möglichkeit nicht immer den Pfad "C:\Programm Ordner\MinGW\OSprogramming\lib\gcc\i586-elf\4.4.0\libgcc.a" angeben zu müssen? Der ist nämlich höllisch lang und wenn ich das auf einen anderen Computer kompilieren will, muss er auch angepasst werden.

Sowas wie von LittleFox wäre gut.
Und ja, dass hab ich natürlich beim Linker angegeben.  :wink:
44
Leider kommt dann "i586-elf-gcc: cannot find -lgcc".
45
Wo finde ich das bzw. wie linke ich das?
Hab eben ein wenig im Internet rumgeschaut, aber nichts dazu gefunden.
46
Hm...
Könnte gut sein, da der Fehler in "Console_WriteInt64" auftritt.
Mal noch der Quellcode:
void Console_WriteInt64(sint64_t Number)
{
    char String[21];
    //Negative Zahlen extra behandeln
    bool Negative = Number < 0;
    if (Negative)
    {
        String[0] = '-';
        Number = 0 - Number;
    }
   
    //Nummer in Ziffern aufteilen
    char TempDigits[10];
    int Index = 0;
    while(Number > 0)
    {
        TempDigits[Index++] = Number % 10;
        Number /= 10;
    }
   
    //String zusammenbauen
    int StringIndex = Negative ? 1 : 0;
    for (Index--; Index >= 0; Index--)
    {
        String[StringIndex] = TempDigits[Index] + 0x30;
        StringIndex++;
    }
    String[StringIndex] = 0;
    Console_Write(String);
}

EDIT: Weshalb gibts hier eigentlich kein Syntaxhighlighting?
So ist Quellcode fast unleserlich.
47
Eigentlich dachte ich, jetzt gehts endlich, als das heute wieder los ging.  :x
Jetzt kommt dauernd "undefined Reference to __moddi3", "undefined Reference to __divdi3", "undefined Reference to __umoddi3" und "undefined Reference to __udivdi3".
48
Ja, stimmt, hab Blödsinn geschrieben.
Meinte natürlich, dass es eben kein 8-Bit Integer ist.  :roll:

Das mit dem "short" hab ich jetzt bereits selbst bemerkt, als die "Console.c" nicht so recht funktioniert hat.
Diese Definition hatte ich aus dem Internet.
Konnte ja nicht wissen, dass sie noch aus der 16-Bit-Zeit stammt.  :-o

typedef unsigned uint8_t __attribute__((__mode__(__QI__)));
typedef unsigned uint16_t __attribute__((__mode__(__HI__)));
typedef unsigned uint32_t __attribute__((__mode__(__SI__)));
typedef unsigned uint64_t __attribute__((__mode__(__DI__)));
Wenn das besser ist, mach ichs so.

EDIT:
Wo ist jetzt der Fehler in "outb"?
Der einzige Unterschied ist in "inb" das Istgleichzeichen vor dem "a".

49
Ich verstehe zwar nicht, weshalb das jetzt kein echter Integer sein soll,
aber auf jedenfall geht es jetzt.  :-D
Noch mal vielen Dank.  :-)
50
Ah, tausend Dank!
Kannst du mir auch noch sagen, was dieses "static" jetzt eigentlich bewirkt, also wozu es gut ist?

Bedauerlicherweiße kommt jetzt beim kompilieren von "Console.c" ein anderer Fehler:
Temp\cckJeKaN.s: Assembler messages:
Temp\cckJeKaN.s:30: Error suffix or operands invalid for "out"

Was stimmt denn jetzt schonwieder nicht?
Meine Funktionen heißen schliesslich immer "outb".
51
Bei "#Error Ich funktioniere nicht" kommt der Fehler beim kompilieren von "Console.c" und "Kernel.c" wie es sein soll.

Das das wegen dem Kernelverzeichnis streikt, schliess ich mal aus, da "kernel\Console.h" problemlos eingebunden werden kann.

Ich hab mal das Ganze angehängt, vielleicht hilfts bei der Fehlersuche.  :-)
(Die Datei, ist eine 7z-Datei, da ich solche aber leider nicht hochladen darf, habe ich noch ein ".txt" drangehängt. Zum entpacken einfach wieder ".7z" daraus machen.  :wink:)
52
Hat leider nicht geholfen.  :cry:

Der Fehler tritt übrigens auch bei dem Aufruf der In\Out-Funktion auf.

Die "MoveCurser"-Funktion der "Console"-Datei verursacht so sogar 8 Linkerfehler.
void Console_MoveCurser()
{
    if (Console_ShowCurser)
    {
        //Curser auf Position setzen
        outb(0x3D4, 14);
        outb(0x3D5, (uint8_t)(Console_Curser >> 8));
        outb(0x3D4, 15);
        outb(0x3D5, (uint8_t)Console_Curser);
    }
    else
    {
        //Curser aus dem Bildschirm setzen
        outb(0x3D4, 14);
        outb(0x3D5, (uint8_t)(Console_CharCount >> 8));
        outb(0x3D4, 15);
        outb(0x3D5, (uint8_t)Console_CharCount);
    }
}
53
Ich habe das Problem, dass ich einige Methoden eines Headers einfach nicht aufrufen kann.  :cry:

Zb. in meiner "AsmAcess.h":
#ifndef ASMACCESS
#define ASMACCESS

#include <stdint.h>

inline uint8_t inb(uint16_t Port)
{
    unsigned char Data = 0;
    asm volatile ("inb %1, %0" : : "a" (Data), "Nd" (Port));
    return Data;
}
inline void outb(uint16_t Port, uint8_t Data)
{
    asm volatile ("outb %0, %1" : : "a" (Data), "Nd" (Port));
}
inline void halt()
{
    StopPoint:
    asm volatile ("cli");
    asm volatile ("hlt");
    goto StopPoint;
}

#endif
Diese Datei binde ich dann zb. in meinem Kernel ein:
#include "kernel\console.h"
#include "kernel\asmaccess.h"

void main()
{
    Console_ClearScreen();
    Console_WriteLine("Hallo!");
    Console_WriteLine("Ich heiße Compi!");
    Console_WriteLine("Ich bin ein Computer");
    Console_WriteLine("und lasse hier diesen sinnfreien Text anzeigen.");
    halt();
}

Wenn ich das Ganze dann mit folgendem Code kompilieren will:
del obj\*.o
SET C_COMPILE=i586-elf-gcc -m32 -ffreestanding -Wall -nostdinc -std=gnu99 -I stdlib
SET ASM_COMPILE=nasm -f elf

%ASM_COMPILE% -o obj\start_S.o start.S
%C_COMPILE% -o obj\kernel_c.o -c kernel.c

%C_COMPILE% -o obj\beep_c.o -c kernel\beep.c
%C_COMPILE% -o obj\console_c.o -c kernel\console.c

%C_COMPILE% -o obj\rand_c.o -c stdlib\rand.c

i586-elf-ld -T linkconf.ld -o obj\kernel.bin obj\*.o -Ttext=0x100000

copy obj\kernel.bin cd\kernel.bin
mkisofs -R -J -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o cdrom.iso cd/
Kommt beim Linken immer diese Fehlermeldung:
obj\kernel.o: In Funktion "[i]main[/i]":
kernel.c(.text+0x57): undefined reference to "halt"

Ich bin absolut ratlos, was das Problem auslöst.
Eigentlich müsste der Präprozessor "#include "kernel\asmaccess.h"" mit dem Code in der Datei ersetzen und abschliessend das Ganze inlinen.
Doch weshalb tut er das nicht?  :-o

Ich hoffe ihr könnt mir helfen.  :-)
Seiten: 1 2 [3]

Einloggen