Исправлена ошибка: неизвестное имя регистра "r0" в "asm"
Я пытаюсь перенести некоторый открытый исходный код на новую платформу (в частности, gpsp из этого источника в rockbox fuze+ target).
Прямо сейчас я просто пытаюсь заставить это скомпилироваться, и я буду работать над тем, чтобы запустить его позже. После исправления многих ошибок и предупреждений я остаюсь с этой ошибкой:
/home/username/rockbox/apps/plugins/rockgba/gpsp/arm/warm.c: In function ‘warm_cache_op_range’:
/home/username/rockbox/apps/plugins/rockgba/gpsp/arm/warm.c:65:2: error: unknown register name ‘r3’ in ‘asm’
__asm__("mov r0, %0 ;"
^
/home/username/rockbox/apps/plugins/rockgba/gpsp/arm/warm.c:65:2: error: unknown register name ‘r2’ in ‘asm’
/home/username/rockbox/apps/plugins/rockgba/gpsp/arm/warm.c:65:2: error: unknown register name ‘r1’ in ‘asm’
/home/username/rockbox/apps/plugins/rockgba/gpsp/arm/warm.c:65:2: error: unknown register name ‘r0’ in ‘asm’
Соответствующий код от warm.c
является:
static void sys_cacheflush(void *start, void *end)
{
#ifdef __ARM_EABI__
/* EABI version */
int num = __ARM_NR_cacheflush;
__asm__("mov r0, %0 ;"
"mov r1, %1 ;"
"mov r2, #0 ;"
"mov r7, %2 ;"
"swi 0" : : "r" (start), "r" (end), "r" (num)
: "r0", "r1", "r2", "r3", "r7");
#else //line 63
/* OABI */ //line 64
__asm__("mov r0, %0 ;" //line 65
"mov r1, %1 ;" //line 66
"mov r2, #0 ;"
"swi %2" : : "r" (start), "r" (end), "i" __ARM_NR_cacheflush
: "r0", "r1", "r2", "r3");
#endif
}
У меня нет опыта сборки, и уж точно не ARM, поэтому я понятия не имею, как это сделать.
Есть ли какой-нибудь заголовочный файл, который мне нужно включить? Или какой-то флаг сборки, который нужно установить? Код нужен вообще?
1 ответ
Эта ошибка происходит из-за передачи ассемблерного кода ARM ассемблеру, который его не понимает. Это обычно является результатом неверно сконфигурированного набора инструментов /makefile при кросс-компиляции - вызове as
скорее, чем <cross-compiler-prefix>-as
,
Однако, судя по отзывам в комментариях, в этой конкретной ситуации у вас фактически возникает противоположная проблема - правильный набор инструментов, неправильный код. Поскольку симулятор Rockbox UI не является эмулятором, он будет запускать только код x86 (при условии, что ваш хост является компьютером x86), и вы явно не хотите кросс-компилировать, поэтому эта сборка ARM не будет ни работать, ни быть полезной - между встроенная сборка ARM, файлы. S, полные кода ARM, и тот факт, что конечный результат, по-видимому, содержит динамический перекомпилятор, который будет генерировать код ARM для выполнения во время выполнения, если вы начнете взламывать вещи, которые не будут собираться или работать на x86 у вас не останется много.
Поскольку gpSP, по-видимому, также имеет сборку x86, я думаю, вы могли бы - довольно нелогично - попробовать использовать это для первоначального запуска на симуляторе, а затем переключиться на сборку ARM на реальном оборудовании, как только основы будут выполнены.