Push et Pop dans les bras
Je ne comprends pas vraiment comment la pile de commandes ou de la façon dont les piles dans le travail en général.
Dire si j'avais
PUSH R3
POP R3
Ligne 1 : est-ce à dire que le contenu de R3 serait mis sur le dessus de la pile? Serait le contenu de la pile puis changer si R3 changé?
Ligne 2: Sur la deuxième ligne, le contenu en haut de la pile d'être déplacé à partir de la pile dans R3 OU est le contenu de R3 qui a été poussé sur la pile sauté hors de la pile?
Aussi ce qui fait pop/push faire lorsqu'un registre est entourée de parenthèses comme si
POP {LR}
Ce qu'il fait avec les crochets autour de la liste des registres est d'assembler correctement; ils font partie de la syntaxe appropriée. Je suppose que vous trouver un asssembler clémente assez pour accepter
push r3
sans eux, mais il est certainement non standard.OriginalL'auteur Nick Bishop | 2014-11-23
Vous devez vous connecter pour publier un commentaire.
Mentionnés pile opérations ne sont que des raccourcis pour les opérations de mémoire à l'aide de
sp
dans l'adresse de la partie. E. g.sont des alias pour
Première opération dit "stocker le contenu de
r3
en[sp - #4]
et de décrémentationsp
par 4". Le dernier un "loadr3
de[sp]
et l'incrément desp
par 4".Au lieu de
{r3}
vous pouvez utiliser tout autre registre ou le registre des ensembles (par exemple,{r1,r2,r3,lr}
. Jeux de registre sont précisées dans un masque de bits dans le code de l'ordinateur de sorte que vous ne pouvez pas modifier l'ordre dans lequel les registres sont stockées/chargé.vous pouvez stocker les octets sur la pile;
sp
est juste un alias pour ler13
registre, et peut être utilisé comme tout autre registre dans les opérations de mémoire. Mais le plus haut niveau de langues assumer un certain alignement desp
lorsqu'une fonction est entré. Sur Linux, le EABI nécessite par exemple de 8 octets aligné pointeur de pile. Certains Processeurs (par exemple, le Cortex M3) ont un peu de la magie de cette contrainte lors de la saisie d'un gestionnaire d'interruption.Donc, ai-je raison en disant que cette pile grandit vers le bas?
oui.
Normalement
push {list}
eststm
(store plusieurs) avec décrémenter-avant, et pas seulementstr
. Un assembleur peut certainement optimiser pourstr
quand il y a un seul registre, mais vous devriez certainement mentionnerstmdb
/ldmia
OriginalL'auteur ensc
Minimale armv7 exemple
La meilleure façon d'apprendre est d'écrire des minimes exemples, de les exécuter sur des émulateurs, et observer ce qui se passe sur tous les registres avec GDB:
Standard pour exécuter l'exemple sur Ubuntu 18.04: https://github.com/cirosantilli/arm-assembly-cheat/blob/f8d78775bd052e9ead579a408c0a2a1651adb9f0/v7/push.S
Les crochets sont appelés "registre des listes" dans le montage de bras de notation. GNU GAZ 2.26.1 ne pas accepter
push
etpop
instructions sans les accolades, même pour un seul registre pousse{}
comme danspush r1
.Également de noter:
push
etpop
, les compilateurs utilisent souventstp
etldp
à la place. Exemple: https://github.com/cirosantilli/arm-assembly-cheat/blob/f8d78775bd052e9ead579a408c0a2a1651adb9f0/v8/common_arch.h#L20OriginalL'auteur Ciro Santilli 新疆改造中心996ICU六四事件