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 1000hWarum 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 0x0000das 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.