Fehler im CODE?



  • Hallo hier ist ein code aus meinem DISK-Bootloader :
    **mov ax, 1000h ; ES:BX = 1000:0000
    mov es, ax ;
    mov bx, 0000h ;

    mov ah, 02h ; Load disk data to ES:BX
    mov al, 6 ; Load 6(3 KB) sectors
    mov ch, 0 ; Cylinder=0
    mov cl, 2 ; Sector=0
    mov dh, 0 ; Head=0
    mov dl, 0 ; Drive=0
    int 13h ; Read!

    jmp 1000h ; Jump to the program**

    also das müsste doch funktionieren das er dann zum programm springt oder ?

    MFG

    LordHoto



  • Noe. Das da unten ist kein FAR-Jump.

    Sowas hier wuerde es eher tun:

    db 0EAh
    dw 0000h ;Ziel-Offset 0000h
    dw 1000h ;Ziel-Segment 1000h
    


  • Hä?

    Sag mal genauer bitte ich kapier das net ganz. 😕

    MFG

    LordHoto



  • Du laedtst den Code deines OS oder was auch immer nach 1000h:0000h. Dann musst Du auch zu dieser Addresse springen, um den dort abgelegten code auszufuehren: cs:1000h (zu dieser Addresse wird in deinem code gesprungen) ist aber in diesem Fall vermutlich nicht das gleiche wie 1000h:0000h. (sonst waere es sinnvoll gewesen, das anzugeben ;))

    Mein code-beispiel enthaelt einfach den OpCode fuer einen FAR-Jump mit direkt angegebener Zieladdresse. (Segment:Offset-Addresse)



  • Also wie soll ich das jetzt in meinem Programm machen? 😕 😕



  • Einfach deinen rel. Jump durch den OpCode fuer den FAR-Jump ersetzen:

    mov ax, 1000h ; ES:BX = 1000:0000
    mov es, ax ;
    mov bx, 0000h ;
    mov ah, 02h ; Load disk data to ES:BX
    mov al, 6 ; Load 6(3 KB) sectors
    mov ch, 0 ; Cylinder=0
    mov cl, 2 ; Sector=0
    mov dh, 0 ; Head=0
    mov dl, 0 ; Drive=0
    int 13h ; Read!
    
    db 0EAh
    dw 0000h ;Ziel-Offset 0000h
    dw 1000h ;Ziel-Segment 1000h
    


  • db 0EAh
    dw 0000h ;Ziel-Offset 0000h
    dw 1000h ;Ziel-Segment 1000h
    

    Warum direkt ein Opcode ?! Gibts da nicht einfach ein Befehl. Habe nämlich keine Interesse, den Aufbau von Opcodes zu lernen.



  • Also selbst wenn ich den code benutze passiert nix!

    Was kann ich jetzt machen?
    Oder wie würdet ihr den bootloader schreiben?



  • Original erstellt von darkpenguin:
    **```
    db 0EAh
    dw 0000h ;Ziel-Offset 0000h
    dw 1000h ;Ziel-Segment 1000h

    
      
      
    Warum direkt ein Opcode ?! Gibts da nicht einfach ein Befehl. Habe nämlich keine Interesse, den Aufbau von Opcodes zu lernen.**
    

    Ganz einfach: Weil man so furchtbar oft beim Programmieren dieses jmp ohne ein Label benutzt. (wie in diesem Beispiel) Ich kenne die Syntax fuer diese Art jump selbst net. 😉
    Und mit einem entsprechenden Kommentar ist das ja wohl durchaus annehmbar.

    @<LordHoto>:
    Wenn der oben gepostete Ausschnitt dein gesamter Bootloader ist, wuerde es mich auch nicht wundern, wenn Da nicht gescheites bei herauskommt.
    Schau dir mal die OS-Dev Linksammlung in der FAQ an.

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



  • Soweit ich weiß kann man beim NASM far jumps direkt mit Segment:Offset eingeben, ohne einzelne Bytes zu definieren.



  • klar, mag schon sein, aber nicht jeder benutzt nasm. die oben diskutierte version is ohnehin die geläufigere (die benutz ich auch)... und wer in assembler proggt, muss auch mal damit rechnen, mit hex/op-codes arbeiten zu müssen... (int is z.B. 0xCD (damit der heutigen tag nich umsonst war :-)) aber letztendlich ist es jedem seine eigene entscheidung 🙂

    cu todo



  • 😃 Dann wären wir schon an der Stelle, wo wir mit Notepad .com's schreiben. Die Sache an sich wäre nicht so kompliziert aber mod r/m bytes und sib bytes kapiere ich nicht.



  • Nein, mit dem Notepad wird's nicht klappen, da es nicht binär speichert 😉 Da musst du schon einen Hexeditor nehmen, das habe ich schonmal aus Spaß an der Freude gemacht, funktionierte auch 😃

    [ Dieser Beitrag wurde am 20.01.2003 um 18:06 Uhr von jantoware editiert. ]



  • Also,

    read_me:
    ; first, reset the disk controller
    xor ax, ax
    mov si, resetmsg
    call message
    int 0x13
    jc reboot ; reboot on error

    ; then load in the OS
    mov ax,1000h ; OS goes to 9000:0000 (above stack)
    mov es,ax
    mov bx,0000h

    ; I could condense a few of these high/low 8-bit movs into one 16-bit
    ; mov, but, for simplicity, I'll leave it as is, unless necessary.
    mov ah,02h ; to load!
    mov al,6 ; load 1 sectors
    mov ch,0 ; cylinder = 0
    mov cl,3 ; sector = 2 (starts at sector 1 not 0)
    mov dh,0 ; head = 0 = side one
    mov dl,0 ; disk = what we booted from
    int 13h ; read it
    jc read_me ; if there's an error then we'll try again.
    ; Often there is not error but requires a few
    ; tries. Ofcourse, this may end up as an
    ; infinite loop... but only on a bad disk...
    mov si,jumpmsg
    call message
    ; jump to the kernel that we've loaded in...
    db 0xEA
    dw 0x1000
    dw 0x0000

    das ist jetzt das was ich probiert habe (und was ich im FAQ gefunden habe)
    aber es funzt trozdem NICHT!! was kann ich jetzt machen?



  • Also wenn schon, dann bitte den vollstaendigen Code posten.
    z.B. fehlt die Procedure "message"

    xor ax, ax
    mov si, resetmsg
    call message
    int 0x13
    

    Ohne diese Proc wird es schwierig festzustellen, ob dieser Codeabschnitt so funktionieren kann.

    Generell ist es sinnvoll, die Register fuer einen Interrupt unmittelbar vor dem Aufruf zu setzen.
    Etwa so:

    mov si, resetmsg
    call message
    xor ax, ax
    xor dx, dx
    int 0x13
    

    So, das waers erstmal zu diesem Codestueck.
    Andere moegliche Fehlerquellen waeren dann noch dein eigentliches "OS" (der code, den Du in den Speicher laedst) bzw. dessen Position auf der Diskette usw.


Anmelden zum Antworten