Wywołaj wskaźnik bezwzględny w kodzie maszynowym x86

Jaki jest „prawidłowy” sposóbcall wskaźnik bezwzględny w kodzie maszynowym x86? Czy jest dobry sposób, aby to zrobić w jednej instrukcji?

Co jachcieć do zrobienia:

Usiłuję zbudować rodzaj uproszczonego mini-JIT (nadal) w oparciu o "wątek podprogramu". Zasadniczo jest to najkrótszy możliwy krok od interpretera kodu bajtowego: każdy opcode jest zaimplementowany jako osobna funkcja, więc każdy podstawowy blok kodów bajtowych może być „JITted” w nową własną procedurę, która wygląda mniej więcej tak:

{prologue}
call {opcode procedure 1}
call {opcode procedure 2}
call {opcode procedure 3}
...etc
{epilogue}

Chodzi o to, że rzeczywisty kod maszynowy dla każdego bloku można po prostu wkleić z szablonu (w razie potrzeby rozszerzając środkową część), a jedynym bitem, który musi być „dynamicznie” obsługiwany, jest kopiowanie wskaźników funkcji dla każdego opkodu do właściwe miejsca jako część każdej instrukcji połączenia.

Problem, który mam, to zrozumienie, co należy użyćcall ... część szablonu. Wydaje się, że x86 nie jest skonfigurowany z myślą o takich zastosowaniach i faworyzuje połączenia względne i pośrednie.

Towygląda tak jak ja mogę użyćFF 15 EFBEADDE lub2E FF 15 EFBEADDE wywołać funkcję hipotetycznie wDEADBEEF (w zasadzie odkryto je poprzez umieszczenie rzeczy w asemblerze i deasemblatorze i zobaczenie, co przyniosło prawidłowe wyniki,nie przez zrozumienie tego, co robią), ale nie rozumiem rzeczy o segmentach i przywilejach i powiązanych informacjach wystarczająco dobrze, aby zobaczyć różnicę, ani jak będą się one zachowywać inaczej niż częściej spotykanecall instrukcja. Podręcznik architektury Intel sugeruje również, że są one ważne tylko w trybie 32-bitowym i „nieprawidłowe” w trybie 64-bitowym.

Czy ktoś może wyjaśnić te kodeksy i jak lub czy użyłbym ich lub innych do tego celu?

(Istnieje również oczywista odpowiedź na użycie połączenia pośredniego poprzez rejestr, ale wydaje się, że jest to „błędne” podejście - zakładając, że instrukcja bezpośredniego połączenia rzeczywiście istnieje).

questionAnswers(2)

yourAnswerToTheQuestion