Les réponses de CesarB et Pavel fourni des citations de VAMP, mais les problèmes demeurent. Ne le destinataire de l'appel enregistrer r9? Ce sujet r12? Qu'en est r14? En outre, les réponses étaient très générales et non spécifiques à l'arm-eabi chaîne d'outils comme demandé. Voici une approche pratique pour savoir qui de s'inscrire sont appelé-sauvé et qui ne le sont pas.
Suivants du code C contient une ligne du bloc d'assemblage, qui prétend modifier les registres r0-r12 et r14. Le compilateur va générer le code pour enregistrer les registres requis par l'ABI.
void foo() {
asm volatile ( "nop" : : : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r14");
}
Utiliser la ligne de commande arm-eabi-gcc-4.7 -O2 -S -o - foo.c
et ajouter les commutateurs pour votre plate-forme (comme -mcpu=arm7tdmi
par exemple).
La commande imprimer le code assembleur généré sur la sortie standard STDOUT. Il peut ressembler à quelque chose comme ceci:
foo:
stmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
nop
ldmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
bx lr
Notez que le code généré par le compilateur, enregistre et restaure r4-r11. Le compilateur ne pas enregistrer r0 r3, r12. Qu'il restaure r14 (alias lr) est purement accidentelle, comme je le sais par expérience que le code de sortie peut également charger enregistré lr en r0 et puis faire un "bx r0" au lieu de "bx lr". Soit par l'ajout de l' -mcpu=arm7tdmi -mno-thumb-interwork
ou en utilisant -mcpu=cortex-m4 -mthumb
nous obtenons légèrement différente de l'assemblée de code qui ressemble à ceci:
foo:
stmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
nop
ldmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
Encore une fois, r4, r11 sont sauvegardés et restaurés. Mais r14 (alias lr) n'est pas restauré.
Pour résumer:
- r0 r3 sont pas callee-saved
- r4-r11 sont callee-saved
- r12 (alias ip) n'est pas callee-saved
- r13 (alias sp) est callee-saved
- r14 est pas callee-saved
- r15 (alias pc) est le compteur de programme, et est fixé à la valeur de lr avant l'appel de la fonction
Cela tient, au moins pour arm-eabi-gcc par défaut de l'. Il y a des commutateurs de ligne de commande (en particulier les mabi switch) qui peuvent influencer les résultats.