Boot Programm: "hello world"?



  • Original erstellt von -bg-:
    Wichtig ist noch das am Anfang du davon ausgehen musst, dass ALLE Register Müll enthalten (ausser CS und EIP natürlich).

    Schön wärs...leider gtibt es ja viele Wege im Realmode um die physikalische Adresse 0x07c00 anzusprechen. Das netteste wäre natürlich 0x07c0:0000, aber viele Rechner (meiner z.B.) machen einem nicht das vergnügen und dann stimmen Referenzen auf Speicherstellen leider nicht mehr. den Code ab 0x07c00 kann man nämlich genausogut über 0x07b0:0100 anspringen etc. Deswegen sollte der Bootsektor immer anfangen mit

    org 07C00h
     jmp 0x07c0:start
    start:
    

    damit auch alles stimmt...man sollte diese erste Zeile in -bg-s prog einfügen am anfang 🙂



  • Original erstellt von -bg-:
    mov ax, 0A00h
    mov es, ax

    Wohin sollte der Text in deinem Beispiel denn kopiert werden 😕
    Ist bei 0A000 irgendwas besonderes?

    [ Dieser Beitrag wurde am 29.08.2002 um 16:11 Uhr von Nobuo T editiert. ]



  • An A000h ligt der Graphikspeicher. Allerdings hab ich da nen Fehle gemacht, dass muss B800h sein, denn A000h ist für die Graphikmodi zuständig, und B800h für Textmodi.
    Dadurch, dass ich den Text darein kopiere wird er auf dem Monitor dargestellt.
    Allerdings hab ich gleich noch nen Fehler gemacht, unzwar darf man die Bytes nicht direkt naeinander in den Speicher kopieren, denn auf jedes Textbyte, folgt noch ein byte mit Attributen (Vor- und HintergrundFarbe).

    Die korrigierte Fassung:

    org 07C00h  ;das Prog wird an 7C00 geladen und von dort gestartet
    start:
     db 0xEA ;jmp DWORD 0x07C0:start2
     dw start2
     dw 0x07C0
    start2:
     mov ax, 0B80h
     mov es, ax
     mov ax, cs
     mov ds, ax
     mov si, msg
     xor di, di
     mov cx, msg_len
    
     mov ah, 70h ;irgend ein Farbcode
    
    cpyl:
     lodsb
     stosw
     loop cpyl
    
    hang: jmp hang
    
    msg db "Hello World!!!"
    msg_len equ $-msg
    
    ; Falls du einen Writer benutzt,
    ; der nicht automatisch die Signatur anhängt:
    
    times (510 + start - $) db 0
    dw 0AA55h
    

    hmm der jmp ging nicht so wie ich dachte, obwohl ihn die doc auch so beschreibt (???).
    Wegen den Farbcodes muß ich nochmal nachschaun.

    mfg
    -bg-



  • Original erstellt von -bg-:
    **An A000h ligt der Graphikspeicher. Allerdings hab ich da nen Fehle gemacht, dass muss B800h sein, denn A000h ist für die Graphikmodi zuständig, und B800h für Textmodi.
    **

    so weit richtig... Ich wollte dich auch nur darauf hinweisen, dass Du in deinem Codeausschnitt nicht A0000 (hier liegt die VGA) sondern 0A000 (hier liegt... gar nichts 😃 ) addressiert hast. 😉

    **
    mov ax, 0B80h
    mov es, ax
    **

    Und hier machst Du den gleichen Fehler ja schon wieder...
    Du musst 0B800h in ES schreiben.

    Die Farbcodes sind uebrigens (wenn niemand in der Palette rumgefummelt hat) auch ziemlich schlicht definiert:
    Die Werte fuer die jeweils 16 vorder- und hintergrundfarben lassen sich so berechnen:
    Bit Bedeutung
    Vordergrund:
    0 Blau (1=an/0=aus)
    1 Gruen (1=an/0=aus)
    2 Rot (1=an/0=aus)
    3 Intensitaet (1=hell/0=dunkel)
    Hintergrund:
    4 Blau (1=an/0=aus)
    5 Gruen (1=an/0=aus)
    6 Rot (1=an/0=aus)
    7 Blink (1=schrift blinkt/0=normal)

    Bsp:
    01 (0000 0001) ist blau auf schwarz (Vordergrund Blau an/alles andere aus)
    09 (0000 1001) ist hellblau auf schwarz (Vordergrund Blau an+Intensitaet gesetzt/alles andere aus)
    1E (0001 1110) ist Gelb auf Blauem Hintergrund



  • Stimmt, da hab ich mich glatt wieder vertan *urgs*.
    So was kommt halt vor wenn man die Sachen nach knapp nem Jahr so aus dem Gedächtnis zusammensucht *fehlerrechtfertigen*.
    Aber den Sprung nimmt nasm in der Syntax:

    jmp WORD 07C0h:start2
    

    immer noch nicht.
    Hast du dafür eine Lösung? (ich benutze nasm 0.98.34)



  • Aber sicher doch 😃

    jmp 07C0h:start2
    


  • nochwas wegen der organisation...also dem schönen org am Anfang. Ich habe als bewährten Startup:

    org     0
            jmp     0x07c0:boot_startup
    boot_startup:
    

    weil nasm sonst evtl. die offsets anders berechnet und im Segment ist ja die erste Zeile praktisch offset 0



  • Original erstellt von Nobuo T:
    **Aber sicher doch 😃

    jmp 07C0h:start2
    

    **

    Welchen nasm benutzt du?
    bei mir gibt das immer schöne meldungen ala:
    "invalid combination of opcodes and operands"
    und mit dem far Statement gibt es noch mehr Terz.
    Oder machst du das mit TASM oder womit?



  • Ich habe das ganze mict NASM 0.98.?? (KA) compiliert.
    (Befehlszeile: NASM16 -fbin -oc:\Bla\bla.com c:\bla\bla.asm)

    hier mal der gesamte testcode:
    (nicht ausfuehren, ist nur zur Veranschaulichung 😉 )

    [org 0100h]
    [section .text]
    jmp 0000h:1234h
    


  • Uff, danke für die vielen Antworten. Ich hoffe nur, dass ich das jetzt ungefähr hin bekomme, wenn selbst ihr schon Probleme bekommt *args*. Ich arbeite übrigens unter Linux un wollte daher mal diesen "bb" befehl ausprobieren. Allerdings hat mir eine ledierte Diskette das /dev/fd0 gesprengt. Linux meint jetzt ich hätte kein Diskettenlaufwerk *grübel*. Aber was hat es mit "bb" auf sich? Ich kenne den Befehl so garnicht.

    DANKE
    healscar



  • Der befehl heißt aber eigenltich dd 🙂
    dd kopiert binärblöcke, und zwar in diesem Fall einen 512-Byte-Block von Festplatte nach /dev/fd0 also der Diskette. Die Diskette ist net lädiert sondern hat halt jetzt nen neuen Bootsektor mit der Folge dass natürlich kein Dateisystem wie FAT mehr drauf zu erkennen ist. Wenn du mit DOS-foarmet oder dem Linux-Äquivalent wieer FAT-Strukturen drauf anlegen lässt, funzt die Diskette wieder normal nur halt ohne deinen Bootsektor 🙂



  • Hierbei gibt es nur ein Prob: MS-Format ist ein bissel bloede und kann den Header im Bootsektor nicht wieder herstellen... (gibt dann Fehler Spur 0 fehlerhaft oder sowas)
    Da musst man vorher mit FDisk oder anderen format-tools ran.


Anmelden zum Antworten