2009-11-10 7 views
2

J'ai quelques lignes de code de bras d'assembleur dans un fichier .s. Juste quelques routines que je dois appeler. Cela fonctionne bien lors de la construction de l'appareil, mais quand je passe à l'iPhone Simulator, je reçois des erreurs "pas de telles instructions". J'ai essayé de compiler des parties du fichier .s sous condition avec ce que je sais:Compilation conditionnelle en code assembleur (.s) pour iPhone - comment?

#if !TARGET_IPHONE_SIMULATOR 

Mais l'assembleur ne reconnaît pas ces directives de préprocesseur (bien sûr) et aucune des techniques de compilation conditionnelle pour l'assembleur que je me souvenais ou trouver travaillé, donc je me gratte la tête maintenant sur la façon d'éviter la compilation de ce code assembleur lors de la construction pour le simulateur. Je ne vois pas non plus d'option de projet dans Xcode qui me permettrait de compiler le fichier ou non en fonction de la plateforme cible.

SOLVED:

Tout ce que je manquais était le bon #import dans le fichier assembleur. Je n'ai pas pensé à l'ajouter car la syntaxe de Xcode a mis en évidence une directive de préprocesseur en vert (commentaire) qui m'a fait supposer que ces commandes ne sont pas reconnues alors qu'en fait elles fonctionnent très bien.

Cela fonctionne:

#import "TargetConditionals.h" 

#if !TARGET_IPHONE_SIMULATOR 

... asm code here ... 

#endif 
+0

Je crois que les outils invoqués par XCode utilisent le même préprocesseur pour les fichiers .s et .c (si vous n'avez pas changé les valeurs par défaut); Etes-vous sûr que vous n'avez pas fait une erreur quand vous avez essayé cela? –

Répondre

2

Vous ne le font avec une macro pré-processeur. Ils sont définis dans TargetConditionals.h TARGET_IPHONE_SIMULATOR devrait être là! (Vous avez besoin de #inclure cependant.)

+0

Oui, bien sûr, c'est là ... mais la directive #if du préprocesseur ne l'est pas. Cela fonctionne dans le code C/ObjC mais pas dans les fichiers .s assembleur. – LearnCocos2D

+0

En fait ... en ajoutant #import "TargetConditionals.h" cela fonctionne! J'étais confus parce que Xcode n'a pas correctement mis en évidence la syntaxe des macros du préprocesseur. – LearnCocos2D

+0

Merci GH. Je vais modifier ma réponse pour clarifier que TargetConditionals.h doit être inclus. – Andiih

1

est le code que j'utilise ici pour détecter ARM vs vs Thumb Simulator:

#include "TargetConditionals.h" 

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

#if TARGET_IPHONE_SIMULATOR 
    // Simulator defines 
#else 
    // ARM or Thumb mode defines 
#endif 

// Et voici comment vous pouvez l'utiliser

uint32_t 
test_compare_shifted_operand(uint32_t w1) { 
    uint32_t local; 
#if defined(COMPILE_ARM_ASM) 
    const uint32_t shifted = (1 << 8); 
    __asm__ __volatile__ (
         "mov %[w2], #1\n\t" 
         "cmp %[w2], %[w1], lsr #8\n\t" 
         "moveq %[w2], #10\n\t" 
         "movne %[w2], #11\n\t" 
         : \ 
         [w1] "+l" (w1), 
         [w2] "+l" (local) 
         : \ 
         [shifted] "l" (shifted) 
         ); 
#else // COMPILE_ARM_ASM 
    if ((w1 >> 8) == 1) { 
    local = 10; 
    } else { 
    local = 11; 
    } 
#endif // COMPILE_ARM_ASM 
    return local; 
} 
+0

À partir de Xcode 4.5, l'argument de ligne de commande -no-integrated-as doit également être passé à un module de compilation qui inclut le code asm AT & T en ligne. Définissez cela dans Cible -> "Construire les Phases" -> foo.s zone spécifique de la cible dans les paramètres de construction. – MoDJ

Questions connexes