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: p>
expression immédiate nécessite un # préfixe - `mov R2, sp_svc ' p>
Qu'est-ce qui ne va pas? P>
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: P>
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. p> blockQuote>
3 Réponses :
Je ne pense pas que ce soit possible avec l'instruction L'erreur que vous obtenez est parce que cela ne fait pas t Comprendre C'est pourquoi cela dit "nécessite un # préfixe". P> p> MOV code>; 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 code> qui peut charger les registres de mode utilisateur à partir d'un mode privilégié (en utilisant
^ code>). Votre seule autre option consiste à basculer en mode SVC, do
MOV R2, SP CODE>, puis retirez-vous sur tout autre mode que vous utilisiez.
sp_svc code>, il pense donc que vous essayez d'essayer d'effectuer un
MOV MOV>, qui ressemblerait à: p>
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.
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> puis p> ou si vous avez besoin de plus de bits dans l'immédiat P > 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:
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_
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.
La syntaxe correcte pour cela est 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. P>
La documentation sur les instructions peut être trouvée dans l'armv7a for forte> TRM RevC, sous Section B9.3.9 MRS (registre bancaire) EM>. P>
Pour les autres processeurs Cortex-A (et ARMV6) Vous pouvez utiliser l'instruction Pour tous les processeurs plus anciens, les informations fournies par Old_TIMER fonctionneront. Principalement, utilisez Il s'agit d'une instruction importante (séquences) pour la commutation de contexte (quels VMS font beaucoup de). P> MRS R2, SP_SVC CODE> ou
MRS R3, SP_USR CODE>. Ceci est une nouvelle extension forte> armv7 forte>. Le code peut être vu dans le fichier source du bras Linux kvm Interrupt_head.s . Le bouton fort> Gaz strong> Binutils pour ce Support d'instruction A > Par Matthew Gretton-Dann. Cela nécessite que les extensions de virtualisation em> sont loin que je comprends. P>
CPS CODE> 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 Strong>. La bonne façon de gérer cela est avec
ldm rn, {sp, lr} ^ code>; Le mode utilisateur n'a pas de manière simple sur les modes privilégiés. P>
MRS / MSR code> pour modifier les modes.
MRS / MSR CODE> 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. P>
Les plus récents Binutils donnent l'erreur Erreur: Les registres bancaires ne sont pas disponibles avec cette architecture. I> Lorsque vous essayez les instructions avec les drapeaux Compiler / Assembleur CPU qui ne supportent pas les LPAE.