【发布时间】: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