Хранение всех регистров без царапин

Я разрабатываю программу, которая будет запускать другую программу, поэтому в результате мне нужно сохранить регистры, передаваемые моей программе, чтобы я мог восстановить их перед переходом к программе, которая должна была быть загружена. Это голая металлическая система, без ОС, без MMU (присутствует, но в данный момент не используется).

Вот мой код, я просто хотел бы знать, правильный он или нет, так как у меня нет доски для тестирования, и я должен отправить это в ближайшее время,

Также правда ли, что относительные хранилища ПК могут использовать только нижние регистры исходных регистров (r0-r7), я думал, что это проблема большого пальца, связанная с отсутствием доступа к старшим регистрам в определенных инструкциях из-за ограниченной ширины инструкции.

reset: @ entry point, mapped in reset vector

/* Store registers for bootstrapping */
STR     R0, [PC, #128]
STR     R1, [PC, #128]
STR     R2, [PC, #128]
STR     R3, [PC, #128]
STR     R4, [PC, #128]
STR     R5, [PC, #128]
STR     R6, [PC, #128]
STR     R7, [PC, #128]

/* Following registers can't be used in pc relative load/store */
MOV     R0, R8
STR     R0, [PC, #128]
MOV     R0, R9
STR     R0, [PC, #128]
MOV     R0, R10
STR     R0, [PC, #128]
MOV     R0, R11
STR     R0, [PC, #128]
MOV     R0, R12
STR     R0, [PC, #128]
MOV     R0, SP
STR     R0, [PC, #128]
MOV     R0, LR
STR     R0, [PC, #128]
MRS     R0, CPSR
STR     R0, [PC, #128]
MRS     R0, SPSR
STR     R0, [PC, #128]
ISB     SY
B       clear_regs

saved_regs:
.rept 32
    .word 0x00000000
.endr

.align
clear_regs:
MOV     R0,  #0
MOV     R1,  #0
MOV     R2,  #0
MOV     R3,  #0
MOV     R4,  #0
MOV     R5,  #0
MOV     R6,  #0
MOV     R7,  #0
MOV     R8,  #0
MOV     R9,  #0
MOV     R10, #0
MOV     R11, #0
MOV     R12, #0
MOV     SP,  #0
MOV     LR,  #0

person sgupta    schedule 05.07.2012    source источник


Ответы (1)


В режиме ARM (по сравнению с режимом Thumb) можно использовать старшие регистры в относительном хранилище ПК. Ваш ассемблер предупредит вас, если что-то подобное не разрешено. Вы также можете рассмотреть возможность использования инструкции STM (Store Multiple), которая позволяет указать список регистров, а не выполнять их по отдельности.

Вероятно, вам следует позволить ассемблеру выполнить «тяжелую» работу по вычислению смещений ПК с помощью символов вместо указания смещений вручную.

reset: @ entry point, mapped in reset vector

/* Store registers for bootstrapping */
STR     R0, saved_regs
ADR     R0, saved_regs + 4

STMIA r0!, {r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15}

MRS     R1, CPSR
MRS     R2, SPSR
STMIA   R0, {r1, r2}
ISB     SY
B       clear_regs

saved_regs:
.rept 32
.word 0x00000000
.endr
person Pete Fordham    schedule 05.07.2012
comment
но хранить несколько не поддерживает cpsr, spsr и не поддерживает относительную адресацию ПК, которую мне нужно использовать, так как я не могу поцарапать какие-либо регистры, иначе я мог бы сохранить один регистр, а затем использовать его в качестве указателя для stmia с увеличенной обратной записью указатель и повторно использовать этот указатель для записи cpsr и spsr. Кроме того, как я могу использовать символы, чтобы заставить ассемблер изменить их на относительные смещения? - person sgupta; 06.07.2012
comment
Все хорошие моменты. Вам все еще нужно хранить часть регов с обычными магазинами. Смотрите мое обновление выше. - person Pete Fordham; 06.07.2012
comment
Вам не кажется, что вам нужно добавить 4 к r0 перед первым STMIA? :П - person sgupta; 06.07.2012