Явно получающие доступ окруженные валом регистры на ARM

Согласно руководству ARM, должно быть возможно получить доступ к окруженным валом регистрам для определенного режима CPU как, например, "r13_svc". Когда я пытаюсь сделать, этот gcc вопит на меня со следующей ошибкой:

непосредственное выражение требует # префикса - 'mov r2, sp_svc'

Что случилось?

Обновление. Следующий текст из Справочника Архитектуры ARM для ARMv5 и ARMv6 привел меня полагать, что это возможно, раздел A2.4.2:

Регистры R13 и R14 имеют шесть окруженных валом физических регистров каждый. Каждый используется в режимах User и System, и каждое оставление пять используется в одном из пяти режимов исключения. Где необходимо быть конкретным, о котором упоминается версия, Вы используете названия формы: R13_mode R14_mode, где режим является соответствующим из usr, svc (для Привилегированного режима), около, und, irq и fiq.

9
задан Demiurg 7 May 2010 в 08:23
поделиться

2 ответа

Я не думаю, что это возможно с помощью инструкции mov ; по крайней мере, согласно Справочному руководству по архитектуре ARM, которое я читаю. Какой у вас документ? Существует вариант ldm , который может загружать регистры пользовательского режима из привилегированного режима (используя ^ ). Единственный другой вариант - переключиться в режим SVC, выполнить mov r2, sp , а затем переключиться обратно в любой другой режим, который вы использовали.

Вы получаете ошибку, потому что он не понимает sp_svc , поэтому он думает, что вы пытаетесь выполнить немедленную mov , которая будет выглядеть так:

mov r2, #0x14

Вот почему написано «требуется префикс #».

4
ответ дан 4 December 2019 в 15:12
поделиться

Вы используете mrs и msr для изменения режимов, изменяя биты в cpsr, а затем используете r13 нормально.

Из arm arm

MRS R0,CPSR
BIC R0,R0,#0x1F
ORR R0,R0,#0x13
MSR CPSR_c,R0

затем

mov sp,#0x10000000

или если вам нужно больше битов в immediate

ldr sp,=0x12345600

или если вы не хотите, чтобы ассемблер размещал ваши данные, вы можете разместить их сами.

ldr sp,svc_stack
b 1f
svc_stack: .word 0x12345600
1:

Вы увидите типичный код запуска arm, где приложение собирается поддерживать прерывания, прерывания и другие исключения, установить все ваши указатели стека, которые вам понадобятся, изменить режим, установить sp, изменить режим, установить sp, изменить режим ...

2
ответ дан 4 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: