Отговорите на CesarB и Pavel предоставят цитати от AAPCS, но остават отворени въпроси. Обажданият записва ли r9? Какво ще кажете за r12? Какво ще кажете за r14? Освен това отговорите бяха много общи и не специфични за инструменталната верига arm-eabi, както беше поискано. Ето един практически подход, за да разберете кой регистър е запазен за извиквания и кой не.
Следният C код съдържа вграден блок за асемблиране, който твърди, че променя регистрите r0-r12 и r14. Компилаторът ще генерира кода, за да запази регистрите, изисквани от ABI.
void foo() {
asm volatile ( "nop" : : : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r14");
}
Използвайте командния ред arm-eabi-gcc-4.7 -O2 -S -o - foo.c
и добавете превключвателите за вашата платформа (като -mcpu=arm7tdmi
например). Командата ще отпечата генерирания код на асемблиране на STDOUT. Може да изглежда така:
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
Имайте предвид, че генерираният от компилатора код запазва и възстановява r4-r11. Компилаторът не записва r0-r3, r12. Това, че възстановява r14 (псевдоним lr), е чисто случайно, тъй като знам от опит, че изходният код може също да зареди запазения lr в r0 и след това да направи "bx r0" вместо "bx lr". Или чрез добавяне на -mcpu=arm7tdmi -mno-thumb-interwork
, или чрез използване на -mcpu=cortex-m4 -mthumb
получаваме малко по-различен асемблиращ код, който изглежда така:
foo:
stmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
nop
ldmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
Отново r4-r11 се записват и възстановяват. Но r14 (псевдоним lr) не се възстановява.
Да обобщим:
- r0-r3 не са запазени за извиквания
- r4-r11 са запазени от callee
- r12 (псевдоним ip) не е запазен от callee
- r13 (псевдоним sp) е запазен за извиквания
- r14 (псевдоним lr) не е запазен за извиквания
- r15 (псевдоним pc) е програмният брояч и е зададен на стойността на lr преди извикването на функцията
Това важи поне за настройките по подразбиране на arm-eabi-gcc. Има превключватели на командния ред (по-специално превключвателят -mabi), които могат да повлияят на резултатите.
person
Sven
schedule
13.08.2013
register
употреба. - person artless noise   schedule 15.04.2013