11
votes

Accéder explicitement à des registres bancaires au bras

Selon le manuel du bras, il devrait être possible d'accéder aux registres bancaires d'un mode CPU spécifique, par exemple, "R13_SVC". Quand j'essaie de faire ce GCC me crie avec l'erreur suivante:

expression immédiate nécessite un # préfixe - `mov R2, sp_svc '

Qu'est-ce qui ne va pas?

mise à jour. Le texte suivant du manuel de référence de l'architecture de bras pour ARMV5 et ARMV6 m'a conduit à croire qu'il est possible, section A2.4.2:

registres R13 et R14 ont six en banque registres physiques chacun. On est utilisé dans les modes utilisateur et système, et chacun des les cinq restants sont utilisés dans l'un des les cinq modes d'exception. Où est-ce que c'est nécessaire d'être spécifique sur lequel la version est en cours de référence, vous utilisez Noms du formulaire: r13_mode R14_mode où le mode est le approprié l'un des uss, SVC (pour Mode superviseur), abt, und, irq et fiq.

arm

0 commentaires

3 Réponses :


4
votes

Je ne pense pas que ce soit possible avec l'instruction MOV ; Au moins selon le manuel de référence de l'architecture de bras, je lis. Quel document avez-vous? Il existe une variante de LDM qui peut charger les registres de mode utilisateur à partir d'un mode privilégié (en utilisant ^ ). Votre seule autre option consiste à basculer en mode SVC, do MOV R2, SP , puis retirez-vous sur tout autre mode que vous utilisiez.

L'erreur que vous obtenez est parce que cela ne fait pas t Comprendre sp_svc , il pense donc que vous essayez d'essayer d'effectuer un MOV , qui ressemblerait à: xxx

C'est pourquoi cela dit "nécessite un # préfixe".


2 commentaires

Je comprends que. Veuillez consulter la mise à jour ci-dessus concernant le texte du manuel de référence de l'architecture ARM


@Demiururg, ce paragraphe ne fait pas référence au code d'écriture, uniquement aux conventions du document. Étant donné que les registres bancaires sont différents, ils doivent avoir des noms uniques afin que tout le monde ne soit pas confus. Il n'essaie pas d'impliquer que vous pouvez utiliser ces noms dans votre code d'assemblage. La section Référence et adressage des instructions plus tard dans le livre sont plus claires sur ce que vous pouvez et ne pouvez pas faire.



4
votes

Vous utilisez MRS et MSR pour modifier les modes en modifiant les bits de la CPSR, puis utilisez R13 normalement.

du bras de bras p> xxx pré>

puis p> xxx pré>

ou si vous avez besoin de plus de bits dans l'immédiat P > xxx pré>

ou si vous ne voulez pas l'assembleur de placer vos données, vous pouvez le placer vous-même. P>

ldr sp,svc_stack
b 1f
svc_stack: .word 0x12345600
1:


4 commentaires

Si vous regardez l'instruction codant pour un MOV, il existe quatre bits pour le registre de destination, juste assez pour le 0xD (R13 ou SP). Il y a 6 registres de SP différents, vous avez besoin de 3 bits supplémentaires dans l'instruction si vous pouviez spécifier le mode, je ne vois pas ces bits là-bas, il n'ya donc aucun moyen de spécifier le mode dans l'instruction que vous devez modifier la modification CPSR à l'aide de la modification CPSR. instruction (MSR). Notez que les différents assembleurs (bras, GCC, etc.) utilisent une syntaxe différente pour MSR / MRS et les instructions MRC / MCR. Donc, la syntaxe des bras de bras est probable que le bras n'est pas un GCC.


Merci. Le code que vous avez posté serait probablement le tour. Ce qui m'a conduit à croire qu'il est possible d'accéder directement à ces registres est le texte suivant: Les registres R13 et R14 ont six registres physiques bancaires chacun ... où il est nécessaire d'être spécifique sur quelle version est en cours de référence, vous utilisez des noms. du formulaire: R13_ r14_ est l'un des éléments USR, SVC (pour le mode superviseur), ABT, UND, IRQ et FIQ. Du manuel de référence de l'architecture des bras.


Hmm, c'est une section très déroutante dans le bras de bras, je ne comprends pas ce qu'ils impliquent. Peut-être que leur assembleur ajoute une instruction pour vous, sauf pour peut-être que Keil Evals, je n'ai plus accès aux outils de bras. Cette section implique quelque chose de spécial concernant ARMV6 lié à la banque de registres et montrent ce que j'ai montré au-delà du commençant par "dans les versions d'archectueuse avant ARMV6". Si R13_SVC, R13_SYS, etc. n'étaient disponibles sur toutes les instructions que cela implique, alors chaque instruction nécessiterait de l'espace dans son encodage et une note dans le codage sur l'AMPV6 ...


a manqué de caractères sur ce commentaire ... Moi aussi je suis confus, la voie à l'ancienne va (toujours?) Travailler en commutant des modes avec MSR puis utilisez directement R13 et R14. Sauf si vous avez une raison de performance (REV, SXTAB, par exemple), je trouve plus facile d'utiliser le code que les ports vers toutes les versions d'architecture (lors de la rédaction de l'assembleur). Eh bien, je suppose armv4t et ci-dessus, je suppose depuis que BX LR est plus portable que MOV PC, LR pour ce que je fais.



7
votes

La syntaxe correcte pour cela est MRS R2, SP_SVC ou MRS R3, SP_USR . Ceci est une nouvelle extension armv7 . Le code peut être vu dans le fichier source du bras Linux kvm Interrupt_head.s . Le bouton Gaz Binutils pour ce Support d'instruction Par Matthew Gretton-Dann. Cela nécessite que les extensions de virtualisation sont loin que je comprends.

Selon ce que je comprends, les LPAE (une large extension d'adresse physique) implique les extensions de virtualisation. So Cortex-A7, Cortex-A12, Cortex-A15 et Cortex-A17 peuvent être en mesure d'utiliser cette extension. Cependant, le Cortex-A5, Cortex-A8 et Cortex-A9 ne peuvent pas.

La documentation sur les instructions peut être trouvée dans l'armv7a TRM RevC, sous Section B9.3.9 MRS (registre bancaire) .

Pour les autres processeurs Cortex-A (et ARMV6) Vous pouvez utiliser l'instruction CPS pour commuter les modes et transférer le registre bancaire à un registre non bancaire (R0-R7), puis retournez. La difficulté évidente est avec Mode utilisateur . La bonne façon de gérer cela est avec ldm rn, {sp, lr} ^ ; Le mode utilisateur n'a pas de manière simple sur les modes privilégiés.

Pour tous les processeurs plus anciens, les informations fournies par Old_TIMER fonctionneront. Principalement, utilisez MRS / MSR pour modifier les modes. MRS / MSR Fonctionne sur la classe complète des CPU de bras mais nécessite plusieurs instructions et peut donc avoir des problèmes de course nécessitant une interruption et un masquage d'exception en fonction du contexte.

Il s'agit d'une instruction importante (séquences) pour la commutation de contexte (quels VMS font beaucoup de).


1 commentaires

Les plus récents Binutils donnent l'erreur Erreur: Les registres bancaires ne sont pas disponibles avec cette architecture. Lorsque vous essayez les instructions avec les drapeaux Compiler / Assembleur CPU qui ne supportent pas les LPAE.