Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

loading kernel i ispisivanje stringova

[es] :: Kernel i OS programiranje :: loading kernel i ispisivanje stringova

[ Pregleda: 4444 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

glupi

Član broj: 836
Poruke: 199
*.cmu.carnet.hr.



Profil

icon loading kernel i ispisivanje stringova17.12.2004. u 23:40 - pre 235 meseci
Imam jedan problem koji vjerujem da nije kompliciran za rijesit ali meni predstavlja problem. Imam loader koji ide na prvi sektor diskete i koji ispise nesto i ucita kernel koji se isto nalazi na disketi iza loadera. On ljepo ucita taj kernel (dobro nije to kernel ali ce valjda postat jednog dana) i mogu iz njega ispisivat karaktere ali ne i stringove. Zasto i kako?
Probao sam i sa forom call pa pop adresu stringa ali isto nije htio ispisat string.


loader
Code:

[ORG 0]
jmp 07C0h:start

banner  db      '_______ Loader',13,10,0

start:
        mov ax, cs
        mov ds, ax
        mov es, ax

        mov si, banner
stat:
        lodsb

        cmp al, 0
        je reset_floppy

        mov ah, 0Eh
        mov bx, 7
        int 0x10

        jmp stat


reset_floppy:                     
        mov ax, 0          
        mov dl, 0           
        int 13h            
        jc reset_floppy            


read_floppy:
        mov ax, 1000h       
        mov es, ax          
        mov bx, 0           

        mov ah, 2           ; Load disk data to ES:BX
        mov al, 12          ; Load 5 sectors
        mov ch, 0           ; Cylinder=0
        mov cl, 2           ; Sector=2
        mov dh, 0           ; Head=0
        mov dl, 0           ; Drive=0
        int 13h             ; Read!
        jc read_floppy             

        mov ah,0eh
        mov al, 41h
        mov bx, 7
        int 0x10

        jmp 1000h:0000      ; Jump to the program


times 510-($-$$) db 0
dw 0AA55h



kernel
Code:


[ORG 0]

jmp main

s_mesg  db      'kernel v0.1 LOADED',13,0
s_help  db      'H - help',13,10,'R - reboot',13,10,0

main:
        mov si, s_mesg
        call prints
        mov si, s_help
        call prints
        jmp read

prints:
        lodsb

        cmp al, 0
        je read

        mov ah, 0Eh
        mov bx, 7
        int 0x10

        jmp prints
        ret

read:
        xor ah,ah ;u al slovo
        int 0x16

        cmp al, 48h
        call help
        cmp al, 52h
        jmp reboot

        call printc
        jmp read

help:
        mov si, s_help
        call prints
        ret

printc:
        mov ah, 0Eh
        mov bx, 7
        int 0x10
        ret

reboot:
        int 0x19
 
Odgovor na temu

BaCkSpAcE

Član broj: 10
Poruke: 518
*.vdial.verat.net.



Profil

icon Re: loading kernel i ispisivanje stringova02.01.2005. u 00:07 - pre 234 meseci
Greska je u tzv. kernelu:
Code:
 
read:
        xor ah,ah ;u al slovo
        int 0x16

        cmp al, 48h
        call help
        cmp al, 52h
        jmp reboot

        call printc
        jmp read


Ne mozes posle cmp da ides call, vec moras neki jump, ali sa nekim uslovom (je, jne, jz...)... U tvom slucaju bi najbolje bilo da umesto call help napises je help, ali bi onda morao i help da prepravis... posto ga vise ne pozivamo sa call, onda nam ne treba ret, vec umesto toga pisemo jmp read... To bi bilo to...
 
Odgovor na temu

glupi

Član broj: 836
Poruke: 199
*.cmu.carnet.hr.



Profil

icon Re: loading kernel i ispisivanje stringova02.01.2005. u 15:13 - pre 234 meseci
Hvala, to nisam ni skuzio, ali mene muci drugi problem, kako ispisat string. Npr ako ucitam ovo umjesto onog kernela ispisat ce 9 puta '=' ali ne i string? Ako stavim bez onog jmp tst na pocetku nece nista ispisat. Moguce da on ne moze pocitat x_msg, kako da strpam string u memoriju i da mogu radit sa njim?
Code:

[ORG 0]
jmp tst
x_mesg  db      'string',13,10,0

 tst:       mov ah, 9
            mov al, '='
            mov bx, 7
            mov cx, 10
            int 0x10

 mov si, x_mesg

prints:
        lodsb
        cmp al, 0
        je ble
        mov ah, 0Eh
        mov bx, 7
        int 0x10
        jmp prints

ble:
        jmp ble
 
Odgovor na temu

BaCkSpAcE

Član broj: 10
Poruke: 518
*.dial.InfoSky.Net.



Profil

icon Re: loading kernel i ispisivanje stringova03.01.2005. u 02:56 - pre 234 meseci
Nisam trenutno u mogucnosti da isprobam ovaj tvoj novi kernel, kad budem stigao probacu, ali probaj prvo da premestis ceo onaj red x_mesg db 'string',13,10,0 na sam kraj tvoj kernel.asm fajla... pa javi rezultate...
 
Odgovor na temu

glupi

Član broj: 836
Poruke: 199
*.cmu.carnet.hr.



Profil

icon Re: loading kernel i ispisivanje stringova03.01.2005. u 21:07 - pre 234 meseci
Nazalost nista se nije promjenilo kompajl prodje u redu i ispise 9 = ali ne i string ;(
 
Odgovor na temu

BaCkSpAcE

Član broj: 10
Poruke: 518
213.244.197.*



Profil

icon Re: loading kernel i ispisivanje stringova04.01.2005. u 16:09 - pre 234 meseci
A meni ispise: string==== i tu stane... Samo sto ja nisam uspeo nista sa tvojim boot loaderom... Evo ti jedan gotov (provereno radi) boot loader, pa probaj samo njega ubaci umesto tvog boot.asm pa onda sve to kompajliraj i probaj, pa javi rezultate... Moguce je i da nesto zeza tvoj bootloader...

Code:
 ;Milos-Bootsector by Timo Bettendorf
;[email protected]
;www.Bettendorf-Germany.de


[BITS 16]  ;the bios always starts in 16 bit-mode (real-mode)
[ORG 0]    ;we make a binary

        jmp short begin  ;wie must always jump in the real-mode
        nop                   ;you need this always


; I think the names show what what the things are for

        osname                  db 'Milos   '
        bytespersector          dw 0x200
        sectorspercluster       db 1
        reservedsectors         dw 1
        numberoffats            db 2
        rootdirectoryentries    dw 0x00E0
        totalsectors            dw 0x0B40
        mediadescriptor         db 0xF0
        sectorsperfat           dw 2
        sectorspertrack         dw 0x12
        numberofheads           dw 2
        hiddensectors           dd 0
        totalsectorshuge        dd 0
        drivenumber             db 0
        reserved                db 0
        signature               db 0x29
        volumeid                dd 0
        volumename              db 'NONAME     '
        filesystemtype          db 'FAT12   '

begin:

        cli                             ;we disable the interupts

        mov ax, 0x07C0
        mov ds, ax                      ;there is now ds-register, so we create one

        mov ax, 0x9000
        mov es, ax                      ;typlical place for the stack
        mov sp, 0x1FFF                 

        sti                             ;we can enable the interupts again

        mov [bootdrive], dl             ;we save the drive, we booted from

        call clrscr

        mov si, bmsg
        call print


        mov ax, 0x8000
        mov es, ax
        mov di, 0                     

        mov si, 0                

        mov cx, 512           
        cld                         
        rep movsb                       

        jmp 0x8000:relock      

relock:



        mov ax, 0x7000
        mov es, ax
        mov di, 0          

        mov ax, 0x0040
        mov ds, ax
        mov si, 0                  

        mov cx, 256               
        cld                          
        rep movsb                     

        mov ax, 0x8000
        mov ds, ax                  



        call reset_drv        ;we reset the drive
        jnc drv_ok

        mov si, derr
        call print

        call reboot

drv_ok:

        mov ax, 0x2000
        mov es, ax
        mov bx, 0                 
        mov al, 1                    
        mov cl, 2                     
        call read_sector


        mov ax, 0x2000
        mov ds, ax                
        jmp 0x2000:0x0000         ;jump to the kernel, we'll save it there



print:                            ;I use always the bios-interupts in the functions

        cld                           
        lodsb                           
        cmp al, 0
        jz print_done
        mov ah, 0x0E             
        int 0x10                   
        jmp print

print_done:

        ret



reset_drv:

        mov ah, 0                     
        int 0x13                   
        ret

read_sector

        mov ah, 0x02                    
        mov ch, 0                   
        mov dl, [bootdrive]         
        mov dh, 0                     
        int 0x13                      
        jc read_sector

        ret    

clrscr:
        mov al, 3              
        mov ah, 0                     
        int 0x10                        
        ret

reboot:
        mov si, pktr
        call print

        mov ah, 0                       
        int 0x16                        
        jmp 0xFFFF:0x0000   
                                                      ;some text and at the end things for the file

        bmsg db 'Executing Bootsector...', 13, 10, 0
        pktr db 'Remove your Floppy-Disk and press a key!', 13, 10, 0   ;pktr: press key to reboot

        derr db 'Drive error', 13, 10, 0

        bootdrive db 0



        times 510-($-$$) db 0        
        dw 0xAA55
 
Odgovor na temu

glupi

Član broj: 836
Poruke: 199
*.cmu.carnet.hr.



Profil

icon Re: loading kernel i ispisivanje stringova04.01.2005. u 19:37 - pre 234 meseci
Stavio sam ovaj tvoj bootloader i ispise executing bootsector i ====== ali ne i string?? Inace za testiranje koristim bochs, jel ima to mozda utjecaja?
 
Odgovor na temu

BaCkSpAcE

Član broj: 10
Poruke: 518
*.vdial.verat.net.



Profil

icon Re: loading kernel i ispisivanje stringova04.01.2005. u 23:49 - pre 234 meseci
Malo sam ti reorganizovao tvoj kernel.asm... Imas dosta gresaka u boot.asm, ali je dobro za pocetak... Cini mi se da imas nesto problema sa stackom, ali nema veze, mozes i ovako da radis, i obavezno sad otvori A20, protected mode (ili koji vec hoces)...

Code:
[ORG 0]

tst:
        mov ah, 0x0E
        mov al, '='
        mov bx, 0x0007
        mov cx, 10
        int 0x10

        mov si, x_mesg

prints:
        mov al,[cs:si]
        or al,al
        jz short ble
        mov ah, 0x0E
        mov bx, 0x0007
        int 0x10
        inc si
        jmp prints

ble:
        jmp ble

x_mesg db 'string',13,10,0


Umesto da ides u si mozes i u di samo je potrebno malo da izmenis kod i to je to...
 
Odgovor na temu

glupi

Član broj: 836
Poruke: 199
*.cmu.carnet.hr.



Profil

icon Re: loading kernel i ispisivanje stringova05.01.2005. u 19:08 - pre 234 meseci
BaCkSpAcE puno hvala na odgovorima i pomoci ;) Ovo napokon radi. Ali ne na uobicajeni nacin na koji sam ja to kompajlirao, ja sam prije stavljao %include boot.asm i %include kern.asm u fajl pa onda sa nasm-om kompajlirao taj fajl, te ga sa dd om zapisivao na disketu. Tu je ujedno i problem jer ako na taj nacin kompajliram nemogu ispisat string, dok ovaj isti prog kad zasebno kompajliram boot i kern te svakoga zapisem sa ddom posebno radi i ispise =string.
Sada napokon mogu krenut dalje ;)
 
Odgovor na temu

BaCkSpAcE

Član broj: 10
Poruke: 518
*.vdial.verat.net.



Profil

icon Re: loading kernel i ispisivanje stringova05.01.2005. u 22:23 - pre 234 meseci
Ja ga uvek tako i kompajliram posebno. Evo mog redosleda:
nasm boot.asm -f bin -o boot.bin
nasm kernel.asm -f bin -o kernel.bin
dd if=boot.bin of=floppy.img(ili /dev/fd0)
dd if=kernel.bin of=floppy.img bs=512 seek=1

ovo zadnje bs i seek je da bi preskocio prvih 512 bajtova pri upisu... Slobodno se javi ako imas jos nekih problema, pa cemo pokusati zajednicki da ih resimo... p0zdrav
 
Odgovor na temu

[es] :: Kernel i OS programiranje :: loading kernel i ispisivanje stringova

[ Pregleda: 4444 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.