为什么此内联asm不使用较新的GCC(匹配约束)编译?

为什么此内联asm不使用较新的GCC(匹配约束)编译?,gcc,inline-assembly,nios,Gcc,Inline Assembly,Nios,我正在移植一些源代码,这些源代码最初使用用于NIOS2体系结构的GCC 3系列编译器编译。将其移植到GCC 4.8.2。我从许多内联asm代码中得到错误:“错误:匹配约束引用了无效的操作数” 错误来自内联asm的输入行(在第二个冒号之后)。我尝试过搜索,但没有找到寄存器“D”所指的类型(似乎不是标准约束,也没有将其列为NIOS2的特定于体系结构的约束)。错误指的是数字,但我对数字和它们所指的内容更加困惑,我知道它们被称为匹配约束,与匹配指令操作数有关,但陷阱没有任何操作数。。。?在这种情况下,如

我正在移植一些源代码,这些源代码最初使用用于NIOS2体系结构的GCC 3系列编译器编译。将其移植到GCC 4.8.2。我从许多内联asm代码中得到错误:“错误:匹配约束引用了无效的操作数”

错误来自内联asm的输入行(在第二个冒号之后)。我尝试过搜索,但没有找到寄存器“D”所指的类型(似乎不是标准约束,也没有将其列为NIOS2的特定于体系结构的约束)。错误指的是数字,但我对数字和它们所指的内容更加困惑,我知道它们被称为匹配约束,与匹配指令操作数有关,但陷阱没有任何操作数。。。?在这种情况下,如果我将数字更改为1-4,我可以使错误消失,但我需要了解它的作用以及在GCC中发生的更改。我阅读了所有中间版本的迁移指南,没有看到任何相关内容

编辑:也不确定“callno”指的是什么

#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一无所知,所以要多加注意。