gas:内存引用过多

Posted

技术标签:

【中文标题】gas:内存引用过多【英文标题】:gas: too many memory reference 【发布时间】:2011-02-01 15:59:46 【问题描述】:

编译以下指令时:

movl 4(%ebp), 8(%ebp)

我得到:内存引用过多

这有什么问题?

【问题讨论】:

内存引用过多。 相关:Why isn't movl from memory to memory allowed? 详细解释了为什么存在这种指令编码限制。 Assembly: MOVing between two memory addresses 还讨论了选择 tmp 寄存器和使用 movzx 加载仅复制字节或字的详细信息。 【参考方案1】:

括号前的数字是字节偏移量(导致发生内存引用),movl 不能有两个。您需要先将值暂时移动到寄存器中。

movl 4(%ebp), %ecx
movl %ecx, 8(%ebp)

【讨论】:

【参考方案2】:

这不是法律指令。对于大多数引用内存的指令,您必须将其移入/移出寄存器。

【讨论】:

【参考方案3】:

movl 不会进行内存-内存移动,您必须通过寄存器(因此有两条 movl 指令)。

【讨论】:

谢谢,但这是为什么呢?是限制这个还是其他什么的 cpu 架构? 是的,这是 CPU 的限制。 MOVS 是唯一的内存到内存指令。 是的,内存到内存无法高效地实现(非 x86 CPU 倾向于将所有指令都注册到注册,加载/存储作为唯一的注册到-内存)。

以上是关于gas:内存引用过多的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 声明new 过多临时对像会导致内存溢出,怎么解决?

java内存溢出的问题如何排查

引用传递分析/没学明白(不用太纠结垃圾内存的问题

内存溢出的解决方法

java 关于内存泄漏和内存溢出

内存溢出