[ASM] Bootsector (cosik nie zgrzyta)

0
org 7C00h

start:
  ;tryb tekstowy 80x25
  xor ah, ah
  mov al, 03h
  int 10h

  mov ax, loading
  call string

  jmp loader

  ;wypisuje ciag znakow na ekranie
string:
  mov si, ax
  .next:
    mov al, [cs:si]
    cmp al, 0
    je end
    call write
    add si, 1
  jmp .next
  end:
ret

  ;podprogram do 'string'
write:
  mov ah, 9
  xor bh, bh
  mov bl, 15
  mov cx, 1
  int 10h
 
  mov ah, 3
  xor bh, bh
  int 10h

  inc dl

  mov ah, 2
  int 10h
ret

loader:
  mov ah, 2
  mov al, 12
  mov ch, 0
  mov cl, 2
  mov dh, 0
  mov bx, 0800h
  mov es, bx
  xor bx, bx
  int 13h

  jmp 0800h:0000h

; *** DANE ***
loading db 'Loading System MOOS...',0

times 510 - ($ - start) db 0

db 55h
db 0AAh

Proszę o połatanie bootsektora, nie wiem na co choruje :(

0

Może mi się coś pomieszało... ale czy tam na początku, kiedy nie ustawiłeś jeszcze es, call jest poprawne? Bo przecież adres powrotny musi być odłożony na stos, a tego stosu jeszcze nie ma...

0

hmm... tylko, że w pliku systemowym (ładowanym do pamięci) nie posiadam też stosu i operuje na takich ciągach bez problemu, jak i obsługuje klawiaturę i parę klawiszy funkcyjnych ;) A wszystko to bez używania stosu [diabel]

PS: Wyświetla mi 'Loading System MOOS...' i na tym koniec. (stacja dyskietek w ciągłym ruchu...)

0

Dodaj na początek blok parametrów nośnika. Jak wygląda i co w nim powinno być znajdziesz w internecie.

Poza tym radził bym zamienić:
times 510 - ($ - start) db 0
na
times 510 - ($ - $$) db 0

Jeżeli sam nie wiesz co nie działa to skąd wiesz, że coś nie działa. Nie rozumiem jaki masz problem ?

0
Nevar napisał(a)

Jeżeli sam nie wiesz co nie działa to skąd wiesz, że coś nie działa. Nie rozumiem jaki masz problem ?

Poprawnie działający kod załadował by mi 12 sektorów z stacji dyskietek zaczynając od 3 sektora, pod adres 0800h:0000h, a następnie skoczył pod wskazany adress i dalej wykonywał kod (kernel+command_line).

Aktualne działanie bootloadera wygląda w ten oto sposób:

  1. Informuje mnie, o rozpoczęciu ładowania kodu z dyskietki,
  2. Jednostka centralna zawiesza się równocześnie "mieląc" dyskietkę bez ustanku.
Nevar napisał(a)

Dodaj na początek blok parametrów nośnika.

Blok parametrów nośnika jest zbędny.

To jest czysta porcja kodu bootsektora:

org 7C00h

start:

  mov ah, 2
  mov al, 12
  mov ch, 0
  mov cl, 2
  mov dh, 0
  mov bx, 0800h
  mov es, bx
  xor bx, bx
  int 13h

  jmp 0800h:0000h

times 510 - ($ - start) db 0

db 55h
db 0AAh

Jedyne pytanie, dlaczego wersja zmodyfikowana nie działa prawidłowo?

0

a ja wygląda twój kernel? najlepiej zrób jakieś prymitywny, wyświetlający jedynie tekst.

0
org 0000h

start:
  ;tryb tekstowy 80x25
  xor ah, ah
  mov al, 03h
  int 10h

  ;informacja dla mnie ;)
  ;240 (czarne na bialym tle)
  ;79 (biale na czerwonym tle)

  call status

cmd:

; wycięte

jmp cmd

; wyciete


  ;znak zachety
status:
  ;ustawienie kursora
  mov ah, 02h
  mov bh, 0
  mov dh, 18h
  mov dl, 00h
  int 10h

  mov ax, status2
  call string

  ;ustawienie kursora na poczatek
  mov ah, 02h
  mov bh, 0
  mov dh, 00h
  mov dl, 00h
  int 10h

  mov ax, status1
  call string

  ;ustawienie kursora na poczatek
  mov ah, 02h
  mov bh, 0
  mov dh, 01h
  mov dl, 00h
  int 10h
ret

  ;podprogram do 'string'
write:
  mov ah, 9
  xor bh, bh
  mov bl, 79
  mov cx, 1
  int 10h
 
  mov ah, 3
  xor bh, bh
  int 10h

  inc dl

  mov ah, 2
  int 10h
ret

  ;wypisuje ciag znakow na ekranie
string:
  mov si, ax
  .next:
    mov al, [cs:si]
    cmp al, 0
    je end
    call write
    add si, 1
  jmp .next
  end:
ret

; *** DANE ***
status1 db 'System MOOS                                                   (tryb rzeczywisty)',0
status2 db '                                                                            v0.1',0     
0

Kernel działał dobrze więc zabrałem się za boot loader.
Podczas ładowania sektorów do pamięci za pomocą przerwania nie ustawiłeś parametru informującego o dysku. Zerknij dokładnie w dokumentacje przerwania 13h.

0

A racja.. nie zwróciłem uwagi na rejestr DL który po wyświetleniu napisu posiadał już wartość 16h ;-)
Wystarczy teraz tylko:

xor dx, dx

zamiast:

mov dh, 0

.

Działa ;] THx

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