2010-12-10 57 views
0

J'ai été googling pendant un certain temps mais toujours pas de solution. J'espère que quelqu'un peut m'aider à ce sujet.asm en ligne compilé en XCode pour Simulator, mais n'a pas pu compiler pour le périphérique

J'ai trois fonctions asm en ligne comme ci-dessous:

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); 
} 

Ils ont tous compilés avec succès dans XCode Simulator, mais a échoué quand je suis passé à construire pour l'appareil - 4.1 (pour iPhone). Le message que j'ai reçu est "contrainte impossible en asm". Je crois que le problème est le code d'assemblage ci-dessus ne fonctionne pas pour CPU basé sur ARM. Quelqu'un peut-il faire la lumière sur la façon de réécrire le code afin qu'il compile pour iPhone cpu? Il peut s'agir d'un assemblage ou d'un code C pur. Merci d'avance!

Leo

+0

Qu'essayez-vous de faire? –

+0

Juste une conjecture, mais l'assemblage que vous avez posté est x86 et les appareils iOS sont basés sur ARM, donc vous avez probablement besoin d'écrire l'assemblage ARM pour faire ce que vous voulez. –

+0

@Dean. Vous avez absolument raison, et c'est en fait ma question. Comment puis-je réécrire le code pour cpu ARM? Avez-vous une idée? Ce serait très apprécié si vous pouviez faire la lumière sur la réécriture dans l'assemblage ARM ou le code C pur. – user538220

Répondre

0

Vous pouvez essayer l'instruction ARM clz pour remplacer bsr. Je ne connais pas de bons remplaçants pour les deux autres.

Édition: OP a clarifié le contexte. Vous devez obtenir le Intel® 64 and IA-32 Architectures Software Developer's Manuals. Ils contiennent une référence de jeu d'instructions complète qui vous aidera. Même pseudocode pour les instructions bsf/bsr est là-bas, et peut facilement être traduit en équivalents C:

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; 
} 

L'instruction rdtsc se lit comme suit le contre-horodatage du processeur, qui est une valeur 64 bits incrémenté à chaque horloge cycle:

Le processeur incrémente de façon monotone le compteur d'horodatage MSR à chaque cycle d'horloge et le remet à 0 à chaque réinitialisation du processeur.

Vous aurez besoin de comprendre pourquoi votre programme a besoin de ces informations, et comment le traduire au mieux dans votre boîtier ARM.

+0

Merci Carl. Je vais essayer ça. – user538220

+0

Non, cela me donne la même erreur. – user538220

+0

Merci beaucoup pour votre aide.Je vais essayer avec votre code et vous laisser savoir si cela fonctionne. Je suppose qu'il est temps pour moi d'apprendre une petite assemblée. :) – user538220