Come si esegue l'assemblaggio in linea sull'iPhone?
-
04-07-2019 - |
Domanda
Come viene fatto? Quali passi devo prendere e quali insidie ??e problemi ci sono da considerare?
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 ...