2009-06-30 10 views
2

Ich lese die verschiedenen Themen, die sich mit dieser Art von Problem befassen, aber ich habe immer noch keine Antwort. mein Problem hier ist:iphone dev: Problem mit Inline asm

In meiner Header-Datei, habe ich diese:

int cl, ch, _a = a, _b = b;\ 
    __asm__ ("smull %0, %1, %2, %3\n"   
    "mov %0, %0, lsr %4\n"   
    "orr %0, %0, %1, lsl %5\n"   
    : "=&r" (cl), "=&r" (ch)   
    : "r" (_a), "r" (_b), "i" (r), "i" (32-(r))); 
    cl; }) 

In meinen Projekteinstellungen hat ich festgestellt, dass diese folgenden Optionen ckecked wurden link text

Aber ich habe eine Konsole Fehler:

{Standardeingabe}: 242: ausgewählter Prozessor nicht akzeptiert - smull r0,r1,r2,r3' {standard input}:244:unshifted register required -- orr r0, r0, r1, LSL # 20'

Können Sie mir helfen?

Antwort

3

Kompilieren Sie die Datei für den Arm? Standardmäßig ist der Code für das iPhone für den Daumen kompiliert (was normalerweise vorzuziehen ist, es sei denn, Sie führen Fließkomma-Berechnungen durch). Der ASM, den Sie aufgelistet haben, ist Arm. Sie müssen jede Datei, die diesen Header verwendet, als Arm konfigurieren, da GCC Ihnen nicht erlaubt, Backends innerhalb einer einzigen Kompilierungseinheit zu wechseln. Sie können dies ändern, indem Sie "Compile for Thumb" unter "GCC 4.x Code Generation" deaktivieren.

Wenn Sie Ihr gesamtes Projekt als Zweig zusammenstellen, hat das höchstwahrscheinlich einen signifikanten (negativen) Einfluss auf die Speichernutzung und die Proxy-Leistung. ASM über ein Makro in einem solchen Header zu integrieren wird sich auf dem iPhone als sehr unordentlich erweisen. Im Allgemeinen sind Sie besser dran, all Ihre ASM in eine einzige Datei zu setzen und diese eine Datei als Arm zu kompilieren, aber für was ist nur eine 3-Befehl-Sequenz, die sich wahrscheinlich auch nicht lohnt.