Chame um ponteiro absoluto no código de máquina x86
Qual é o caminho "correto" paracall
um ponteiro absoluto no código de máquina x86? Existe uma boa maneira de fazer isso em uma única instrução?
O que euquer façam:
Eu estou tentando construir um tipo de mini-JIT simplificado (ainda) baseado em "threading de sub-rotina". É basicamente o passo mais curto possível de um intérprete de bytecode: cada opcode é implementado como uma função separada, então cada bloco básico de bytecodes pode ser "JITted" em um novo procedimento próprio que se parece com algo assim:
{prologue}
call {opcode procedure 1}
call {opcode procedure 2}
call {opcode procedure 3}
...etc
{epilogue}
Portanto, a idéia é que o código de máquina real para cada bloco pode ser simplesmente colado de um modelo (estendendo a parte intermediária conforme necessário), e o único bit que precisa ser tratado "dinamicamente" é copiando os ponteiros de função para cada opcode os lugares certos como parte de cada instrução de chamada.
O problema que estou tendo é entender o que usar para ocall ...
parte do modelo. O x86 não parece ter esse tipo de uso em mente e favorece as chamadas relativas e indiretas.
istoparece como eu posso usarFF 15 EFBEADDE
ou2E FF 15 EFBEADDE
para chamar a função hipoteticamente emDEADBEEF
(basicamente descobri isso colocando coisas em um montador e desmontador e vendo o que produzia resultados válidos,não entendendo o que eles fazem), mas eu não entendo o material sobre segmentos e privilégios e informações associadas bem o suficiente para ver a diferença, ou como elas se comportarão diferentemente de uma forma mais freqüentecall
instrução. O manual de arquitetura da Intel também sugere que eles sejam válidos apenas no modo de 32 bits e "inválidos" no modo de 64 bits.
Alguém pode explicar esses opcodes e como, ou se, eu usaria eles ou outros para esse propósito?
(Há também a resposta óbvia de usar uma chamada indireta por meio de um registro, mas essa parece ser a abordagem "errada" - supondo que realmente exista uma instrução de chamada direta.)