Como eu faço em linha de montagem no iPhone?
-
04-07-2019 - |
Pergunta
Como é feito? Quais os passos que eu preciso tomar e quais armadilhas e armadilhas estão lá para considerar?
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 ...