Ответы CesarB и Павла содержали цитаты из 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 сохраняются вызываемым
- r12 (псевдоним ip) не сохраняется для вызываемого абонента
- 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