[asm] własny os

0

Cześć, znalazłem ostatnio art'a
i bardzo sie tym zainteresowałem, i chciałem dorobic coś od siebie, lecz nie zanam asma ;( . Mam dwa pytania: 1) Jak zrobic (w jadrze) żeby wyświetlany tekst był linijka pod linijką czyli wstawić enter pod koniec kazdej zmiennej? 2) jak zrobić aby klawisze coś robiły :P czyli np. zeby spacjia wypisała na ekranie jakąś zmienna, próbowałem to zrobić i wyszło mi to

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

;wyświetlamy komunikat
mov ax, welcome  ;wskaźnik do tekstu
mov bl, 2        ;na zielono
call write       ;wykonujemy procedurze

mov ax, name     ;wskaźnik do tekstu
mov bl, 5        ;na fioletowo
call write       ;wykonujemy procedurę

mov ax, last     ;wskaźnik do tekstu
mov bl, 2        ;na zielono
call write       ;wykonujemy procedurę

;główna petla
start:
  xor ah, ah   ;takie xorowanie jest szybsze od mov ah, 0
  int 16h      ;i w AH mamy scancode, w AL kod ASCII klawisza
  mov ax, asd     ;wskaźnik do tekstu
  mov bl, 5        ;na fioletowo
  cmp al, 20h  ;tu chciałem porównac spacjie z al
  call write  ;a tu wywołac procedure
  cmp al, 1Bh    ;porownaj al z 1Bh (kod ASCII klawisza ESC)
  je reset     ;jeśli równe, skocz do procedury resetowania (napiszemy później)
  jmp start    ;powracamy na początek

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ć

  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 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

  mov si, ax        ;musimy użyć rejestru segmentowego aby zaadresować wskaźnik
  .next:            ;początek pętli
    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ą roż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

reset:
  mov bx, 40h               ;używamy BX do zapisania wartości w rejestrze segmentowym
  mov ds, bx                ;BX ładuje w DS
  mov word [ds:72h], 1234h  ;ustawiamy gorący reset
  jmp 0FFFFh:0000h          ;skaczemy do FFFF:0000

;zmienne
welcome: db "Witaj w ",0
name:    db "Krzeslo Operating System",0
asd      db " moj tekst ",0
last:    db ', wciśnij ESC aby zrestartowac komputer :)',0

Skompilowałem to, uruchomiłem kompa od nowa i kazdy klawisz wypisywał zmienna "asd" i nie mogłem zresetowac kompa klawiszem esc. Może ktoś wie gdzie tu jest błąd?? Prosze o pomoc, i dziekuje tym co mi jej udzielą. :) (Najlepiej jak któs by umieścił kawałek poprawionego kodu)

//polecam tag <asm> - M
mtz: dzięki, ale po co odkopywać takie stare tematy, już dawno zapomniałem o tym osie :P

0

eh
Jeszcze nikt ci cie odpowiedział to ja musze.
po prostu instrukcjia powónania cmp al, 20h nie ma przypisanego zadnego skoku czyli robisz to całe porównanie bez sensu bo nic z niego nie wynika. Muszisz dopisać po nim jakąś instrukcjie soku warunkowego.

1

Przejrzałem kod. Wiem że dopiero się zacząłem pisać w asm, ale jest mały błąd funkcja porównania musi być przed funkcją która wypisuje text. Najlepszym z tego rozwiązaniem jest stworzenie nowej funkcji i jesli al =spacja to wykonuje twoją funkcje. :-)

1

twoja_funkcja:
mov ax, asd ;wskaźnik do tekstu
mov bl, 5 ;na fioletowo
call write ;a tu wywołac procedure
ret

start:
xor ah, ah ;takie xorowanie jest szybsze od mov ah, 0
int 16h ;i w AH mamy scancode, w AL kod ASCII klawisza
cmp al, 20h ;tu chciałem porównac spacjie z al
call twoja_funkcja

xor ah,ah
int 16h
cmp al, 1Bh ;porownaj al z 1Bh (kod ASCII klawisza ESC)
je reset ;jeśli równe, skocz do procedury resetowania (napiszemy później)
jmp start

myśle, ze to powinno pomóc

0
batas2 napisał(a)

mtz: dzięki, ale po co odkopywać takie stare tematy, już dawno zapomniałem o tym osie :P

Dla potomnych [green]

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.