внутри голой функции - как сделать простое назначение

На самом деле, моя проблема была связана с версией Spring Tool Suite, которую я использовал. Оказывается, я обновил свою среду, используя сайт обновления, вместо загрузки новой версии. Я использовал Spring Tool Suite 4.7.3a вместо 4.8.0. Использование 4.8.0 разрешило проблему.

0
задан Peter Cordes 19 January 2019 в 02:55
поделиться

1 ответ

Нам повезло, что ваша предыдущая версия функции работала без сбоев.

Единственное, что может быть безопасно помещено в функцию naked, это чистый базовый оператор Asm. https://gcc.gnu.org/onlinedocs/gcc/ARM-Function-Attributes.html . Вы можете разделить его на несколько операторов Basic Asm вместо asm("insn \n\t" / "insn2 \n\t" / ...);, но вы должны написать всю функцию в asm самостоятельно.

Хотя использование расширенного asm или смеси базового кода asm и C может показаться работоспособным, от них нельзя полагаться, что они работают надежно, и они не поддерживаются.

Если вы хотите запустить код C ++ из голой функции, вы можете call обычную функцию (или bl в ARM, jal в MIPS и т. д.), следуя стандартному вызову конвенции.


Как по конкретной причине в этом случае? Может быть, создание этого адреса в регистре наступило на функцию args, что привело к неправильной ветке? Проверьте сгенерированный asm, если хотите, но он на 100% не поддерживается.

Или, может быть, он использовал больше регистров, и, поскольку он naked не сохранил должным образом / не восстановил регистры, сохраненные при вызове? Я сам не смотрел на генератор кода для поиска голых функций.

Вы уверены, что эта функция должна быть naked? Я думаю, это потому, что вы манипулируете lr, чтобы вернуться в новый контекст.

Если вы не хотите просто писать больше логики в asm, возможно, вам нужно, чтобы вызывающая функция выполняла больше работы (и, возможно, передавала ей указатель и / или логические аргументы, говоря ей более просто, что нужно сделать, чтобы ваши входные данные были уже есть в регистрах, и вам не нужен доступ к глобальным переменным).

0
ответ дан Peter Cordes 19 January 2019 в 02:55
поделиться
Другие вопросы по тегам:

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