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
现在参阅%rax
, d
至%rdx
等
但是,对于%r8
.. %r15
没有特殊的限制或名称。 这里有一个很好的(x86-64特定的)内联汇编和约束使用教程。
GCC不提供像r10
, r8
这样的寄存器的限制
但是,您可能需要使用名为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