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:内存引用过多的主要内容,如果未能解决你的问题,请参考以下文章