Frage

Wie wird es gemacht? Welche Schritte muss ich nehmen und welche Gefahren und Fallstricke gibt es zu beachten?

War es hilfreich?

Lösung

ich diese Arbeit bekommen haben, um, dank einiger Hilfe von innen an der Apple-Devforums , sollten Sie registrieren Sie sich, wenn Sie ein spezieller IPhone-Entwickler sind.

Das erste, was der erste, es ist __ asm __ () , nicht schlicht asm () .

Zum anderen standardmäßig erzeugt XCode eine Kompilation Ziel, das Inline-Assembler gegen den ARM Thumb-Befehlssatz kompiliert, so usat wurde nicht als richtige Anweisung erkannt. Um dies zu beheben, gehen Sie „Get Info“ auf dem Target. Blättern Sie nach unten zum Abschnitt „GCC 4.0 - Codegenerierung“ und deaktivieren Sie „für Thumb übersetzen“. Dann wird der folgende Schnipsel kompiliert nur gut, wenn Sie das Active SDK „Gerät“

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

Natürlich jetzt wird es nicht mit dem iPhone-Simulator arbeiten. Aber TargetConditionals.h hat definiert, kann man #IFDEF gegen. Nämlich TARGET_OS_IPHONE und TARGET_IPHONE_SIMULATOR .

Andere Tipps

Ich schreibe ziemlich viel ARM Cortex-A8 Montage-Code. Die CPU auf dem iPhone ist ein ARM11 (afaik), so der Kern-Befehlssatz ist das gleiche.

Was genau suchen Sie? Ich könnte Ihnen einige Beispiele geben, wenn Sie wollen.


EDIT:

ich gerade herausgefunden, dass auf dem iPhone Sie die llvm-gcc-Compiler verwenden. Soweit ich weiß, soll es die Inline-Assembler Syntax von GCC verstehen. Wenn ja alle ARM-Inline-Assembler-Tutorials werden auch auf dem iPhone funktionieren.

Hier ist eine sehr minimal Inline-Assembler-Funktion (in C). Könnten Sie mir bitte sagen, ob es auf dem iPhone und arbeitet kompiliert? Wenn es funktioniert, ich ein bisschen schimpfen können, wie nützlich Sachen in der ARM-Inline-Assembler zu tun, vor allem für die ARMv6-Architektur und die DSP-Erweiterungen.

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

sollten gleichwertig sein:

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

Die Register können auch explizit in der Inline-asm verwendet werden

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

Thumb ist für die Anwendung empfohlen, die keine schweren Schwimmer Betrieb erfordern. Daumen macht die Codegröße kleiner und führt auch zu einer schnelleren Ausführung von Code.

So sollten Sie nur Thumb deaktivieren für Anwendungen wie 3D-Spiele ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top