【问题标题】:unknow register name, asm未知的寄存器名称,asm
【发布时间】:2018-04-22 08:13:03
【问题描述】:

我想使用 C 编译汇编代码 (MIPS),但遇到了“没有寄存器名称”的问题。错误信息是:

ABS.c:8:2: error: unknown register name ‘$s1’ in ‘asm’

我的代码(ABS.c)如下:

#include<stdio.h>
#include<stdlib.h>

int ABS(int x)
{
int x_abs;

__asm__ __volatile__(
    "move $s1, %1\n"
    "bgez $s1, DONE\n"
    "NOP\n"
    "mult $s1, #-1\n"
    "mflo $s1\n"
    "DONE: move %0, $s1\n"
    : "=r"(x_abs)
    : "r"(x)
    : "$s1");
return x_abs;       
}

int main()
{
int result = ABS(2);
printf("%d", result);
system("pause");
return 0;
}

我想知道如何解决这个问题,THX!

【问题讨论】:

  • 确定您正在为 MIPS 进行编译吗?运行gcc -v。如果您看到 x86-64 或 i386,则说明您使用的是针对 x86 桌面的编译器。您的代码在 Godbolt 上的 MIPS gcc5.4 上编译良好:godbolt.org/g/LQ9t35。并给出了与 x86 gcc 描述的相同的错误。
  • 或者,如果您有旧版本的 gcc/binutils:stackoverflow.com/questions/721192/…
  • @Matteo:OP 的错误消息来自试图处理clobber 列表的编译器;它还没有进入汇编程序。您链接的 dup 稍后会出现问题,但 gcc5.4 确实 理解$s1。啊,我看到你没有欺骗它:)
  • @PeterCordes:嗯,骗锤的问题在于它太直接了;我只是想建议一下,并认为我在[组装]中没有金徽章-但这是[C]!关于clobber列表:这确实解释了奇怪的错误消息,实际上我希望汇编程序在move被x86处理时立即停止。
  • @MatteoItalia:啊,我明白了。对我来说,有时恰恰相反。我主要关注那些往往也有 asm 和/或 x86 标签的标签,所以当发现 OP 只标记 x86-64 或其他标签,而不是汇编或 C 或 C++ 或类似的东西时,这是一个令人不快的惊喜。至少有一次我在进行近距离投票之前要求其他人编辑标签列表,当我提前注意到时:P

标签: c assembly mips


【解决方案1】:

MIPS 中的所有寄存器都可以通过symbolic names or numbers 访问。我有同样的问题,我通过使用数字而不是符号名称来解决它,例如mov $17, %1 而不是 mov $s1, %1

【讨论】:

    猜你喜欢
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2023-03-11
    相关资源
    最近更新 更多