Pergunta

Lembro-me de algumas regras de um tempo atrás (pré-32bit processadores Intel), quando era bastante frequente (pelo menos para mim) ter que analisar a saída de montagem gerada por C / C compiladores ++ (no meu caso, a Borland / Turbo em Naquele tempo) para encontrar gargalos de desempenho, e misturar com segurança montagem rotinas com código C / C ++. Coisas como usar o SI inscrever para o este ponteiro, AX sendo usado para valores de retorno, que registra devem ser preservadas quando um assembly rotina retorna, etc.

Agora eu queria saber se há alguma referência para os C compiladores mais populares / C ++ (Visual C ++, GCC, Intel ...) e processadores (Intel, ARM, ...), e se não, onde encontrar o peças para criar um. Ideias?

Foi útil?

Solução

Você está perguntando sobre "interface binária de aplicação" (ABI) e convenções de chamada. Estes são tipicamente definida por sistemas operacionais e bibliotecas, e aplicada por compiladores e ligantes. Google para "ABI" ou "convenção de chamada." Alguns pontos a partir de Wikipedia e Debian para ARM .

Outras dicas

Agner Fog de "Convenções de chamada", resume documentos, entre outras coisas, o Windows e Linux 64 e ABIs de 32 bits: http://www.agner.org/optimize/calling_conventions.pdf . Veja a Tabela 4 na p.10 para obter um resumo do uso de registo.

Um aviso da experiência pessoal: não incorporar suposições sobre a ABI na linha de montagem. Se você escrever uma função em linha de montagem que assume retorno e / ou transferência de parâmetros em registos específicos (por exemplo, eax, idi, rsi), ele vai quebrar se / quando a função é inlined pelo compilador.

Open Watcom C / C ++ suportes compilador duas convenções de chamada, com base em registar (padrão) e baseado em pilha (muito próximo ao que outros compiladores usar). Guia do Usuário para este compilador descreve os dois e está disponível gratuitamente on-line , juntamente com o compilador si . Você pode encontrar estes tópicos no Guia do Usuário especialmente útil:

  • 10.4.1 Passando argumentos Usando convenções de chamada Register-base
  • 10.4.6 Usando convenções de chamada Stack-base
  • 10,5 convenções de chamada para aplicativos baseados em 80x87

Bem, hoje se otimização está ligado, há ar não qualquer. Mas GCC permite que você declare que a sua instrução de montagem deve usar determinada variável, independentemente se é no registo ou não, ou mesmo para forçar GCC tu colocar essa variável em um utilizável registo com a sua instrução. Você também pode declarar que registra a sua linha de montagem bloquear reservas para si (assim compilador deve gerar apropriate save / restore código em torno de sua peça em linha, se necessário)

Eu acredito, mas sou de nenhuma maneira certo de que GCC usa a Itanium ABI para a maioria de sua função; as incompatibilidades entre ele ea ABI ele usa são documentado .

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