|
[ glupi @ 17.12.2004. 23:40 ] @
| 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
|
[ BaCkSpAcE @ 02.01.2005. 00:07 ] @
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...
[ glupi @ 02.01.2005. 15:13 ] @
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
[ BaCkSpAcE @ 03.01.2005. 02:56 ] @
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...
[ glupi @ 03.01.2005. 21:07 ] @
Nazalost nista se nije promjenilo kompajl prodje u redu i ispise 9 = ali ne i string ;(
[ BaCkSpAcE @ 04.01.2005. 16:09 ] @
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
[ glupi @ 04.01.2005. 19:37 ] @
Stavio sam ovaj tvoj bootloader i ispise executing bootsector i ====== ali ne i string?? Inace za testiranje koristim bochs, jel ima to mozda utjecaja?
[ BaCkSpAcE @ 04.01.2005. 23:49 ] @
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...
[ glupi @ 05.01.2005. 19:08 ] @
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 ;)
[ BaCkSpAcE @ 05.01.2005. 22:23 ] @
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
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|