修复“错误:'asm'中未知的寄存器名称'r0'”

时间:2014-10-13 17:38:34

标签: assembly arm rockbox

我正在尝试将一些开源代码移植到一个新平台(特别是gpsp从this source到rockbox引信+目标)。

现在我只是想让它进行编译,我会努力让它在以后运行。在修复了许多错误和警告后,我留下了这个错误:

/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 个答案:

答案 0 :(得分:2)

该错误来自将ARM汇编代码传递给无法理解的汇编程序。这通常是交叉编译时配置错误的工具链/ makefile的结果 - 调用as而不是<cross-compiler-prefix>-as

但是,根据评论中的反馈,在这种特殊情况下,你实际上有相反的问题 - 正确的工具链,错误的代码。由于Rockbox UI模拟器是not an emulator,它只会运行x86代码(假设您的主机是x86 PC)并且您明确地不想想要交叉编译,因此这ARM构建既不工作也不有用 - 在内联ARM程序集,充满ARM代码的.S文件之间,以及最终结果显然包含动态重新编译器的事实,它将生成在运行时执行的ARM代码,如果你开始攻击那些不会在x86上构建或工作的东西,你不会留下太多东西。

由于gpSP显然也有x86版本,我想你可以 - 而非违反直觉 - 尝试在模拟器上使用它进行初始启动,然后在完成基本操作后切换到真实硬件上的ARM版本。