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*