test.exe hat fehler verursacht und muss gechlossen werden



  • Hallo,

    ich habe versucht, mittels C eigene Funktionen zu erstellen. Allerdings kommt jetzt beim Programmstart: "test.exe hat Fehler verursacht und muss geschlossen werden. Starten Sie das Programm neu."
    Woran kann das liegen?

    main.c

    #include "video.h"
    
    int main(void)
    {
        screen_clear();
        puts("Hallo Welt");
        while(1);
    }
    

    video.c

    #include "video.h"
    
    #define SCREEN_WIDTH 80
    #define SCREEN_HEIGHT 25
    
    static void screen_scroll(unsigned int lines);
    
    static inline void putc(char c);
    
    static volatile char* video_memory = (char*) 0xB8000;
    
    static unsigned short video_position_x = 0;
    static unsigned short video_position_y = 0;
    
    void screen_clear()
    {
        int i;
    
        for (i = 0; i < SCREEN_WIDTH * SCREEN_HEIGHT * 2; i++) {
            video_memory[i] = (char) 0;
        }
    
        video_position_x = 0;
        video_position_y = 0;
    }
    
    static void screen_scroll(unsigned int lines)
    {
        int i;
    
        for (i = 0; i < SCREEN_WIDTH * (SCREEN_HEIGHT - lines) * 2; i++) {
            video_memory[i] = video_memory[lines * SCREEN_WIDTH * 2 + i];
        }
    
        for (i = 0; i <  lines * SCREEN_WIDTH * 2; i++) {
            video_memory[SCREEN_WIDTH * (SCREEN_HEIGHT - lines) * 2 + i] = 0;
        }
    }
    
    static inline void putc(char c)
    {
        if (c == '\n') {
            video_position_x = 0;
            video_position_y++;
            return;
        }
    
        if (video_position_x > SCREEN_WIDTH) {
            video_position_y += video_position_x / SCREEN_WIDTH;
            video_position_x = video_position_x % SCREEN_WIDTH;
        }
    
        if (video_position_y >= SCREEN_HEIGHT) {
            screen_scroll(1);
            video_position_y--;
        }
    
        int offset = (video_position_y * SCREEN_WIDTH + video_position_x) * 2;
    
        video_memory[offset] = c;
    
        video_memory[offset + 1] = (char) 0x7;
    
        video_position_x++;
    }
    
    int puts(const char* str)
    {
        int count = 0;
    
        while (str[count] != '\0') {
            putc(str[count++]);
        }
        return count;
    }
    

    video.h

    #ifndef _VIDEO_H_
    #define _VIDEO_H_
    
    void screen_clear();
    int puts(const char* msg);
    
    #endif // #ifndef _VIDEO_H_
    


  • daran vermutlich:

    sulpsulpc schrieb:

    static volatile char* video_memory = (char*) 0xB8000;

    auf den bildwiederholspeicher einer pc-gurke kannste unter DOS oder vielleicht unter linux direkt zugreifen.
    🙂



  • Was soll das Linux-Bashing? Da geht das natürlich auch nicht.



  • In raw kompilieren, 512bytes lang machen, auf 55AA enden lassen, per Grub und chainloader laden, dann läuft es.

    Auf zum Beispiel http://www.osdever.net/tutorials/view/hello-world-boot-loader wird es genauer erklärt.

    Ich hab wieder Lust mit Bootloadern und Betriebssystemem zu spielen 😉

    Edit: In Linux gehts vielleicht mit nem Kernelmodul, aber dann läuft der Code bestimmt nicht mehr weil du im Protected mode bist und der Graphikspeicher nicht so benutzt wird.

    Edit2: Wenn du halbwegs schlau bist nimmst du einen Emulator wie Bochs oder so, das macht sich dann leichter mit dem Debuggen und du zerschießt dir nicht versehentlich was.



  • Bashar schrieb:

    Was soll das Linux-Bashing? Da geht das natürlich auch nicht.

    schade. ich dachte, das geht wenigstens in der fullscreen-konsole, hab's aber selbst nie probiert.
    🙂



  • Die Linux-Konsole basiert auf einem zwiebelähnlichen System von Layern, das wohl niemand so richtig durchschaut. Eigentlich ein Wunder, dass Ausgaben irgendwann im Bildschirmspeicher ankommen. (Ups, jetzt bashe ich selber.)



  • Bashar schrieb:

    Die Linux-Konsole basiert auf einem zwiebelähnlichen System...

    achso, deshalb sind mir immer die tränen gekommen. *fg*
    🙂


Anmelden zum Antworten