在gcc内联x86_64汇编中约束r10寄存器

时间:2013-04-14 09:51:27

标签: c gcc assembly x86-64 system-calls

我正在编写一个非常轻量级的libc替换库,以便我可以更好地理解内核 - 应用程序界面。第一项任务显然是使一些系统调用包装器到位。我已经成功地获得了1到3个参数包装器,但我正在努力使用4参数varient。这是我的出发点:

long _syscall4(long type, long a1, long a2, long a3, long a4)
{
    long ret;
    asm
    (
        "syscall"
        : "=a"(ret)
        : "a"(type), "D"(a1), "S"(a2), "d"(a3), "r10"(a4)
        : "c", "r11"
    );
    return ret;
}

编译器给出了以下错误:

error: matching constraint references invalid operand number

我的_syscall3函数工作正常,但不使用r10或有一个clobber列表。

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

寄存器没有限制:%r8 .. %15。但是,最近(如gcc-4.x)应该接受:

register long r10 asm("r10") = a4;

然后使用输入约束:"r" (r10)

这可能要求__asm__符合__volatile__ - 我在这里运行内存,所以我不能告诉你这个语法何时正式发布等等。这是一个明智的回收其他无用的register关键字。

答案 1 :(得分:0)

大概是因为没有指令对r10寄存器有特定要求,gcc人员没有为它创建约束(假设约束主要用于机器描述)。如果您坚持使用内联asm,我认为您不能比使用通用"r"(或"m")约束并自己移入r10(并将其添加到clobber列表中)做得更好)。