[ASM] Bootloader freezed

Pagina: 1
Acties:

  • JoostBaksteen
  • Registratie: December 2000
  • Laatst online: 27-03 19:32
Nav het topic van JayTaph ben ik bezig met een bootloader te schrijven, ik wil een lijst maken van alle files en dat je dan kan kiezen welke file je wilt laden.

Ik heb de code van JayTaph een beetje gemod en nu laat hij alleen nog de files zien enzo, dat werkt goed, met input heb ik me nog niet echt bezig gehouden, dat is ook niet het probleem.

Aan gezien ik er ook wel een mooi ascii-menuutje in wil maken (soort readme zeg maar) red ik het niet in 512 bytes. Dus heb ik de 'the ultimate boot-strap loader' gebruikt als bootsector om zo mijn second stagebootloader te laden (http://www.ansanest.com/josh/boot.asm).

Maar ik heb echt een vaag probleem. Als ik dmv PrintMsg een string wil printen:

(onderstaande code is allemaal mijn second stage bootloader)

GAS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   mov si, msgTest
   call PrintMsg

PrintMsg:
    cld
    lodsb            ; Laad uit DS:SI naar AL
    cmp    al,0
    jz    End_Of_String    ; Is het een 0, dan einde
    dec    cx        ; Maximaal aantal karakters geprint?
    jz    End_Of_String
    ;printchar
    mov    ah,0x0E        ; BIOS functie 15
    mov    bx,0x000    ; Print op page 0 in kleur 7
    int    0x10 

    jmp    PrintMsg    ; En volgende character
End_Of_String:   
    ret


Laat hij het niets zien. Of hij laat de message van de bootsector zien (zie verder in de post), maar daar heb ik volgens mij niks mee te maken aangezien ik iets in SI zet... dus dat snap ik niet helemaal, ben zelf een beetje verder gaan kijken en heb nog wat raars ontdekt:

Dit is zeg maar de code:

GAS:
1
2
3
4
5
6
7
8
9
10
11
12
[BITS 16]
    mov    al, '.'            ; puntje in het al register, die gaat hij dan printen
    mov    ah,0x0E        ; BIOS functie 15
    mov    bx,0x000    ; Print op page 0 in kleur 7
    int    0x10    ; print dat puntje 
    int    0x10 
    int    0x10
    int    0x10
   [ect]

   [lees alle bestanden op het floppy en laat deze zien]
   [stop een message ("press any key to reboot") in SI en call printMsg, w8 op key, reboot]


Wat heb ik uitgevonden:

De bootsector zegt: "Loading Boot Image".

Als ik int 10 5keer aanroep (in mijn bootloader is dat dus) laat hij niet press
any key to reboot zien maar "Image" dit komt dus uit de bootsector.
Roep ik hem 6 keer aan dan staat er "Ima", bij 7 keer "I", en bij 8 keer helemaal niks.

Bij "> 8 AND < 17" freezed hij helemaal, hij laat keurig de puntjes zien, maar het floppy lampje blijft branden en hij gaat niet verder.

Als ik hem 17 keer aanroep dan laat hij keurig "Press any key to reboot" zien.
Bij 18 keer laat hij de eerste 2 letters niet zien, bij 19 keer eerste 4 niet etc...

Ik snap er helemaal niks meer van..... 8)7 Hopelijk snappen jullie het wel :P

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
code:
1
2
mov    ah,0x0E        ; BIOS functie 15
mov    bx,0x000       ; Print op page 0 in kleur 7

0x0E is 14, 15 is 0x0F maar ik weet ff niet uit me hoofd welke je precies moet hebben.
0x000 geeft kleur 0 (zwart) op page 0, dus dat moet of 0x0700 of 0x0007 zijn, afhankelijk of bh of bl de kleur moet hebben, weet ik ook ff niet uit me hoofd.

Een int 10 is na compilen 2 bytes, bij elke extra int 10 verdwijnen er 2 bytes van de tekst.
Dus ik denk dat je grootte van je gecompilde bootsector meer is dat 512 bytes?

Als je geen of onzin tekst op je scherm krijgt dan kan het ook zijn dat er een segment of offset niet goed staat.
Vanavond thuis kan ik het ff beter kijken, heb hier geen compiler.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • JoostBaksteen
  • Registratie: December 2000
  • Laatst online: 27-03 19:32
Het klopt helemaal (wat je zegt) :o, de comment klopt niet:
Int 10/AH=0Eh - VIDEO - TELETYPE OUTPUT (ralph brown's int list)
In principe moet de bootsector ook een bootloader kunnen laden van meer dan 1 sector. Maar de bootloader is 494 bytes ( heb net even die nopjes niet meegecompiled ). Dat moet dus lukken...

Terwijl ik naar school ben geweest is bochs gecompiled, daar ga ik nu even mee stoeien, misschien dat ik dan wat meer debug informatie krijg.

[ Voor 3% gewijzigd door JoostBaksteen op 13-11-2003 16:48 ]


  • JoostBaksteen
  • Registratie: December 2000
  • Laatst online: 27-03 19:32
Ahh, ben alweer een stukje verder, bochs is wel handig, nu heb ik:
Next at t=639198
(0) [0x0000ffc8] 0000:ffc8 (unk. ctxt): push cs ; 0e
<bochs:137> s 1
========================================================================
Bochs is exiting with the following message:
[CPU ] CPU shutting down due to lack of stack space, SP==1
========================================================================
Nu nog uitzoeken wat dat precies betekent en hoe dat komt.
AoA:
The cs register points at the segment containing the currently executing machine instructions. Note that, despite the 64K segment limitation, 8086 programs can be longer than 64K. You simply need multiple code segments in memory. Since you can change the value of the cs register, you can switch to a new code segment when you want to execute the code located there.
Hij staat ook op 0000:ffc8...