Pergunta

Tenho que fazer uma interface (digamos, um invólucro) que permite uma chamada do código de montagem x86_64 usando sua convenção de chamada para a função C, com outra convenção de chamada. A melhor coisa seria ser bastante "compilador independente" (Juste modificando o invólucro), então estou procurando algo que coloque as coisas de registros/empilhamento no compilador de volta. Eu já olho aqui: Convenção de chamada personalizada para P/Invoke e C# E chegou perto do que estou a fazer. Atualmente, estou usando o GCC, mas dicas de outros compiladores são bem -vindos!

Então, aqui está a coisa, para uma melhor visão do problema (a convenção de codificação personalizada é estranha):

pushq  %r11    # saves r11 for call
movq 64bits_address %r11 # move a 64 bits address that points on a data structure
callq *8(%r11) # calls an address in the data structure
popq %r11      # restores %r11 ; return value is in the structure

Eu preciso poder chamar uma função "especial" (wrapper) C; Aqui o trabalho será despachar chamadas entre outras funções C. Portanto, esse invólucro precisa encontrar %R11, salvar todos os registros e preparar a pilha para mais uma chamada. Existe uma maneira adequada de fazer isso em C (com algum ASM embutido)?

Muito obrigado

Foi útil?

Solução

Para documentação sobre as convenções de chamadas e como o parâmetro é passado para uma função (em registros? Qual? O que está na pilha etc.) dê uma olhada Documento de Fog AGNER.

Então, você pode dar uma olhada libffiO código -fonte é para ver como eles fazem isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top