Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: bscreator am 25. May 2011, 17:38

Titel: Adressierungsarten
Beitrag 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:0x0000funktioniert 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


Titel: Re:Adressierungsarten
Beitrag von: Jidder am 25. May 2011, 17:48
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.
Titel: Re:Adressierungsarten
Beitrag von: bscreator am 25. May 2011, 18:42
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 ?

Titel: Re:Adressierungsarten
Beitrag von: Jidder am 25. May 2011, 18:46
Erst das Offset, dann das Segment. Und der Sprung muss indirekt und far sein.

address:
     dw 0x0000 ; offset
     dw 0x0800 ; segment

     jmp far [address]