2010-12-10 4 views
0

Ich google seit einer langen Zeit, aber immer noch keine Lösung finden. Ich hoffe, dass mir jemand dabei helfen kann.Inline-Asm kompiliert in XCode für Simulator, konnte aber nicht kompilieren für Gerät

Ich habe drei Inline-asm Funktionen wie folgt:

static __inline__ int Bsf(uint32_t Operand) { 
    int eax; 
    asm __volatile__ (
    "bsfl %0, %0" "\n\t" 
    : "=a" (eax) 
    : "0" (Operand) 
); 
    return eax; 
} 

static __inline__ int Bsr(uint32_t Operand) { 
    int eax; 
    asm __volatile__ (
    "bsrl %0, %0" "\n\t" 
    : "=a" (eax) 
    : "0" (Operand) 
); 
    return eax; 
} 

static __inline__ uint64_t TimeStampCounter(void) { 
    uint32_t eax, edx; 
    asm __volatile__ (
    "rdtsc" "\n\t" 
    : "=a" (eax), "=d" (edx) 
    : 
); 
    return MAKE_LONG_LONG(eax, edx); 
} 

Sie alle erfolgreich in XCode für Simulator kompiliert, aber nicht, wenn ich für Geräte bauen geschaltet - 4.1 (für iPhone). Die Nachricht, die ich bekam, ist "unmögliche Einschränkung in asm". Ich glaube, das Problem ist der oben genannte Assembler-Code funktioniert nicht für ARM-basierte CPU. Kann jemand etwas Licht darüber schildern, wie man den Code neu schreibt, damit er für die iPhone-CPU kompiliert? Es kann entweder Assembly oder reiner C-Code sein. Danke im Voraus!

Leo

+0

Was möchten Sie tun? –

+0

Nur eine Vermutung, aber die Assembly, die Sie gepostet haben, ist x86 und iOS-Geräte sind ARM-basiert, so dass Sie wahrscheinlich die ARM-Assembly schreiben müssen, um das zu tun, was Sie wollen. –

+0

@Dean. Du hast absolut recht, und das ist eigentlich meine Frage. Wie schreibe ich den Code für ARM-CPU neu? Hast du irgendeine Idee? Das würde sehr geschätzt werden, wenn Sie etwas Licht auf das Umschreiben in entweder ARM-Assembly oder reinem C-Code werfen könnten. – user538220

Antwort

0

Sie konnten die ARM clz Anweisung versuchen bsr zu ersetzen. Ich kenne keinen guten Ersatz für die anderen beiden.

Edit: OP geklärt einige Kontext.

Sie müssen die Intel® 64 and IA-32 Architectures Software Developer's Manuals bekommen. Sie enthalten eine vollständige Befehlssatzreferenz, die Ihnen helfen wird. Auch Pseudo-Code für die ist bsf/bsr Anweisungen gibt, und kann leicht in ihre C-Äquivalente übersetzt werden:

int Bsf(uint32_t n) { 
{ 
    int m; 

    for (m = 0; m < 32; m++) 
    { 
     if (n & (1 << m)) 
      return m; 
    } 

    return 32; 
} 

int Bsr(uint32_t n) { 
{ 
    int m; 

    for (m = 31; m >= 0; m--) 
    { 
     if (n & (1 << m)) 
      return m; 
    } 

    return 32; 
} 

Die rdtsc Anweisung der Zeitstempel-Zähler des Prozessors liest, das ein 64-Bit-Wert ist, jeden Takt inkrementiert Zyklus:

der Prozessor den Zeitstempelzähler MSR jedem Taktzyklus inkrementiert monoton und setzt es auf 0, wenn der Prozessor zurückgesetzt wird.

Sie müssen herausfinden, warum Ihr Programm diese Informationen benötigt und wie Sie es am besten in Ihren ARM-Fall übersetzen.

+0

Danke Carl. Ich werde das versuchen. – user538220

+0

Nein, es gibt mir den gleichen Fehler. – user538220

+0

Vielen Dank für Ihre Hilfe.Ich werde es mit deinem Code versuchen und dich wissen lassen, ob es funktioniert. Ich denke, es ist Zeit für mich, eine kleine Versammlung zu lernen. :) – user538220

Verwandte Themen