2008-10-26 19 views

Respuesta

18

He conseguido que esto funcione, gracias a un poco de ayuda en el interior sobre el Apple Devforums, usted debe registrarse si usted es un desarrollador de iPhone dedicado.

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

En segundo lugar, por defecto, XCode genera un objetivo de recopilación que recopila ensamblado en línea contra el conjunto de instrucciones ARM pulgar, por lo usat no se reconoció como una instrucción apropiada. 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". A continuación, este fragmento siguiente se compilará bien si se establece el SDK activa a "dispositivos"

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 va a trabajar con el simulador de iPhone. Pero TargetConditionals.h tiene define que puedes #ifdef contra. A saber, TARGET_OS_IPHONE y TARGET_IPHONE_SIMULATOR.

+2

Creo que te refieres a __asm ​​__() en lugar de simple asm(). –

+0

¿Por qué no funciona con el simulador de iPhone? ¿Es que ningún ensamblaje funciona en el simulador, o es que debe tener un conjunto diferente de instrucciones de ensamblaje porque se está ejecutando en i386? – Roberto

+0

@Roberto: lo tienes. El simulador se ejecuta en x86, por lo que no puede ejecutar el ensamblado de ARM. Simplemente no compilará. –

11

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.

¿Qué estás buscando exactamente? Podría darle algunos ejemplos si lo desea.


EDIT:

Me acabo de enterar que en el iPhone tiene que utilizar el compilador gcc-llvm. 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; 
} 

debe ser equivalente a:

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

No he podido obtener esto compilado. He estado intentando a través del XCode de Apple. El compilador está configurado en GCC 4 de manera predeterminada. Si lo compilo usando eso se queja de una instrucción inválida 'usat' y si lo configuro usando llvm-gcc se queja de una arquitectura inválida, 'armv6'. –

+0

prueba gcc -O3 -march = prueba armv6.c –

+0

no es llvm-gcc en realidad un compilador que se dirige a la máquina virtual llvm? – artificialidiot

0

El dedo pulgar se recomienda para la aplicación que no requiere 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.

lo que sólo debe girar pulgar para aplicaciones como juegos en 3D ...

+3

En realidad, como regla, usar el conjunto de instrucciones Thumb es significativamente más lento que usar el conjunto de instrucciones ARM. Como regla general (sin juego de palabras), ganas 1/3 en el tamaño del código y pierdes 1/3 de velocidad. Ver por ej. http://www.arm.com/pdfs/Thumb-2CoreTechnologyWhitepaper-Final4.pdf –

1

Los registros también se pueden utilizar de forma explícita en asm en línea

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