Pregunta

¿Cómo se hace? ¿Qué pasos debo seguir y qué trampas y errores hay que considerar?

¿Fue útil?

Solución

He conseguido que esto funcione, gracias a la ayuda interna de Devforums de Apple , deberías Regístrate si eres un desarrollador de iPhone dedicado.

Lo primero es lo primero, es __asm ??__ () , no es simple asm () .

En segundo lugar, de forma predeterminada, XCode genera un objetivo de compilación que compila el conjunto en línea contra el conjunto de instrucciones ARM Thumb, por lo que usat no se reconoció como una instrucción adecuada. Para solucionar esto, haz " Obtener información " en el objetivo. Desplácese hacia abajo hasta la sección " GCC 4.0 - Generación de código " y desmarque " Compilar para el pulgar " ;. Luego, este fragmento de código siguiente se compilará correctamente si configuras el Active SDK en "Dispositivo" "

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

Naturalmente, ahora no funcionará con el simulador de iPhone. Pero TargetConditionals.h define que puedes #ifdef en contra. A saber, TARGET_OS_IPHONE y TARGET_IPHONE_SIMULATOR .

Otros consejos

Escribo un poco de código ensamblador ARM Cortex-A8. La CPU del iPhone es un ARM11 (afaik), por lo que el conjunto de instrucciones básicas es el mismo.

¿Qué es exactamente lo que estás buscando? Podría darte algunos ejemplos si quieres.


EDITAR:

Acabo de descubrir que en el iPhone tienes que usar el compilador llvm-gcc. Por lo que sé, debería comprender la sintaxis del ensamblador en línea de GCC. Si es así, todos los tutoriales de ensamblador en línea ARM funcionarán también en el iPhone.

Aquí hay una función de ensamblador en línea muy mínima (en C). ¿Podría decirme si se compila y funciona en el iPhone? Si funciona puedo decir un poco cómo hacer cosas útiles en el ensamblador en línea ARM, especialmente para la arquitectura ARMv6 y las extensiones DSP.

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

debería ser equivalente a:

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

Los registros también se pueden usar explícitamente en línea asm

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

Se recomienda el pulgar para aplicaciones que no requieran una operación de flotación pesada. Thumb reduce el tamaño del código y da como resultado una ejecución más rápida del código.

Por lo tanto, solo debes desactivar Thumb para aplicaciones como juegos 3D ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top