Переключение контекста с помощью встроенной сборки руки

У меня есть еще один вопрос о встроенной инструкции по сборке, касающейся переключения контекста. Этот код может работать, но я не уверен на 100%, поэтому я отправляю этот код профессионалам stackoverflow ;-)

Я компилирую с помощью gcc (без оптимизации) для arm7TDMI. В какой-то момент код должен выполнить переключение контекста.

/* Software Interrupt */
/* we must save lr in case it is called from SVC mode */
#define ngARMSwi(code) __asm__("SWI %0" : : "I"(code) : "lr")
// Note : code = 0x23 

Когда я проверяю скомпилированный код, я получаю такой результат:

svc 0x00000023

Человек до меня, который кодировал это, написал «мы должны сохранить lr», но в скомпилированном коде я не вижу никаких следов сохранения lr.

Причина, по которой я думаю, что код может быть неправильным, заключается в том, что программа запускается в течение некоторого времени, прежде чем перейти в исключение сброса, и одна из последних вещей, выполняемых кодом, - это переключение контекста...


person Martin Allard    schedule 27.03.2012    source источник


Ответы (2)


Оператор __asm__ перечисляет lr как затертый регистр. Это означает, что компилятор сохранит регистр, если потребуется.

Поскольку вы не видите никакого сохранения, я думаю, вы можете предположить, что компилятор не использовал этот регистр (по крайней мере, в вашем тестовом примере).

person ams    schedule 27.03.2012

Я думаю, что инструкция SWI должна вызываться в пользовательском режиме. если это правильно. После этой инструкции режим ARM переключается в режим SVC. затем ядро ​​ARM выполняет операцию копирования: CPSR копируется в SPSR_svc, а LR копируется в LR_svc. это следует использовать для сохранения контекста процессора пользовательского режима для возврата из режима svc. если ваш обработчик исключений svc использует lr, например, вызов другой функции, регистр lr должен быть сохранен, например, при использовании стека между изменением режима. Я предполагаю, что человек до вас написал так, чтобы поговорить об этой ситуации.

person attila    schedule 25.08.2016