Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[fasm]Sektor nie jest wczytywany

Ostatnio zmodyfikowano 2016-11-08 19:00
Autor Wiadomość
Szustarol
Temat założony przez niniejszego użytkownika
[fasm]Sektor nie jest wczytywany
» 2016-09-26 21:08:05
witam!
nie wiem czemu, nie mogę wczytać drugiego sektora dysku, a przynajmniej nie mogę z tego miejsca nic wypisać.
Mógłby ktos wyjaśnic dlaczego to nie działa? Komunikat reached here się wyświetla więc nie mam pojecia czemu nie chce mi zaladowac drugiego sektora

org 0x7c00

use16

jmp start

writetoscreen:
mov ah, 0x0E
loopt:
lodsb
or al, al
jz printfinished
int 0x10
jmp loopt
printfinished:
ret

start:
mov si, startmsg
call writetoscreen
mov si, stage2msg
call writetoscreen

.reset:
mov ah, 0
mov dl, 0
int 0x13
jc .reset


.readsec:
mov ax, 0x1000
mov es, ax
xor bx, bx
mov ah, 0x02
mov al, 1
mov ch, 1
mov cl, 2
mov dh, 0
mov dl, 0
int 0x13
jc .readsec

mov si, dbgmsg
call writetoscreen

jmp 0x1000:0x0

mov si, dbgmsg
call writetoscreen

startmsg db "Welcome to RyjOS, booting up", 0x0A, 0x0D,  0x0
stage2msg db "Will now load remaining bootlaoder code...", 0x0A, 0x0D, 0x0
dbgmsg db "Reached here", 0x0A, 0x0D, 0x0
times 510 - ($-$$) db 0x0
dw 0xAA55
;==============================================
;SECTOR 1 ENDS HERE
;=============================================
org 0x1000
mov si, loaded
call writetoscreen
jmp $

loaded db "Loaded second stage. Proceeding to load kernel", 0x0A, 0x0D, 0x0

times 512  - ($-$$) db 0x0

P-152064
Rashmistrz
» 2016-10-12 20:56:53
Widzę, że nie źle się bawisz... ;D

Możemy się trochę nie dogadać,
bo ja korzystam z NASMa, a ty z FASMa.
___________________________________________

Pierwszy błąd:
mov dl, 0
'
Numer "urządzenia" z którego nastąpiło bootowanie
jest tam wpisywane przez BIOS,
więc nie powinieneś tego numeru zmieniać.
(Wykomentuj sobie tą instrukcję
dając średnik na początku lini :D )

Drugi błąd: (Tak na prawdę są to dwa problemy)
;==============================================
;SECTOR 1 ENDS HERE
;=============================================
org 0x1000
Asembler zakłada, że początek tego kodu na pewno
znajdzie się na 0x1000-tym bajcie od początku segmentu.
Później... gdzieś dalej tworzysz symbol loaded,
który znajduje się gdzieś kilkanaście bajtów dalej. (np. 0x1012)
Dlaczego to sprawia problem? Zaraz do tego wrócimy.

Według tego co wyczytałem pod etykietką .readsec:
(Pomijając na siłę wybrany numer "urządzenia")
-dane ładujesz pod ES:BX, czyli u Ciebie 0x1000:0000
-ładujesz jeden sektor  z 2giego cylindra? // 2gi sektor jest na 1szym cylindrze...
( Twój CHS : 1 0 2 (2gi cylinder, jego 1sza głowica, 2gi sektor tej głowicy ) )
// Co ty tam trzymasz? 2gi sektor całej dyskietki jest "pod" pierwszym cylindrem! :
// CHS : 0 0 2 (tylko sektory są od 1 do 63, liczy się je normalnie, czyli nie "offsetowo")
Poczytaj Int 13/AH=02h
// na szczęście przypadkiem cały kod powinien się "tam" zmieścić,
// bo zajmuje wraz z tym "stringiem" mniej niż 512B

Miejsce gdzie załadowałbyś(Załadowałeś nie ten sektor co trzeba)
2gi sektor to (jak wcześniej napisałem) 0x1000:0000.
Natomiast string oznaczony symbolem loaded
załadowany został pod (przykładowym) adresem 0x1000:0012.
Jednak symbol loaded jest zrozumiany jako 0x1012,
bo użyłeś tam
org 0x1000
, czyli tak na prawdę
odwołujesz się do miejsca w pamięci gdzie nic nie wstawiałeś.

Jak dobrze pamiętam pamięć po włączeniu komputera
ma w każdej komórce ustawioną wartość na 0,
więc i tak by się nic nie wypisało.


Notes: Errors on a floppy may be due to the motor failing to spin up quickly enough; the read should be retried at least three times, resetting the disk with AH=00h between attempts.

Trzeci ... ? :
or al, al
'
Nie miało być czasem tam XOR do wyzerowania?

Czwarty błąd:
Wykonujesz operacje na stosie za pomocą call,
nie wiesz nawet co nadpisujesz,
bo nie zapewniłeś sobie miejsca.
Musisz ustawić odpowiednio SP i SS
(stack pointer i stack segment).
Za miejsce w pamięci które wybrałeś
sobie użyć, nie odpowiadam.

Sprawdź jeszcze:
jmp word 0x0000:start
'
niektóre biosy ładują pod segmentem 0x7c00,
a początek (org) jest wtedy pod 0x0000.

Polecam
jmp $
 zamienić na:

  halt:
  hlt  ; stays here forever
  jmp halt

___________________________________________

Polecam: Ralf Brown's Interrupt List

Nie zapomnij również... oh... Przykro mi...
Sam zapomniałem co w tym miejscu chciałem napisać.
Może myślałem o tym, żebyś
bardziej komentował kod w Assembly?!

Życzę powodzenia w dalszym pisaniu RyjOSa. ;D
Daj znać czy się udało i czy nadal są problemy.

Podrzuć kod po poprawkach.
P-152504
pekfos
» 2016-10-12 21:22:42
Trzeci ... ? :
or al, al
'
Nie miało być czasem tam XOR do wyzerowania?
Jest dobrze. or ustawia flagi dla skoków warunkowych pętli.
P-152505
Rashmistrz
» 2016-10-13 16:11:24
Jest dobrze. or ustawia flagi dla skoków warunkowych pętli.
Oh... Nie za bardzo wczytałem się w kontekst.
Nie widziałem po prostu od razu sensu użycia.

Dopiero zauważyłem, że on używa Int 10/AH=0EhVIDEO - TELETYPE OUTPUT do wypisywania znaków pojedynczo
zamiast od razu użyć Int 10/AH=13h VIDEO - WRITE STRING do wypisania wszystkich na raz.

Gdybym ja pisał to samo co on to bym użył
TEST al, al
 zamiast
OR al, al
.

EDIT: @pekfos:
Nie uznałem tego jako błąd,
tylko jako podejrzaną instrukcję.


P-152522
pekfos
» 2016-10-13 16:27:22
Oh... Nie za bardzo wczytałem się w kontekst.
Największy możliwy błąd przy czytaniu kodu w tak kontekstowym języku ;)
P-152523
Rashmistrz
» 2016-10-13 17:32:29
Nie miałem obowiązku analizować każdej instrukcji,
więc tego nie zrobiłem, bo problem nie leży w wypisywaniu.

Przeszukiwałem ten kod jedynie pod względem problemu autora tematu.
Więc nie nabijaj się ze mnie i nie rób dramatu o to, że niby nie wiem co dana instrukcja robi, bo wiem co robi. Tylko muszę wiedzieć dlaczego to robi, a nie inaczej. D:<

EDIT1:
Jeśli chcesz to możesz zyrknąć jak
zrobiłem to samo tylko że w NASMie:
[NASM] Bootsector

EDIT2:
Podsumuję krótko istniejące błędy:
  • -nadpisujesz "numer" urządzenia w rejstrze DL.
  • -ładowany jest nie ten sektor
  • -wypisujesz string loaded z miejsca w pamięci,
    gdzie on się tak na prawdę nie znajduje.
  • -nie przygotowałeś własnego stosu do użycia

PS.
Wiedz, że oczekuję odpowiedzi
czy wszystko jest w porządku.
Nie zostawiaj mnie w niepewności. :<
P-152524
Rashmistrz
» 2016-11-08 17:43:45
po prostu uzyłem extended write i działa jak nigdy wcześniej :D
Nie mam pojęcia czym to jest i w jaki sposób to naprawiło.
Jeśli to jest padding/align drugiego originu to marnujesz miejsce,
a z resztą problemów miałeś szczęście, że Ci nic nie poleciało.

Testowałeś swój bootsector na realnym x86 czy tylko VMce?

EDIT:
Zamieść rozwiązanie. Jestem ciekaw.
Gdzie ten "extended write" dałeś?
Nie mogę go znaleźć w dokumentacji FASM'a,
a przeszukiwanie przerwań jest dość toporne.
P-153480
Szustarol
Temat założony przez niniejszego użytkownika
» 2016-11-08 19:00:17
Probowalem tylko na qemu

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; STAGE 1 BOOTLOADER                    ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

use16;generate 16 bit code
org 0x7c00
jmp start

writestring:
push ax ; saving ax register because it is used in this func
mov ah, 0x0E
loopt:
lodsb
or al, al
jz endedprint
int 0x10
jmp loopt
endedprint:
pop ax
ret

start:
mov si, startmsg
call writestring ;print welcome message
;reset registers
xor ax, ax
mov ds, ax
mov ss, ax
mov es, ax
mov fs, ax
mov [0x500], dl ;drive number to 0x500

mov sp, 0x7000 ;setup stack here
mov si, 0x7c00 ;copy from this address
mov di, 0x7a00 ;copy here
mov ax, di ;save address we are copying to to al
mov cx, 0x200 ;copy 512 bytes so 200 hex
rep movsb ;copy

mov si, relocsucc-0x200
call writestring-0x200

mov bx, mbr_main
sub bx, 0x200 ;have to recalculate mbr main position since we relocated 200 hex bytes
jmp bx ;jump to mbr main
;extended read here
mbr_main:
mov word [dap_data.cnt-0x200], 0x7f; read 127 sectors- maximum some phoenix bioses can handle
mov dword [dap_data.dst-0x200], 0x7c00 ;read to this address
mov dword [dap_data.srcl-0x200], 0x01 ;2nd on LBA so 1 since it counts from 0
mov dword [dap_data.srch-0x200], 0x00;
mov dl, [0x500];restore drive number
mov ah, 0x42;function 42 hex
mov si, dap_data-0x200;pointer to DAP
int 0x13;interrupt 13 hex
push 0x7c00;address we will jump to
ret
;ret will jump to stage2



dap_data:
.size: db 0x10 ;packet size
db 0x00 ; must be 0
.cnt: dw 0x0000 ;how many packets to transfer
.dst dd 0x00000000 ;adress where to transfer
.srcl dd 0x00000000 ;Logical adress, lower 32 bits
.srch dd 0x00000000 ;higher bits

startmsg db "Welcome, booting up", 0x0A, 0x0D, 0x00 ;line feed and return here
relocsucc db "Relocating MBR successfull", 0x0A, 0x0D, 0x00
times 510-($-$$) db 0 ;fill remaining space with zeroes
dw 0xAA55;boot signature
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;ENDING OF SECTOR ONE       ;;
;;SECTOR TWO STARTS HERE AT ADDR 0X7C00       ;;
;;BECAUSE WE JUMPED TO IT IN MBR_MAIN         ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
P-153484
« 1 »
  Strona 1 z 1