当前位置: 首页 > 知识库问答 >
问题:

如何在GCC内联程序集中指定Intel x86_64寄存器r8到r15的寄存器约束?

柳胡媚
2023-03-14

共有1个答案

邬英武
2023-03-14

GCC不为R10R8等寄存器提供这样的约束。但是,您可以使用一个称为本地寄存器变量的特性。在使用此功能之前,请仔细阅读文档,尤其是警告段落。

例如:

static inline __attribute__((always_inline))
long syscall4(long n, long a1, long a2, long a3, long a4) {
    long ret;
    register long r10 __asm__("r10") = a4;
    __asm__ __volatile__ (
        "syscall\n\t"
        : "=a"(ret)
        : "a"(n),
          "D"(a1),
          "S"(a2),
          "d"(a3),
          "r"(r10)
        : "memory",
          "rcx",
          "r11"
    );
    return ret;
}

另请参见MUSL对系统调用存根的实现。

 类似资料:
  • 从Intel在https://software.intel.com/en-us/articles/introduction-to-x64-assembly上介绍x64汇编, RCX、RDX、R8、R9用于整数和指针参数,从左到右顺序为 寄存器RAX、RCX、RDX、R8、R9、R10和R11被认为是易失的,必须在函数调用时被销毁。 RBX、RBP、RDI、RSI、R12、R14、R14和R15必须

  • 我需要只使用%RAX、%RBX、%RCX、%RDX、%RSI和%RDI(还有%RSP和%RBP)编写像素化汇编代码 GCC编写的程序集代码: 已将%dl更改为%rdx:

  • 实地址模式下的寄存器集合包括8086定义的所有寄存器,加上80386新引入的寄存器:FS, GS, 调试寄存器,控制寄存器,和测试寄存器。可以显式的使用段寄存器FS和GS作为操作数,而且可以使用新引入的段-重写前缀来利用FS和GS来计算地址。指令可以利用操作数长度前缀来使用32位操作数。 保护模式下操作,检查80386选择符和描述符的指令导致未定义操作码陷阱(中断6);这些指令包括:VERR, V

  • Vim提供了许多寄存器。可以将这些寄存器用作多个剪贴板。使用多个文件时,此功能非常有用。在本章中,将讨论以下主题内容 - 复制寄存器中的文本 粘贴寄存器中的文本 列出可用的寄存器 寄存器类型 1. 复制寄存器中的文本 对于复制,可以使用普通的命令,即并将其存储在寄存器中,可以使用以下语法 - 例如,要复制寄存器中的文本,请使用以下命令 - 2. 粘贴寄存器中的文本 从寄存器粘贴文本 - 例如,下面

  • 当前的Perl 5虚拟机是一台堆栈机器。 它通过将操作保持在堆栈上来传递操作之间的值。 操作将值加载到堆栈上,执行他们需要执行的操作并将结果放回堆栈。 这很容易使用,但速度很慢。 要将两个数字相加,您需要执行三次堆栈推送和两次堆栈弹出。 更糟糕的是,堆栈必须在运行时增长,这意味着在您不想分配内存时分配内存。 因此,Parrot将打破虚拟机的既定传统,并使用寄存器架构,更类似于真实硬件CPU的架构。

  • 处理器操作主要涉及处理数据。 该数据可以存储在存储器中并从其上访问。 然而,从存储器读取数据和将数据存储到存储器中会降低处理器的速度,因为它涉及通过控制总线向存储器存储单元发送数据请求并通过相同通道获取数据的复杂过程。 为了加速处理器操作,处理器包括一些内部存储器存储位置,称为registers 。 寄存器存储数据元素以便处理而无需访问存储器。 处理器芯片内置有限数量的寄存器。 处理器寄存器 IA