为什么这个内联asm没有用更新的GCC编译(匹配约束)?

时间:2017-10-09 04:27:34

标签: gcc inline-assembly nios

我正在移植一些代码,这些代码最初是用于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;
}

0 个答案:

没有答案