Я разрабатываю программу, которая будет запускать другую программу, поэтому в результате мне нужно сохранить регистры, передаваемые моей программе, чтобы я мог восстановить их перед переходом к программе, которая должна была быть загружена. Это голая металлическая система, без ОС, без 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