GCC内联汇编:intel x86上的寄存器限制

这是寄存器加载代码的列表:

一个EAX
b ebx
c ecx
d edx
S esi
D edi
我常量值(0到31)
q,r动态分配寄存器(见下文)
g eax,ebx,ecx,edx或内存中的变量
eax和edx合并为一个64位整数(使用长整数)

但这是intel i386的注册限制。 我的问题是,我可以在哪里找到intel x86_64系统的寄存器限制,如:

? R10%
? R8%
? %的RDX

等等。


机器特定的约束在gcc手册中有一部分 - 丑陋的细节可以在config / i386 / constraints.md中找到。

一些约束对于x86-64具有不同的含义,例如,在32位模式下, q%eax%ebx%ecx%edx ; 在64位模式下,它是任何通用的整数寄存器 - 与r约束基本相同。 像特定寄存器名字a现在参阅%raxd%rdx

但是,对于%r8 .. %r15没有特殊的限制或名称。 这里有一个很好的(x86-64特定的)内联汇编和约束使用教程。


GCC不提供像r10r8这样的寄存器的限制

但是,您可能需要使用名为Local Reg Vars的功能

例如,

#define syscall4( number, _1, _2, _3, _4 )  
({                                          
    int64_t ret;                            
    register int64_t r10 asm("r10") = _4;   
    __asm__ volatile                        
    (                                       
        "syscallnt"                       
        : "=a"( ret )                       
        : "a"( number ),                    
          "D"( _1 ),                        
          "S"( _2 ),                        
          "d"( _3 ),                        
          "r"( r10 )                        
        : "memory", "rcx", "r11"            
    );                                      
    ret;                                    
})
链接地址: http://www.djcxy.com/p/15223.html

上一篇: GCC inline assembly: register constraints on intel x86

下一篇: How exactly does