繁体   English   中英

内联汇编错误:在重新加载“asm”时在 class 'GENERAL_REGS' 中找不到寄存器

[英]inline assembly error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'

我有一个内联AT&T样式的汇编块,它适用于XMM寄存器,并且在我的XCode项目的发布配置中没有问题,但是我在调试配置中偶然发现了这个奇怪的错误(据说是GCC错误)...我可以以某种方式修复它吗? 汇编代码没什么特别的,但是我用了很多memory约束( 12个约束),会不会导致这个问题?

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

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

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

您可以发布一个示例asm("...":::)行来演示该问题吗?

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

movdqa (%rax),%xmm0

即 memory 通过保存在通用寄存器中的指针加载/存储,并且您指定的 memory 位置比可用的通用 regs 更多(在调试模式下可能为 12,因为因为RBPRSP用于帧/堆栈指针,并且可能用于全局偏移量的表RBXRAX保留用于返回)而没有意识到寄存器重用的潜力。

您可以通过执行以下操作来解决问题:

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) : ...);

即把所有的内存位置放到一个你作为操作数传递的表中,然后你自己管理实际的通用寄存器使用。 它可能是通过间接表访问两个指针,但是如果不知道完整的汇编代码段,很难说这是否会有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM