为什么此内联asm不使用较新的GCC(匹配约束)编译?
我正在移植一些源代码,这些源代码最初使用用于NIOS2体系结构的GCC 3系列编译器编译。将其移植到GCC 4.8.2。我从许多内联asm代码中得到错误:“错误:匹配约束引用了无效的操作数” 错误来自内联asm的输入行(在第二个冒号之后)。我尝试过搜索,但没有找到寄存器“D”所指的类型(似乎不是标准约束,也没有将其列为NIOS2的特定于体系结构的约束)。错误指的是数字,但我对数字和它们所指的内容更加困惑,我知道它们被称为匹配约束,与匹配指令操作数有关,但陷阱没有任何操作数。。。?在这种情况下,如果我将数字更改为1-4,我可以使错误消失,但我需要了解它的作用以及在GCC中发生的更改。我阅读了所有中间版本的迁移指南,没有看到任何相关内容 编辑:也不确定“callno”指的是什么为什么此内联asm不使用较新的GCC(匹配约束)编译?,gcc,inline-assembly,nios,Gcc,Inline Assembly,Nios,我正在移植一些源代码,这些源代码最初使用用于NIOS2体系结构的GCC 3系列编译器编译。将其移植到GCC 4.8.2。我从许多内联asm代码中得到错误:“错误:匹配约束引用了无效的操作数” 错误来自内联asm的输入行(在第二个冒号之后)。我尝试过搜索,但没有找到寄存器“D”所指的类型(似乎不是标准约束,也没有将其列为NIOS2的特定于体系结构的约束)。错误指的是数字,但我对数字和它们所指的内容更加困惑,我知道它们被称为匹配约束,与匹配指令操作数有关,但陷阱没有任何操作数。。。?在这种情况下,如
#define POS_SYSCALL(R,N,P,A,B) \
__asm__ volatile ("trap\n" \
: "=r"(R), "=r"(N), "=r"(P), "=r"(A), "=r"(B) \
: [callno]"D04"(N), "D05"(P), "D06"(A), "D07"(B) \
: "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "memory");
__inline__
int syscall(int callnr, int param, void * a, void * b)
{
register int result __asm__("r2");
register int arg0 __asm__("r5") = (int)param;
register void * arga __asm__("r6") = a;
register void * argb __asm__("r7") = b;
POS_SYSCALL(result, callnr, arg0, arga, argb);
return result;
}
好吧,我可以告诉你,
callno
指的是什么。查看,可以为操作数指定符号名。这将允许您在asm模板中使用%[callno]
,而不是%5
。在这种情况下,它只不过是一个注释。通过查看Nios II系列,我没有看到将D
列为有效约束,因此我不确定这是在做什么。从逻辑上讲,它必须(以某种方式)准确定义将值放入哪个寄存器。电话号码不能直接进入“任何可用”登记簿。陷阱
在特定的位置等待它。查看nios上的trap
文档可能会给您一些线索。因此,猜测一下,它是说“输入:r4=N,r5=PR6=a r7=B”和“输出:R=r2,N=?,P=r5,a=r6,B=r7”。N可能是某个未知值(但可能与输入值不同)。但是我对NIOS一无所知,所以对此我有充分的了解。好吧,我可以告诉你callno
是指什么。查看,可以为操作数指定符号名。这将允许您在asm模板中使用%[callno]
,而不是%5
。在这种情况下,它只不过是一个注释。通过查看Nios II系列,我没有看到将D
列为有效约束,因此我不确定这是在做什么。从逻辑上讲,它必须(以某种方式)准确定义将值放入哪个寄存器。电话号码不能直接进入“任何可用”登记簿。陷阱
在特定的位置等待它。查看nios上的trap
文档可能会给您一些线索。因此,猜测一下,它是说“输入:r4=N,r5=PR6=a r7=B”和“输出:R=r2,N=?,P=r5,a=r6,B=r7”。N可能是某个未知值(但可能与输入值不同)。但我对NIOS一无所知,所以要多加注意。