Mam tutaj kodzik najprostszego w świecie systemu operacyjnego, chciałem sie tym pobawić ale widocznie gdzies w kodzie jest błąd!! Jeśli ktoś mogłby go poprawić to z góry dziękuje
Plik 1 startup.asm
[BITS 16]
; zgrupuj wszystkie segment w jeden pojedynczy segment fizyczny
group DGROUP _TEXT _DATA _BSS _STACK
; deklaracja funkcji main z pliku kernel.c
; niezbedna jezeli chcemy by biezacy modul widzial
; funkcje main i mogl tam skoczyc
extern _main
; segment kodu powinien byc zadeklarowany najpierw
; ***************CODE-Segment**************
segment _TEXT class=CODE
..start:
main:
mov ax, cs ; ustawiamy rejestry segmentowe
mov ds, ax
mov es, ax
cli ; wylaczamy przerwania
mov ss, ax ; ustawiamy segment stosu
mov sp, StackEnd ; i wskaznik stosu
sti ; oraz wlaczamy przerwania
call _main ; skocz do naszej funkcji main
; po wyjsciu z funkcji main sterowanie oddawane jest tutaj
.hang: jmp .hang
; w tym module deklarujemy puste segmenty danych
;***************DATA-Segment****************
segment _DATA class=DATA
;***************BSS-Segment*****************
segment _BSS class=BSS
;***************STACK-Segment***************
segment _STACK class=STACK
resw 256 ; rezerwujemy miejsce na stos
StackEnd: ; na ta etykiete ustawiamy wskaznik stosu
Plik 2 Kernel.C
#include "console.c"
main()
{
shell();
return;
}
Plik 3 Commands.c
extern void print(char *text);
void version(void)
{
print("\n\nTrainOs\n");
print("Wersja 3.00.\n");
print("eMail: [email protected]\n");
}
void help(void)
{
print("\n\nDostepne polecenia:\n");
print("help - wyswietla liste dostepnych polecen\n");
print("version - wyswietla informacje o systemie\n");
print("clrscr - czysci ekran\n");
print("reboot - restartuje komputer\n");
}
Plik 4 Console.c
#include "commands.c"
void print(char *text)
{
char curchar;
while(curchar=*text++)
{
switch(curchar)
{
case '\n': /* jezeli trafimy na '\n' */
{putch(0x0D);} /* przechodzimy do nowej linii */
default: putch(curchar);
}
}
}
void scan(char *polecenie, char *par1)
{
int i=0;
char ch, *current=polecenie;
while(1)
{
ch=getch();
/*jezeli wcisniety klawisz to klawisz rozszerzony
to pomijamy dalsza czesc petli */
if(ch==0x00) continue;
/*jezeli wcisnieto spacje to dalsza czesc komendy
uznajemy za argument i zapisujemy w zmiennej par1*/
else if(ch==0x20)
{
putch(ch);
current[i]='\0';
current=par1;
i=0;
}
else if(ch==0x08) /*wcisnieto backspace*/
{
if(i!=0) { i--; blank(); }
}
/*wcisnieto enter, przerywamy wiec wykonywanie petli*/
else if(ch==0x0D) break;
/*wcisnieto normalny klawisz, wypisujemy go wiec
na ekran oraz zwiekszamy licznik*/
else
{
current[i]=ch;
putch(current[i++]);};
}
polecenie[i]='\0';
}
void shell(void)
{
/*pierwsza tablica przeznaczona jest na komende,
a druga na parametr*/
char cmd[20], param[20];
while(1)
{
next_line(); /* przechodzimy do nowej linii*/
print("#"); /* wyswietlamy znak zachety*/
scan(cmd,param); /* pobieramy polecenie i parametr*/
/*sprawdzamy tekst komendy i wywolujemy odpowiednia funkcje*/
if(!strcmp(cmd, "help")) help();
else if(!strcmp(cmd, "reboot")) reboot();
else if(!strcmp(cmd, "version")) version();
}
}
int strcmp(char *str1, char *str2)
{
while(*str1 == *str2 && *str1!=0 && *str2!=0)
{ str1++; str2++; }
if(*str1 == *str2) return 0;
if(*str1 > *str2) return 1;
if(*str1 < *str2) return -1;
return -1;
}
I ostatni 5 plik
_getch: mov ah,00h
int 16h
mov ah,00h
ret
_blank: mov al,08h
mov ah, 0Eh
int 10h
mov ah, 09h
mov al,' '
mov bh, 0h
mov bl, 07h
mov cx, 1
int 10h
ret
_next_line: mov ah, 0Eh
mov al, 0Dh
int 10h
mov al, 0Ah
int 10h
ret
_putch: push bp
mov bp,sp
sub sp,0x40
mov al,[bp+4]
mov ah,0eh
int 10h
mov sp,bp
pop bp
ret
Podczas kompilacji poleceniami:
[code]
tcc -c -r- -mt kernel.c
nasm startup.asm -fobj
nasm library.asm -fobj
tlink /x startup library kernel, kernel.exe
exe2bin kernel.exe kernel.bin /S1000
pause
[/code]
pojawia sie
[code]
Error: Undefined symbol _REBOOT in module KERNEL.C
Error: Undefined symbol _NEXT_LINE in module KERNEL.
Error: Undefined symbol _PUTCH in module KERNEL.C
Error: Undefined symbol _BLANK in module KERNEL.C
Error: Undefined symbol _GETCH in module KERNEL.C
Warning: No stack
[/code] [cya]