Ответы 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 (alias 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 (alias lr) не восстанавливается.
Резюмируя:
- r0-r3 является не вызываемого модулем сохраняемого
- r4-r11 являются вызываемым модулем сохраняемого
- r12 (псевдоним IP) являетесь не вызываемых сохраняемым
- r13 (alias sp) сохранен в обращении
- r14 (alias lr) is не callee-saved
- r15 (псевдоним ПК) счетчик программы и устанавливается на значение ЛО до вызова функции
Это справедливо, по крайней мере по умолчанию Арм-EABI-ССЗ годов. Существуют переключатели командной строки (в частности, переключатель -mabi), которые могут влиять на результаты.
Это внешняя ссылка, которая может быть полезна. [APCS intro] (http://www.heyrick.co.uk/assembler/apcsintro.html), особенно некоторые [разные имена] (http://sourceware.org/ml/binutils/2000-06/msg00240.html) для использования `register`. – 2013-04-15 18:59:53