2010-07-15 11 views
3

Je travaille avec le compilateur llvm-clang, en compilant des fonctions C simples pour les assembler sur un processeur ARMv7-A. J'essaie de comprendre ce que cette instruction fait.Opérandes d'instruction ARM SUB

SUB sp, sp, #65, 30 

Il est évident que c'est faire de la place sur le pointeur de pile pour certaines variables locales, mais je ne l'ai jamais vu une instruction SUB ARM avec quatre opérandes. Je suppose que le 30 modifie le # 65 en quelque sorte, mais je ne sais pas comment, et je n'ai pas pu trouver de détails dans le Manuel de référence de l'architecture ARM. Aucune suggestion? Pour les curieux, ceci est au début d'un programme qui crée une matrice d'identités 8 x 8 d'entiers, donc je m'attendrais à ce que le sp ait besoin de faire de la place pour au moins 8 x 8 x 4 octets sur la pile .

Répondre

7

La figure 30 est une opération de rotation à droite sur la 65

Rotation à droite de 30 bits est le même que la rotation gauche 2 bitswhich est identique à une multiplication par 4. 65 * 4 = 260

Donc, ce soustrait 260 du pointeur de la pile.

+0

Merci pour la réponse rapide. Toute idée de pourquoi il y aurait un décalage immédiat plutôt que juste le nombre 260 (l'instruction ARM spécifie que l'immédiat doit être de 12 bits de large, assez clair pour la constante de 260)? – Zeke

+0

@Zeke: La réponse de Martin explique pourquoi –

4

La conception du bras alloue 12 bits pour les valeurs immédiates, 8 bits pour la valeur et les 4 bits restants sont une rotation à droite (représentations des rotations de 0 2 4 etc.). Puisque 260 ne peut être représenté en 8 bits, il est construit en 65 * 4.

Cela répand les valeurs immédiates à la disposition du programmeur sur toute la plage de 32 bits plutôt que de le limiter à 0 à 4095

1

Le bras désassemblé parfois crachent des constantes dans ce format que la constante de 8 bits + 4- Le codage ROR des bits permet d'encoder certaines valeurs de différentes manières. par exemple. 1 peut être codé comme 1 ROR 0, 4 ROR 2, 16 ROR 4, etc.

Le décodage à ce format permet de spécifier sans ambiguïté le codage d'instructions et de réassembler l'instruction exacte. Il peut être important de créer un binaire identique au niveau du bit.

+1

Je n'étais pas au courant de cela comme un format utilisable, mais il serait utile lorsque vous essayez de concevoir du code qui peut être corrigé de façon prévisible. Par exemple, si une routine sensible à la synchronisation doit ajouter un numéro 0-65535, vous pouvez utiliser deux instructions d'ajout immédiat avec un décalage vers la gauche de 8 (décalage vers la droite 24) sur l'une d'entre elles. Ce serait beaucoup plus rapide que de devoir charger une valeur de 16 bits de la mémoire avant l'ajout. – supercat