内联汇编错误:在重新加载'asm'时无法在类'GENERAL_REGS'中找到寄存器

时间:2011-05-31 07:56:09

标签: xcode gcc assembly constraints inline-assembly

我有一个内联 AT& T 样式的程序集块,它可以与 XMM 寄存器配合使用,并且我的发布配置没有问题 XCode 项目,但我在调试配置中偶然发现了这个奇怪的错误(可能是 GCC 错误)......我可以修复不知怎的?汇编代码没什么特别之处,但我使用了很多内存限制( 12约束),这会导致这个问题吗?

2 个答案:

答案 0 :(得分:0)

默认情况下,Debug配置使用-O0。由于此标志禁用了优化,因此编译器可能无法在给定内联汇编代码指定的约束的情况下分配寄存器,从而导致寄存器不足。

一种解决方案是指定不同的优化级别,例如-Os,这是Release配置中默认使用的版本。

答案 1 :(得分:0)

不是完整的答案,对不起,但评论部分太短了......

您可以发布展示问题的示例asm("..." :::)行吗?

使用XMM寄存器不是问题,错误消息表明GCC想要创建代码,例如:

movdqa (%rax),%xmm0

即。通过通用寄存器中保存的指针加载/存储内存,并且您指定的内存位置多于可用的通用寄存器(调试模式下可能为12;因为RBPRSP用于帧/堆栈指针和在没有实现寄存器重用潜力的情况下,全局偏移表可能RBX而返回保留RAX

你可以通过以下方式来解决问题:

void *all_mem_args_tbl[16] = { memarg1, memarg2, ... };
void *trashme;

asm ("movq (%0), %1\n\t"
     "movdqa (%1), %xmm0\n\t"
     "movq 8(%0), %1\n\t"
     "movdqa (%1), %xmm1\n\t"
     ...
     : "r"all_mem_args_tbl : "r"(trashme) : ...);

即。将所有mem位置放入一个作为操作数传递的表中,然后自己管理实际的通用寄存器使用。它可能是通过间接表进行的两次指针访问,但是如果不知道你的完整汇编程序代码片段,这是否会产生影响很难说。