Kod Systemu operacyjnego ;) mo?że ktoś poprawi

0

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]

0

a pod jakim komilatorem to robiłeś???

0

Tak jak napisali na osprogramming .... w Turbo C

0

a mozęsz podać nazwe 5 pliku dokładną????

0

library.asm

0

L:argos wiem że to stary watek, ale czy udało ci się to naprawić

1 użytkowników online, w tym zalogowanych: 0, gości: 1