2009-10-16 45 views
13

Me gustaría comenzar a escribir el ensamblador ARM y ejecutarlo en el iPhone.Flujo de trabajo para escribir código ensamblador ARM en el iphone

Esto no es con la intención de usarlo en una aplicación que se lanzará a la tienda de aplicaciones - Básicamente me gustaría resolver problemas en ProjectEuler usando ARM y el iPhone, solo por afición y propósitos educativos.

¿Cómo puedo hacer esto? No he podido encontrar una forma de ejecutar un proyecto usando cualquier brazo escrito a mano.

Respuesta

8

No he podido encontrar ninguna información acerca de cómo escribir código ensamblador específicamente para el iPhone, pero al igual que las otras personas dijeron aquí, puede:

1) declaraciones en línea asm en C/Código C++/ObjC, o 2) escriba funciones de ensamblaje independientes en un archivo '.s' y simplemente agréguelo a sus fuentes de XCode, o 3) escriba funciones de ensamblaje independientes para un ensamblador externo como NASM. Escribe código de ensamblado en un archivo '.s' y genera un archivo de objeto '.o' usando NASM y vincula el archivo objeto con su proyecto en XCode.

Si solo intenta escribir algunas instrucciones de ensamblaje, entonces el ensamblador en línea sería la manera más fácil, pero si planea escribir varias funciones de ensamblaje, le recomendaría un archivo de ensamblaje independiente. Y si planea escribir muchas funciones de ensamblaje con macros y quiere compatibilidad multiplataforma, etc., le recomendaría utilizar NASM para compilar su código ensamblador en un archivo objeto. Porque estoy usando el ensamblador gcc de XCode y me falta bastante en comparación con NASM. Puede obtener NASM gratis en http://www.nasm.us/

¡Una vez que haya configurado su entorno de ensamblador, debe aprender a escribir el código de ensamblaje ARM! Porque el iPhone (y muchos otros dispositivos portátiles y teléfonos inteligentes) usan el conjunto de instrucciones ARM. Hay una introducción muy buena pero antigua al ensamblado de ARM en http://www.coranac.com/tonc/text/asm.htm.

Cuando se trata de programación de ensamblaje, el manual de referencia del juego de instrucciones oficial suele ser la principal fuente de información para todo lo que escriba, así que debe ir al sitio web de ARM y descargar ARM and Thumb-2 Quick Reference Card (6 páginas) y los 2 documentos completos para tu CPU exacta.

Por ejemplo, el iPhone 3GS y el iPhone 4 tienen una CPU ARMv7-A Cortex-A8, por lo que puede descargar ARM Architecture Reference Manual ARMv7-A and ARMv7-R Edition (2000 páginas) que le informa exactamente qué instrucciones están disponibles y cómo funcionan exactamente, y el Cortex™-A8 Technical Reference Manual que explica el tiempo de instrucción, etc. para su CPU específica.

+1

¿por qué recomendaría un ensamblador x86 para escribir ensambles ARM? – WinterMute

+1

¡Sí, realmente me acabo de dar cuenta de que NASM no es compatible con ARM, solo lo hace con x86! Soy bastante nuevo en el ensamblaje de ARM, por lo que no sé de un buen ensamblador de ARM que también sea gratuito, lo siento. –

6

Puede usar gcc para hacer asm inlines con __asm__, o simplemente obtener un gnu as para y escribir el código en archivos separados. No debería tener problemas con vincularlos más tarde a su proyecto, pero le sugiero que use el código c/Objective-C para terminar sus talones asm, ya que escribir la aplicación completa de iPhone en el ensamblador es algo difícil (necesita ser bastante bueno en el funcionamiento interno de ObjC).

Puede que le interese utilizar Makefiles personalizados, sin embargo, los proyectos de Xcode también deberían ser suficientes para la mayoría de las tomas.

+3

Las herramientas de desarrollo de iPhone incluyen un ensamblador, no hay necesidad de salir y obtener uno por separado. Puede incluir archivos .s en su proyecto XCode y "solo funcionará". –

+0

sí, eso * es * gnu como;) – Farcaller

4

Tenga en cuenta también que no hay nada de malo en incluir el ensamblaje en las presentaciones de la tienda de aplicaciones. Solo usa marcos que no son públicos en los que fruncen el ceño.

No les importa cómo se genera el binario mientras funcione, se ve decentemente bien, y sigue la regla antes mencionada.

+0

Hmm, creo que les importa cómo se genera, debe ser por Xcode/objetivo-C, pero probablemente salga con algún asm. –

+0

Permiten ahora muchos generadores de códigos alternativos, como el compilador de Adobe o mono ... No tiene que compilarse con XCode o Objective-C. –

1

Por lo tanto, aquí hay una descripción rápida de cómo incluir el código ARM asm en un proyecto Xcode, esto se prueba en versiones de Xcode hasta 4.3. Para mi proyecto específico, quería definir una función en el código ASM guardado con un nombre de archivo como "decode_arm.s". Ya tengo una implementación C de la misma función que se compila cuando se ejecuta bajo el simulador, por lo que la lógica cpp condicional asegura que el código ARM ASM solo se compila en el proyecto cuando se está compilando para el dispositivo.

// This file implements the following C functions for the ARM platform. 
// Both ARM6 and ARM7 devices are supported by this implementation. 
// 
// maxvid_decode_c4_sample16() 

#if defined(__arm__) 
# define COMPILE_ARM 1 
# if defined(__thumb__) 
# define COMPILE_ARM_THUMB_ASM 1 
# else 
# define COMPILE_ARM_ASM 1 
# endif 
#endif 

#if defined(COMPILE_ARM) 
# define USE_GENERATED_ARM_ASM 1 
#endif // COMPILE_ARM 

#if defined(USE_GENERATED_ARM_ASM) 
    .section __TEXT,__text,regular 
    .section __TEXT,__textcoal_nt,coalesced 
    .section __TEXT,__const_coal,coalesced 
    .section __TEXT,__picsymbolstub4,symbol_stubs,none,16 
    .text 
    .align 2 
    .globl _maxvid_decode_c4_sample16 
    .private_extern _maxvid_decode_c4_sample16 
_maxvid_decode_c4_sample16: 
    @ args = 0, pretend = 0, frame = 0 
    @ frame_needed = 1, uses_anonymous_args = 0 
    stmfd sp!, {r4, r5, r6, r7, lr} 
    add r7, sp, #12 
    stmfd sp!, {r8, r10, r11} 

    (ASM CODE HERE) 

    ldmfd sp!, {r8, r10, r11} 
    ldmfd sp!, {r4, r5, r6, r7, pc} 
    .subsections_via_symbols 

#else 
    // No-op when USE_GENERATED_ARM_ASM is not defined 
#endif 
+0

Con Xcode 4.5 (clang 4) ahora necesita incluir el argumento de línea de comando -no-integrado-como para que este aster en línea AT & T en línea funcione. Añádalo al .s target "Target" -> "Build Fhases" – MoDJ

+0

También creé esta publicación de blog que proporciona un marco de tiempo para los tiempos de ejecución de ARM asm en iOS. Ver el ejemplo del proyecto Xcode en http://www.modejong.com/blog/post10_arm_timing_framework/index.html – MoDJ

Cuestiones relacionadas