ďťż

Ładny brzuch

Witam!
Jestem w trakcie pisanie podstawowego "os'a". Oto pełen kod, bez bootloader.
;kernel systemu PlOs autorstwa Bartosza Kowalewskiego org 0000h ;ustawiamy stos mov ax, 07C0h mov ss, ax ;segment stosu mov sp, 03FEh;wierzchołek stosu ;wybieramy tryb ekranu xor ah, ah ;funkcja 0 mov al, 3 ;standardowy tryb tekstowy int 10h ;jedziemy mov ax, os ;wskaźnik do tekstu mov bl, 2 ;na zielono call write call nowa_linia xor ax, ax ; główna pętla programu start: xor ah, ah int 16h ; pobieramy znak z klawiatury call obs_key jmp start ;---------------------------------------------------------------------------------------------------- ------------- ;---------------------------------------------------------------------------------------------------- ------------- char: ;procedura wyświetla znak i przesuwa kursor ;wejście: al: znak, bl: atrybut push bx ;kładziemy BX na stos, aby na końcu procedury go przywrócić push ax mov ah, 9 ;numer funkcji wyświetlającej znak w miejscu kursora xor bh, bh ;numer strony ustawiamy na 0 mov cx, 1 ;znak wyświetlimy 1 raz int 10h ;do dzieła! ;pobierz pozycje mov ah, 3 ;funkcja pobierania pozycji kursora xor bh, bh ;numer strony (0) int 10h ;odczytaj pozycje ;dodaj i zapisz pozycje add dl, 1 ;dodajemy 1 kolumnie mov ah, 2 ;funkcja zapisywania int 10h ;zapisz pozycje pop ax pop bx ;przywróć poprzedni stan BX ret ;wyjdź z podprogramu ;---------------------------------------------------------------------------------------------------- ------------- ;---------------------------------------------------------------------------------------------------- ------------- write: ;procedura wyświetla tekst na ekranie ;wejście: ax: wskaźnik do tekstu, bl: atrybut push ax mov si, ax ;musimy użyć rejestru segmentowego aby zaadresować wskaźnik pop ax .next: ;poczatek petli mov al, [cs:si];zapisz do al wartość aktualnego znaku (patrz parametry dla procedury char) cmp al, 0 ;porównaj aktualny znak z NULL je end ;jeśli są różne, skocz do wyjścia call char ;jeśli nie, wyświetl znak add si, 1 ;przesuń się w prawo do następnego znaku jmp .next ;skocz do początku pętli end: ;tutaj skoczymy, jeśli wystąpi NULL ret ;wyjdź z podprogramu ;---------------------------------------------------------------------------------------------------- ------------- ;---------------------------------------------------------------------------------------------------- ------------- reboot: jmp 0FFFFh:0000h ;skaczemy do FFFF:0000 ;---------------------------------------------------------------------------------------------------- -------------- ;---------------------------------------------------------------------------------------------------- -------------- label: mov ax, string mov bl, 2 call write ret ;---------------------------------------------------------------------------------------------------- -------------- ;---------------------------------------------------------------------------------------------------- -------------- obs_key: mov di, UserCmd cmp al, 20h je spacja cmp al, 08h je backspace cmp al,0dh je enter_key ;zwykły kod ASCII mov byte [di],al ; dodaj znak do bufora call char ret ;---------------------------------------------------------------------------------------------------- -------------- ;---------------------------------------------------------------------------------------------------- -------------- enter_key: call komenda ret ;---------------------------------------------------------------------------------------------------- -------------- ;---------------------------------------------------------------------------------------------------- -------------- komenda: restart: mov si, cmdReboot mov di, UserCmd mov cx, 7 repe cmpsb; porównanie łańcuchów zawartych w ES:[DI](komenda wprowadzana przez użytkownika) oraz w DS:[SI](wzorzec komendy) jne napis call reboot jmp koniec napis: mov si, cmdStr mov di, UserCmd mov cx, 4 repe cmpsb jne blad_komenda call label jmp koniec blad_komenda: mov ax, brak_komendy mov bl, 2 call write koniec: ret ;---------------------------------------------------------------------------------------------------- -------------- ;---------------------------------------------------------------------------------------------------- -------------- backspace: dec di ; zmniejsz bufor mov ah, 0Eh ; przesuń kursor w lewo wypisując backspace int 10h mov ah, 09h ; wyczyść znak pod kursorem nie przesuwając go mov al, ' ' mov bh, 0h mov bl, 07h mov cx, 1 int 10h jmp start ;---------------------------------------------------------------------------------------------------- -------------- ;---------------------------------------------------------------------------------------------------- -------------- spacja: push bx ;pobierz pozycje mov ah, 3 ;funkcja pobierania pozycji kursora xor bh, bh ;numer strony (0) int 10h ;odczytaj pozycje ;dodaj i zapisz pozycje add dl, 1 ;dodajemy 1 kolumnie mov ah, 2 ;funkcja zapisywania int 10h ;zapisz pozycje pop bx ret ;---------------------------------------------------------------------------------------------------- -------------- ;---------------------------------------------------------------------------------------------------- -------------- nowa_linia: mov ah, 0Eh mov al, 0Dh mov bh, 00h mov bl, 07h int 10h mov ah, 0Eh mov al, 0Ah mov bh, 00h mov bl, 07h int 10h ret ;---------------------------------------------------------------------------------------------------- -------------- ;---------------------------------------------------------------------------------------------------- -------------- [SEGMENT .data] os db 'PlOs beta ',0 cmdReboot db 'reboot',0 cmdStr db 'abc',0 brak_komendy db 'Nie znana komenda',0 string db 'wynik komendy abc',0 [SEGMENT .bss] UserCmd resb 40h

Jest to system, który na starcie ustawia stos w trybie chronionym, tryb tekstowy. Na samym początku, tuż po załadowaniu wyświetla napis i czeka na przyjęcie komend od użytkownika. Dwie podstawowe komendy to "abc", która wyświetla napis oraz "reboot", która restartuje komputer. Jednak jest pewien problem, bo po wpisaniu byle czego, a nawet po naciśnięciu entera bez wpisywania niczego też tak się dzieje. Co jest tego przyczyną ?

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •