Включается во встроенную сборку
-
05-07-2019 - |
Вопрос
Мы работаем над игрушечной операционной системой в качестве задания для класса.У меня возникли некоторые проблемы с написанием функции паники ядра.
Он должен сохранить все регистры, вызвать какую-нибудь функцию, подобную printf, затем распечатать сохраненные регистры и остановить процессор.Прямо сейчас он определен как макрос:
#define panic(...) \
do{ \
asm volatile("SAVE_REGISTERS %1\n\t" : "m="(_panic_context)); \
_panic_printk(&_panic_context, __VA_ARGS__); \
while(0)
_panic_context
это глобальная переменная, которая содержит сохраненные регистры потока и еще кое-что.Проблема заключается в том, что SAVE_REGISTERS
.Это макрос, определенный где-то в заголовочном файле ассемблера, но я не знаю, как его включить.Простое #включить в файл, очевидно, не работает.Я пробовал гуглить и писать смешные и отчаянные вещи (например, #include в строках ассемблера :-) ), но ничего не помогло.У вас есть какие-нибудь идеи, как это решить?
Мы используем GCC и компилируем для MIPS (запускаем в симуляторе :-) )
Редактировать:SAVE_REGISTERS
определяется с помощью .macro SAVE_REGISTERS
....Это не может быть в макросе C, потому что оно используется в других модулях сборки.Я не могу создать с его помощью файл .S, потому что panic должен быть переменным.Или, по крайней мере, я не мог придумать никакого другого способа сделать это.
Решение
Я думаю, вы неправильно понимаете, как работают макросы.Они расширяются до того, как произойдет какая-либо другая компиляция.Вы не можете использовать asm
выдать некоторый код, содержащий макрос, потому что этот макрос никогда не будет расширен.
Вместо этого вы могли бы попробовать определить SAVE_REGISTERS
в качестве макроса C, который использует asm
инструкция по созданию вашего ассемблерного кода:
#define SAVE_REGISTERS(x) \
asm volatile ("movx ax, %1", ...);
тогда вы можете сделать
#define panic(...) \
do { \
SAVE_REGISTERS(_panic_context); \
_panic_printk(&_panic_context, __VA_ARGS__); \
} while(0);
Другие советы
У меня нет системы MIPS, но на моей коробке loonix для x86 я попробовал #include
и обнаружил , что #
является символом комментария, поэтому я попробовал .include
и это сработало, как только я процитировал имя файла: .include "something.i"
.
Теперь, если у вас есть заголовочные файлы и организованная инфраструктура для кода на ассемблере, я должен задаться вопросом, почему вы вообще хотите сделать это с помощью встроенного asm.Почему бы просто не сделать настоящий .s
или .S
файл, включите файл заголовка assembler и сделайте его первоклассным модулем в вашей системе?
Я видел маленькие шедевры, сделанные с asm даже в проектах, которые уже имели locore.S
в их Makefile
, пойди разберись...