Autor Thema: Adressierungsarten  (Gelesen 2227 mal)

bscreator

  • Gast
Gespeichert
« 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



Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 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.
Dieser Text wird unter jedem Beitrag angezeigt.

bscreator

  • Gast
Gespeichert
« Antwort #2 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 ?


Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 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]
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen