Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bitmaster am 14. July 2006, 15:34
-
hi,
da der fasm im 64 Bit mode keinen Far jmp machen kann wollte ich fragen wie das manuell geht. Also ich meine fasm kann das nicht:
jmp Seg:Off
Und manuell weiß ich leider nicht wie das im 64 Bit Mode geht. Das funktioniert z.B. nicht:
db 0EAh
dq Off
dw Seg
Bis jetzt mache ich das so:
push Seg
push Off
retf
Aber das ich ja kein Far-jmp. Leider habe ich keine Infos dazu gefunden. Ich schätze man muss da noch prefixe reinmachen. Nur welche?
bitmaster
-
So, nach etlichem Suchen habe ich es nun doch selber gefunden. So geht es:
jmp far [jmp64]
jmp64:
dd Lmode1
dw 1 shl 3
Lmode1:
jmp $
bitmaster
-
Hi,
ich gehe mal davon aus das du im LongMode arbeitest. Nun das Problem: da die Segementierung in diesem Modus abgeschafft wurde, gibt es keinen wirklichen 64bit far-jump! Deswegen wird sich auch FASM dagegen wehren! Ich wüsste auch nicht so wirklich wofür man den brauchen könnte. Dein RETF-Workaround ist fast die einzige Möglichkeit. Andererseits könntest du auch noch an eine im Speicher gehaltene Adresse springen (indirekter FarJump), allerdings nur mit 16/32Bit Offsets. Schau mal ins AMD64 Manual 3, da stehen die Instruktionen und die Einschränkungen drin.
-
@n3Ro: Toll und ich such mich die ganze Zeit im AMD64 Manual 1 dusselig. ^^