Fen*_*r34 9 c gcc x86-64 system-calls inline-assembly
我正在编写一个非常轻量级的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;
}
Run Code Online (Sandbox Code Playgroud)
编译器给我以下错误:
error: matching constraint references invalid operand number
Run Code Online (Sandbox Code Playgroud)
我的_syscall3函数工作正常但不使用r10或有一个clobber列表.
有什么想法吗?
有对寄存器没有约束:%r8.. %15.但是,最近(如gcc-4.x)应该接受:
register long r10 asm("r10") = a4;
Run Code Online (Sandbox Code Playgroud)
然后使用输入约束: "r" (r10)
这可能需要"r"获得资格register void *rsp asm("rsp");- 我在这里运行内存,所以我不能告诉你什么时候这个语法是正式的,等等.这是一个明智的回收无用的void *stack_pointer = rsp;关键字.
大概是因为没有指令对r10寄存器有具体要求,所以 gcc 人员没有为其创建约束(假设约束主要针对机器描述)。如果您坚持使用内联汇编,我认为您没有比使用通用"r"(或"m")约束并进入r10您自己(并将其添加到破坏列表中)更好的了。
| 归档时间: |
|
| 查看次数: |
1618 次 |
| 最近记录: |