apple iphone assembly inline-assembly

iphone - clips apple



¿Cómo hago el montaje en línea en el iPhone? (4)

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

Entonces, solo debes desactivar el Thumb para aplicaciones como juegos en 3D ...

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


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

¿Que es exactamente lo que está buscando? Podría darle algunos ejemplos si lo desea.

EDITAR:

Acabo de descubrir 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 de 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 el ensamblador ARM en línea, 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; }


He conseguido que esto funcione, gracias a alguna ayuda interna en los Apple Devforums , deberías registrarte si eres un desarrollador de iPhone dedicado.

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

En segundo lugar, de forma predeterminada, XCode genera un objetivo de compilación que compila el ensamblaje en línea con el conjunto de instrucciones ARM Thumb, por lo que usat no se reconoce como una instrucción adecuada. Para solucionar esto, haz "Obtener información" en el objetivo. Desplácese hacia abajo a la sección "GCC 4.0 - Generación de código" y desmarque "Compilar para pulgar". Entonces, este fragmento de código siguiente se compilará correctamente 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. Pero TargetConditionals.h tiene define que puedes #ifdef contra. A saber, TARGET_OS_IPHONE y TARGET_IPHONE_SIMULATOR .


Los registros también se pueden usar de manera explícita en el as en línea

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