Pergunta

Como é feito? Quais os passos que eu preciso tomar e quais armadilhas e armadilhas estão lá para considerar?

Foi útil?

Solução

Eu recebi este ao trabalho, graças a alguma ajuda dentro sobre a a Apple Devforums , você deve inscrever-se se você é um desenvolvedor de iPhone dedicado.

A primeira coisa é em primeiro lugar, é __ asm __ () , não plain asm () .

Em segundo lugar, por padrão, XCode gera um alvo de compilação que compila in-line assembly contra o conjunto de instruções ARM Thumb, então usat não foi reconhecido como uma instrução adequada. Para corrigir isso, "Get Info" no alvo. Desça até a seção "GCC 4.0 - Geração de código" e desmarque a opção "Compile para Thumb". Então este seguinte trecho irá compilar apenas multa se você definir o SDK ativo para "Device"

inline int asm_saturate_to_255 (int a) {
  int y;
  __asm__("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a));
  return y;
}

Naturalmente, agora não vai funcionar com o iPhone Simulator. Mas TargetConditionals.h tem define você pode #IFDEF contra. Ou seja, TARGET_OS_IPHONE e TARGET_IPHONE_SIMULATOR .

Outras dicas

Eu escrevo um pouco de ARM Cortex-A8 montagem de código. A CPU do iPhone é um ARM11 (afaik) para o conjunto de instruções do núcleo é o mesmo.

O que exatamente você está procurando? Eu poderia dar alguns exemplos, se quiser.


EDIT:

Eu só descobri que no iPhone você tem que usar o compilador LLVM-gcc. Tanto quanto eu sei que deve compreender a sintaxe inline assembler do GCC. Se assim toda a linha ARM tutoriais assembler irá funcionar no iPhone também.

Aqui está uma função inline assembler muito mínima (em C). Poderia, por favor me diga se ele compila e funciona no iPhone? Se ele funciona posso reclamar um pouco como fazer coisas útil em ARM em linha assembler, especialmente para a arquitetura ARMv6 e as extensões DSP.

inline int saturate_to_255 (int a)
{
  int y;
  asm ("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a));
  return y;
}

deve ser equivalente a:

inline int saturate_to_255 (int a)
{
  if (a < 0) a =0;
  if (a > 255) a = 255;
  return a;
}

Os registros também podem ser usados ??de forma explícita na linha asm

void foo(void) {
#if TARGET_CPU_ARM64
    __asm ("sub        sp, sp, #0x60");
    __asm ("str        x29, [sp, #0x50]");
#endif
}

Thumb é recomendado para aplicação que não requerem operação flutuador pesado. Thumb faz com que o tamanho do código menor e resultados também em uma execução de código mais rápido.

Assim, você só deve virar Thumb off para aplicação como jogos 3D ...

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