Die Antworten von Cesarb und Pavel lieferten Zitate von AAPCS, aber offene Fragen bleiben offen. Speichert der Angerufene R9? Was ist mit R12? Was ist mit R14? Darüber hinaus waren die Antworten sehr allgemein gehalten und nicht spezifisch für die Arm-eabi-Toolchain wie gewünscht. Hier ist ein praktischer Ansatz, um herauszufinden, welches Register aufgerufen wird und welches nicht.
Der folgende C-Code enthält einen Inline-Assembly-Block, der angibt, die Register r0-r12 und r14 zu ändern. Der Compiler generiert den Code zum Speichern der von der ABI benötigten Register.
void foo() {
asm volatile ("nop" : : : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r14");
}
Verwenden der Befehlszeile arm-eabi-gcc-4.7 -O2 -S -o - foo.c
und die Schalter für die jeweilige Plattform (wie zum Beispiel -mcpu=arm7tdmi
) hinzuzufügen. Der Befehl wird den generierten Assembly-Code auf STDOUT ausgeben. Es kann wie folgt aussehen:
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
Beachten Sie, dass der Compiler erzeugte Code speichert und stellt r4-r11. Der Compiler speichert nicht r0-r3, r12. Dass es r14 (alias lr) wiederherstellt, ist rein zufällig, da ich aus Erfahrung weiß, dass der Exit-Code auch das gespeicherte lr in r0 laden kann und dann ein "bx r0" anstelle von "bx lr" macht. Entweder durch die -mcpu=arm7tdmi -mno-thumb-interwork
Hinzufügen oder durch -mcpu=cortex-m4 -mthumb
verwenden wir etwas anderen Assembler-Code zu erhalten, die wie folgt aussieht:
foo:
stmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
nop
ldmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
Wieder r4-r11 werden gespeichert und wiederhergestellt. Aber r14 (alias lr) wird nicht wiederhergestellt.
Fassen wir zusammen:
- r0-r3 nicht Rufenen gespeicherten
- r4-r11 sind Rufenen gespeicherte
- r12 (alias ip) sind, ist nicht Rufenen gespeicherten
- r13 (Alias sp) wird auf Abruf gespeichert
- r14 (alias lr) ist nicht callee-gespeichert
- R15 (alias PC) wird der Programmzähler und wird auf den Wert von LR vor dem Funktionsaufruf eingestellt
Dies gilt zumindest für den Arm-EABI-GCCs Verzuges des. Es gibt Befehlszeilenschalter (insbesondere der Schalter -mabi), die die Ergebnisse beeinflussen können.
Hier ist ein externer Link, der hilfreich sein kann. [APCS Intro] (http://www.heyrick.co.uk/assembler/apcsintro.html), insbesondere einige [verschiedene Namen] (http://sourceware.org/ml/binutils/2000-06/msg00240.html) für 'Register' verwenden. –