Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bscreator am 25. May 2011, 17:38
-
Hallo,
irgendwie hab ich noch Probleme mit dem JMP-Befehl.
Das Sprungziel ist an Adresse 0x0800:0x0000
bei
jmp 0x0800:0x0000
funktioniert der Sprung, bei
mov bx, 0x0800
mov es, bx
mov bx, 0
jmp es:bx
funktioniert der Sprung nicht.
Wo liegt der Fehler ?
Gruss,
bsc
-
Das funktioniert nicht, weil jmp es:bx nur ein jmp bx mit einem wirkungslosem Segment Override ist. Das es: gehört nicht zur Sprungadresse, sondern würde nur bei einem Speicherzugriff das Segment ändern, auf das sich das Offset bezieht.
Indirekte Sprünge musst du entweder über den Stack oder über eine Variable im Speicher machen.
-
Das mit dem Stack
push es
push bx
retf
kenn ich schon und funktioniert auch.
Aber das mit den Variablen wie z.B.
kernel_seg dw 0x0800
kernel_off dw 0x0000
...
jmp kernel_seg:kernel_off
geht leider auch nicht.
Was stimmt da wieder nicht ?
-
Erst das Offset, dann das Segment. Und der Sprung muss indirekt und far sein.
address:
dw 0x0000 ; offset
dw 0x0800 ; segment
jmp far [address]