Question

Comment c'est fait? Quelles mesures dois-je prendre et quels sont les pièges et les pièges à prendre en compte?

Était-ce utile?

La solution

Cela a fonctionné, grâce à une aide interne fournie par Apple Devforums , vous devriez inscrivez-vous si vous êtes un développeur IPhone dédié.

Tout d'abord, il s'agit de __ asm __ () , pas tout à fait asm () .

Deuxièmement, par défaut, XCode génère une cible de compilation qui compile un assemblage inline par rapport au jeu d'instructions ARM Thumb. usat n'a donc pas été reconnu comme une instruction appropriée. Pour résoudre ce problème, effectuez "Obtenir des infos". sur la cible. Faites défiler jusqu'à la section "GCC 4.0 - Génération de code". et décochez la case "Compiler pour le pouce". Ensuite, cet extrait de code se compilera parfaitement si vous définissez Active SDK sur "Périphérique"

.
inline int asm_saturate_to_255 (int a) {
  int y;
  __asm__("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a));
  return y;
}

Naturellement, cela ne fonctionnera plus avec le simulateur IPhone. Mais TargetConditionals.h a défini vous pouvez #ifdef contre. À savoir TARGET_OS_IPHONE et TARGET_IPHONE_SIMULATOR .

Autres conseils

J'écris pas mal de code assembleur ARM Cortex-A8. Le processeur de l'iPhone étant un ARM11 (comme déjà), le jeu d'instructions principal est le même.

Que cherchez-vous exactement? Je pourrais vous donner quelques exemples si vous voulez.

EDIT:

Je viens de découvrir que sur l'iPhone, vous devez utiliser le compilateur llvm-gcc. Autant que je sache, il devrait comprendre la syntaxe de l'assembleur inline de GCC. Si tel est le cas, tous les didacticiels de l'assembleur en ligne ARM fonctionnent également sur l'iPhone.

Voici une fonction très minime d’assembleur en ligne (en C). Pourriez-vous s'il vous plaît me dire s'il compile et fonctionne sur l'iphone? Si cela fonctionne, je peux expliquer un peu comment faire des choses utiles dans ARM Inline Assembler, en particulier pour l’architecture ARMv6 et les extensions DSP.

inline int saturate_to_255 (int a)
{
  int y;
  asm ("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a));
  return y;
}

devrait être équivalent à:

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

Les registres peuvent également être utilisés explicitement dans inline asm

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

Le pouce est recommandé pour les applications ne nécessitant pas de flottement important. Thumb réduit la taille du code et permet également une exécution plus rapide du code.

Vous ne devez donc désactiver le pouce que pour les applications telles que les jeux 3D ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top