Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

C/C++ Kernel möglichkeiten...

Hi,

ich wollt mal zum spass mal ein kleines unbedeutenes OS schreiben. Nun ist die frage:
Kann ich ein Kernel in C/C++ schreiben ? Wenn ja welche möglichkeiten hab ich dann; kann ich Includes normal benutzen. Funktion wie: fstream, getch oder cout & cin.
Oder muss alles roh gecoded sein z.B.:

void _INTERN_PRINT_() //
{
     __asm("   putstr:                   \n\t" 
           "   lodsb                     \n\t"
           "   or       %al,     %al     \n\t"
           "   jz       short    putstrd \n\t"
           "   movb     $0x0E,   %ah     \n\t"
           "   movw     $0x0007, %bx     \n\t"
           "   int      $0x10            \n\t"
           "   jmp      putstr           \n\t"
           "   putstrd:                  \n\t"
           "   retn                      \n\t");
}

void PRINT(const char TXT)
{
     __asm(" movw %si, _TXT \n\t");
     _INTERN_PRINT_();
}

#define PRINT print

void _INTERN_GETKEY_()
{
     __asm("   getkey:        \n\t"
           "   mov $0, %ah    \n\t"
           "   int $0x016     \n\t"
           "   ret            \n\t");
}

void _INTERN_REBOOT_()
{
     __asm("     reboot:        \n\t"
           "     db $0x0EA      \n\t"
           "     dw $0x0000     \n\t"
           "     dw $0x0FFFF    \n\t");
}

int main()
{
    __asm("   movw $0x1000, %ax     \n\t"
          "   movw %ax, %ds         \n\t"
          "   movw %ax, %es         \n\t"
          "   start:                \n\t");
    PRINT("Wellkomme to BOS V1.0");
    PRINT("");
    PRINT("");
    PRINT("");
    PRINT("Press any Key to Reboot");
    _INTERN_GETKEY_();
    _INTERN_REBOOT_();
}
Wenn es do sein MUSS... dann ist mir Assembler auch lieber. Nur kann ich auch includes wie: <iostream>, <windows.h>, <conio.h>, <strings.h>, <dos.h>, <fstream.h> usw.....
Ich wär seeehrr Dankbar für ne antwort !

MFG
TOMEK
« Letzte Änderung: 14.01.07, 00:04:06 von Sniper-Hawk »

Antworten zu C/C++ Kernel möglichkeiten...:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich hab den Kernel ma etwas weiter geschrieben:


//**************************************
//           PRINT FUNKTIONS           
//**************************************
void _INTERN_PRINT_() //
{
     __asm("                  \n\t" 
           "   lodsb                     \n\t"
           "   or       %al,     %al     \n\t"
           "   jz       short    putstrd \n\t"
           "   movb     $0x0E,   %ah     \n\t"
           "   movW     $0x0007, %bx     \n\t"
           "   int      $0x10            \n\t"
           "   jmp      putstr           \n\t"
           "   putstrd:                  \n\t"
           "   retn                      \n\t");
}

void PRINT(const char* TXT)
{
     __asm(" movw %si, _TXT \n\t");
     _INTERN_PRINT_();
}


//**************************************
//         Standard FUNKTIONS           
//**************************************

void _INTERN_GETKEY_()
{
     __asm("   getkey:        \n\t"
           "   mov $0, %ah    \n\t"
           "   int $0x016     \n\t"
           "   ret            \n\t");
}

void _INTERN_REBOOT_()
{
     __asm("     reboot:        \n\t"
           "     db $0x0EA      \n\t"
           "     dw $0x0000     \n\t"
           "     dw $0x0FFFF    \n\t");
}

//**************************************
//        VIDEO MODE FUNKTIONS           
//**************************************

void Init_Video_Mode() //Initialisiert den BIOS-GrafikModus 320x200x256
{
     __asm("   movw  $0x0013,   %ax      \n\t"
           "   int   $0x10               \n\t");
}
 
void VM_MakeColor(int NR, int R, int G, int B) //Änderd einer der 256 Farben im GrafikModus.
{
     __asm("   MOVB   _NR,    %AL       \n\t" //Nummer der Farbe von 1-256       
           "   MOVW   $0x3C8, %DX       \n\t"
           "   OUT    %AL,    %DX       \n\t"
           "   INC    %DX               \n\t"
           "   MOVB   _R,     %AL       \n\t" //ROT [url=http://www.computerhilfen.de/fachbegriffe-r-RGB.html][b](RGB)[/b][/url] in HEX
           "   OUT    %AL,    %DX       \n\t"
           "   MOVB   _G,     %AL       \n\t" //GRÜN [url=http://www.computerhilfen.de/fachbegriffe-r-RGB.html][b](RGB)[/b][/url] in HEX
           "   OUT    %AL,    %DX       \n\t"
           "   MOVB   _B,     %AL       \n\t" //BLAU [url=http://www.computerhilfen.de/fachbegriffe-r-RGB.html][b](RGB)[/b][/url] in HEX
           "   OUT    %AL,    %DX       \n\t");
}

void VM_DrawPixel(int xpos, int ypos, int color) //Zeichnet einen Punkt im GrafikModus
{
     __asm("     MOVB   %AH,  $0x0C     \n\t"
           "     MOVB   %BH,  $0        \n\t"
           "     MOVW   %DX,  _xpos     \n\t"
           "     MOVW   %CX,  _ypos     \n\t"
           "     MOVB   %AL,  _color    \n\t"
           "     INT    $0x10           \n\t");
}

void VM_StandardColor() //Setzt die Farbpallette wieder auf Standard Farben
{
     __asm("   MOVB   %AH,  $0x12     \n\t"
           "   MOVB   %BH,  $0x31     \n\t"
           "   MOVB   %AL,  $1        \n\t"
           "   INT    $0x10           \n\t");
}

void VM_PutText(int ASCII,int WH, int COLOR) //Gibt einen Text im GrafikModus aus
{
     __asm("   MOVB   %AH,  $0x0A   \n\t"
           "   MOVB   %BH,  $0      \n\t"
           "   MOVW   %CX,  _WH     \n\t"
           "   MOVB   %AL,  _ASCII  \n\t"
           "   MOVB   %BL,  _COLOR  \n\t"
           "   INT    $0x10         \n\t");
}

void VM_RowDown() //Zeilenumbrich für Text
{
     __asm("   MOVB   %AH,  $0x0A   \n\t"
           "   MOVB   %BH,  $0      \n\t"
           "   MOVW   %CX,  $0      \n\t"
           "   MOVB   %AL,  $0x0D   \n\t"
           "   MOVB   %BL,  $0      \n\t"
           "   INT    $0x10         \n\t");
     __asm("   MOVB   %AH,  $0x0A   \n\t"
           "   MOVB   %BH,  $0      \n\t"
           "   MOVW   %CX,  $0      \n\t"
           "   MOVB   %AL,  $0x0A   \n\t"
           "   MOVB   %BL,  $0      \n\t"
           "   INT    $0x10         \n\t");
}

void VM_Space() //Space(Leertaste) ' ' für Text
{
     __asm("   MOVB   %AH,  $0x0A   \n\t"
           "   MOVB   %BH,  $0      \n\t"
           "   MOVW   %CX,  $0      \n\t"
           "   MOVB   %AL,  $0x20   \n\t"
           "   MOVB   %BL,  $0      \n\t"
           "   INT    $0x10         \n\t");
}
int main()
{
    __asm("   movw $0x1000, %ax     \n\t"
          "   movw %ax, %ds         \n\t"
          "   movw %ax, %es         \n\t"
          "   start:                \n\t");
    Init_Video_Mode();
    VM_MakeColor(100, 0x00, 0x3A, 0x00);
    VM_RowDown();
    VM_PutText('B',0,100);
    VM_PutText('A',0,100);
    VM_PutText('S',0,100);
    VM_PutText('I',0,100);
    VM_PutText('C',0,100);
    VM_Space();
    VM_PutText('O',0,100);
    VM_PutText('S',0,100);
    VM_Space();
    VM_PutText('V',0,100);
    VM_PutText('1',0,100);
    VM_PutText('.',0,100);
    VM_PutText('0',0,100);
    VM_RowDown();
    VM_RowDown();
    VM_MakeColor(101, 0x00, 0x00, 0x2A);
    VM_PutText('L',0,101);
    VM_PutText('o',0,101);
    VM_PutText('a',0,101);
    VM_PutText('d',0,101);
    VM_PutText('i',0,101);
    VM_PutText('n',0,101);
    VM_PutText('g',0,101);
    VM_PutText('.',0,101);
    VM_PutText('.',0,101);
    VM_PutText('.',0,101);
    VM_StandardColor();
    _INTERN_GETKEY_();
    _INTERN_REBOOT_();
}

MFG
TOMEK
« Letzte Änderung: 15.01.07, 19:55:23 von Sniper-Hawk »

« Arrays 2 DIMENSIONALES ARRAY HELP ME =) »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!