7
votes

Comment accéder à plus de 4 arguments dans une fonction d'assemblage de bras?

Dans ma fonction de montage, il y a 6 arguments. Lorsque j'essaie d'accéder aux quatrième et cinquième arguments, ils sont faux, voici mon code sur ARM CORTEX-8A

push {r4-r8,lr}
ldr r6, [sp]
ldr r7, [sp, #4]


0 commentaires

3 Réponses :


9
votes

Les arguments supplémentaires sont transmis sur la pile, cependant , le sp les points à l'entrée de la fonction . Dans votre prologiciel, vous appuyez sur les registres à enregistrer, ce qui modifie le SP , vous devez donc la comptabiliser.

R4, R5, R6, R7, R8 et LR sont 6 registres , vous devez donc ajuster votre SP offsets par 6 * 4 = 24 octets. Alors, essayez ce qui suit: xxx

si vous faites plus de manipulations avec sp , par exemple. Allouer de l'espace pour les vars de pile, vous devrez peut-être en tenir compte également.


0 commentaires

12
votes

Pourquoi pas simplement l'essayer? XXX PRE>

Assemblez, puis Démonter P>

arm-none-eabi-gcc --version
arm-none-eabi-gcc (GCC) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


1 commentaires

Les 12 octets supplémentaires doivent conserver sp aligné sur un multiple de 16 octets selon les besoins de l'ABI.



5
votes

STANDARD AAPCS

http://infocenter.arm.com/ Aide / Topic / com.arm.doc.ihi0042F / IHI0042F_AAPCS.PDF 5.5 Passage du paramètre contient la réponse.

Ce n'est pas super facile à comprendre car il s'agit d'un algorithme, mais la partie cruciale qui répond à la question semble être:

C.5 Si la NCRN est inférieure à R4 et que la NSAA est égale à la SP, l'argument est divisé entre le noyau registres et la pile. La première partie de l'argument est c opté dans les registres de base commençant à la NCRN jusqu'à R3 y compris. Le reste de l'argument est copié sur la pile, à partir de la NSAA. La NCRN est définie sur R4 et la NSAA est incrémentée par la taille de l'argument moins la montant passé dans des registres. L'argument a maintenant été alloué.

Ce que les autres ont dit, signifie 4 registres + pile.


0 commentaires