¿Cómo hago el ensamblaje en línea en el iPhone?


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

Author: Hans Sjunnesson, 2008-10-26

4 answers

He conseguido que esto funcione, gracias a un poco de ayuda interna en el Devforums de Apple, debes registrarte si eres un desarrollador de iPhone dedicado.

Lo Primero es lo primero, es __asm__(), no llanura asm().

En segundo lugar, por defecto, XCode genera un destino de compilación que compila el ensamblaje en línea contra el conjunto de instrucciones ARM Thumb, por lo que usat no fue reconocido como una instrucción adecuada. Para arreglar esto, haz "Get Info" en el Objetivo. Desplácese hacia abajo a la sección "GCC 4.0 - Generación de código" y desmarque "Compilar para pulgar". Luego, este siguiente fragmento se compilará bien si configura el SDK activo 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. But TargetConditionals.h ha definido you can # ifdef against. A saber, TARGET_OS_IPHONEy TARGET_IPHONE_SIMULATOR.

 18
Author: Hans Sjunnesson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-25 12:43:18

Escribo bastante código ensamblador ARM Cortex-A8. La CPU en el iPhone es un ARM11 (afaik) por lo que el conjunto de instrucciones del núcleo es el mismo.

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


EDITAR:

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

Aquí hay una función de ensamblador en línea muy mínima (en C). ¿Podría decirme si compila y funciona en el iphone? Si funciona puedo despotricar un poco sobre cómo hacer cosas útiles en ARM inline assembler, 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;
}

Debe ser equivalente a:

inline int saturate_to_255 (int a)
{
  if (a < 0) a =0;
  if (a > 255) a = 255;
  return a;
}
 11
Author: Nils Pipenbrinck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-26 14:14:21

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

void foo(void) {
#if TARGET_CPU_ARM64
    __asm ("sub        sp, sp, #0x60");
    __asm ("str        x29, [sp, #0x50]");
#endif
}
 1
Author: Kamil.S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-27 13:53:28

El pulgar se recomienda para aplicaciones que no requieren una operación de flotación pesada. Thumb hace que el tamaño del código sea más pequeño y resulta también en una ejecución de código más rápida.

Por lo que solo debe desactivar el pulgar para aplicaciones como juegos 3D...

 0
Author: catlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-30 13:31:02