我正在编写一个非常轻量级的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列表。
有什么想法吗?
答案 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列表中)做得更好)。