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

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列表.

有什么想法吗?

Bre*_*ale 7

有对寄存器没有约束:%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;关键字.

  • 很棒的提示.这是一个非常棒的功能,真正有助于将GCC内联汇编器分开.以下是相关文档:https://gcc.gnu.org/onlinedocs/gcc/Local-Reg-Vars.html (2认同)

Jes*_*ter 0

大概是因为没有指令对r10寄存器有具体要求,所以 gcc 人员没有为其创建约束(假设约束主要针对机器描述)。如果您坚持使用内联汇编,我认为您没有比使用通用"r"(或"m")约束并进入r10您自己(并将其添加到破坏列表中)更好的了。