【问题标题】:Fix "error: unknown register name ‘r0’ in ‘asm’"修复“错误:‘asm’中的未知寄存器名称‘r0’”
【发布时间】:2014-12-08 08:33:00
【问题描述】:

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

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

/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,所以我不知道如何完成这项工作。

我需要包含一些头文件吗?还是需要设置一些构建标志?需要代码吗?

【问题讨论】:

  • 您应该添加您正在使用的 ARM 工具链以及如何调用它 - 该错误表明它使用的是主机汇编程序而不是 ARM 交叉汇编程序。
  • @Notlikethat Rockbox 似乎使用 arm-elf-eabi 工具链。但是,对于模拟器,它使用常规 gcc。我不确定它是如何工作的。我可以在源代码上运行一个简单的 grep 来为我提供信息吗?
  • 啊,如果有像 iOS 那样的基于主机的 API 模拟器(我对 Rockbox 一无所知),那么一个充满原始和内联汇编的项目无论如何都不会工作 - 最好专注于为设备构建并在真实硬件上运行。
  • @Notlikethat 在计算机上是否需要刷新缓存?我可以将这些行注释掉并在 sim 中正常运行吗?

标签: assembly arm rockbox


【解决方案1】:

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

但是,从 cmets 的反馈来看,在这种特殊情况下,您实际上遇到了相反的问题 - 正确的工具链,错误的代码。由于 Rockbox UI 模拟器是 not an emulator,它只会运行 x86 代码(假设您的主机是 x86 PC)并且您明确想要交叉编译,因此这个 ARM 版本既不会工作也无用 - 在内联 ARM 程序集、充满 ARM 代码的 .S 文件以及最终结果显然包含一个动态重新编译器这一事实之间,如果你开始破解不能在 x86 上构建或工作的东西你不会留下太多。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    相关资源
    最近更新 更多