Исправлена ​​ошибка: неизвестное имя регистра "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 на реальном оборудовании, как только основы будут выполнены.

Другие вопросы по тегам