Domanda

Come viene fatto? Quali passi devo prendere e quali insidie ??e problemi ci sono da considerare?

È stato utile?

Soluzione

Ho ottenuto che funzioni, grazie ad un aiuto interno al Apple Devforums , dovresti registrati se sei uno sviluppatore IPhone dedicato.

Per prima cosa, è __asm ??__ () , non semplice asm () .

In secondo luogo, per impostazione predefinita, XCode genera una destinazione di compilazione che compila l'assemblaggio in linea rispetto al set di istruzioni ARM Thumb, quindi usat non è stato riconosciuto come un'istruzione corretta. Per risolvere questo problema, fai " Ottieni informazioni " sul bersaglio. Scorri verso il basso fino alla sezione "GCC 4.0 - Generazione di codice" e deseleziona "Compila per pollice". Quindi questo frammento seguente verrà compilato correttamente se imposti l'SDK attivo su " 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, ora non funzionerà con IPhone Simulator. Ma TargetConditionals.h ha definito la possibilità di #ifdef. Vale a dire TARGET_OS_IPHONE e TARGET_IPHONE_SIMULATOR .

Altri suggerimenti

Scrivo un po 'di codice assembly Cortex-A8 ARM. La CPU dell'iPhone è un ARM11 (afaik), quindi il set di istruzioni di base è lo stesso.

Cosa stai cercando esattamente? Potrei darti alcuni esempi se vuoi.


EDIT:

Ho appena scoperto che su iPhone devi usare il compilatore llvm-gcc. Per quanto ne so, dovrebbe comprendere la sintassi dell'assemblatore in linea di GCC. In tal caso, tutti i tutorial di assemblaggio in linea ARM funzioneranno anche su iPhone.

Ecco una funzione di assemblatore inline molto minimale (in C). Potresti dirmi se si compila e funziona su iPhone? Se funziona, posso capire un po 'come fare cose utili nell'assemblatore inline ARM, specialmente per l'architettura ARMv6 e le estensioni DSP.

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

dovrebbe essere equivalente a:

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

I registri possono anche essere utilizzati esplicitamente inline asm

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

Il pollice è raccomandato per applicazioni che non richiedono un funzionamento con galleggiante pesante. Thumb riduce le dimensioni del codice e comporta anche un'esecuzione più veloce del codice.

Quindi dovresti disattivare il pollice solo per applicazioni come i giochi 3D ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top