Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[NASM] Bootloader



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Elektronika, programowanie niskopoziomowe
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
nwxxeh



Dołączył: 21 Kwi 2007
Posty: 824

PostWysłany: Sob Mar 31, 2012 3:49 pm  OP    Temat postu: [NASM] Bootloader Odpowiedz z cytatem Pisownia

Znalazłem fajny przykład bootloadera i dokumentacje przerwań w BIOSie w wikipedii.

Próbowałem przerobić kod bootloadera, aby zaczął robić coś więcej niż wywalać "Hello World":
Kod:
[BITS 16]    ;szesnastobitowiec :D
[ORG 0x7C00]    ;offset

CALL DrawTenLines    ;rysujemy
JMP $         ;zwieszamy

DrawOneLine:
MOV EAX, 0x00 ;x = 0

nextpixel:
MOV AH, 0x09 ;numer funkcji - WritePixelOnScreen [wiki]
MOV AL, 0x05 ;kolorek - Magenta
MOV BH, 0x00 ;Numer strony
MOV CX, [EAX] ;x
MOV DX, [EBX] ;y
INT 0x10 ;Przerwanie video - BIOS
ADD EAX, 0x01 ;Dodajemy jeden :D
CMP EAX, 0x10 ;if (x == 10) {
JE exitfunc ;wyjdz z funkcji } else {
JNE nextpixel ;nastepny pixel }
exitfunc: ;wychodzimy :D
RET

DrawTenLines: ;rysujemy kilka linii, ale nie dziesiec :D
MOV EBX, 0x00 ;y = 0
CALL DrawOneLine
MOV EBX, 0x01 ;y = 1
CALL DrawOneLine
MOV EBX, 0x02 ;y = 2
CALL DrawOneLine
MOV EBX, 0x03 ;y = 3
CALL DrawOneLine
MOV EBX, 0x04 ;y = 4
CALL DrawOneLine
MOV EBX, 0x05 ;y = 5
CALL DrawOneLine
RET

;Data

TIMES 510 - ($ - $$) db 0    ;Wypelniacze
DW 0xAA55            ;Sygnaturka bootu :D


Lecz jest problem - kod nie działa - tzn. nie drukuje linii, tylko działa fragment:
Kod:
JMP $         ;zwieszamy


W czym jest problem? Poprawiałem kilka rzeczy. Testowane na VirtualBoxie.

EDIT: Kompiluję z -f bin / wyświetlanie tekstu działa bezbłędnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
biernik



Dołączył: 06 Wrz 2008
Posty: 1148
Skąd: 63°59'39''N 22°38'11''W

PostWysłany: Sob Mar 31, 2012 4:08 pm      Temat postu: Re: [NASM] Bootloader Odpowiedz z cytatem Pisownia

Nie analizowałem kodu, tylko pierwsze co się rzuca w oczy:
nwxxeh napisał:
CMP EAX, 0x10 ;if (x == 10) {

_________________
I like cheese.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
nwxxeh



Dołączył: 21 Kwi 2007
Posty: 824

PostWysłany: Sob Mar 31, 2012 5:02 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

EDIT: biernik, co nie tak w tym kodzie?

Testowałem inny kod:
Kod:
[BITS 16]    ;16bit
[ORG 0x7C00]    ;offset

MOV AH, 0x00
MOV AL, 0x13
MOV AX, 0x4F02
MOV BX, 0x102
INT 0x10
MOV AH, 0x09 ;WritePixelOnScreen [wiki]
MOV AL, 0x05 ;color - White
MOV BH, 0x00 ;page no.
MOV CX, 1 ;x
MOV DX, 1 ;y
INT 0x10 ;interrupt
MOV CX, 2 ;x
MOV DX, 1 ;y
INT 0x10 ;interrupt
MOV CX, 3 ;x
MOV DX, 1 ;y
INT 0x10 ;interrupt
JMP $         ;hang

;Data

TIMES 510 - ($ - $$) db 0    ;filler
DW 0xAA55            ;boot signature


Ten kod daje to co widać w załączniku.

Po 2-gie w pierwszym kodzie zapomniałem dać zmiany trybu video, ale teraz też nie działa :/



bios_video.png
 Opis:
To co wychodzi.

Pobierz
 Nazwa pliku:  bios_video.png
 Wielkość pliku:  6.38 KB
 Pobierano:  208 raz(y)

Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
biernik



Dołączył: 06 Wrz 2008
Posty: 1148
Skąd: 63°59'39''N 22°38'11''W

PostWysłany: Sob Mar 31, 2012 6:25 pm      Temat postu: Odpowiedz z cytatem Pisownia

nwxxeh napisał:
EDIT: biernik, co nie tak w tym kodzie?

No to, że 0x10 != 10 :)

_________________
I like cheese.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
nwxxeh



Dołączył: 21 Kwi 2007
Posty: 824

PostWysłany: Sob Mar 31, 2012 6:42 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

BIG EDIT: Problem całkowicie rozwiązany, działa (poniżej działający kod):
Kod:
[BITS 16]   ;16bit
[ORG 0x7C00]    ;offset

MOV AH, 0x00 ; change video mode
MOV AL, 0x13 ; 0x13
INT 0x10 ; interrupt
CALL DrawTenLines   ;lets draw
JMP $       ;hang it

DrawOneLine:
MOV CX, 0x00 ;x = 0

nextpixel:
MOV AH, 0x0C ;func number - WritePixelOnScreen [wiki]
MOV AL, 0x05 ;color - Magenta
MOV BH, 0x00 ;page no
INT 0x10 ;Video interrupt - BIOS
ADD CX, 0x01 ;add one :D
CMP CX, 10 ;if (x == 10) {
JE exitfunc ;exit function } else {
JNE nextpixel ;next pixel }
exitfunc: ;exit :D
RET

DrawTenLines: ;draw some lines
MOV DX, 0x00 ;y = 0
CALL DrawOneLine
MOV DX, 0x01 ;y = 1
CALL DrawOneLine
MOV DX, 0x02 ;y = 2
CALL DrawOneLine
MOV DX, 0x03 ;y = 3
CALL DrawOneLine
MOV DX, 0x04 ;y = 4
CALL DrawOneLine
MOV DX, 0x05 ;y = 5
CALL DrawOneLine
RET

;Data

TIMES 510 - ($ - $$) db 0   ;filler
DW 0xAA55           ;boot signature
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Elektronika, programowanie niskopoziomowe Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.13670 sekund, zapytan = 13
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |