gpt4 book ai didi

assembly - 在 x86 汇编中,有效地址中的寄存器算术如何编译为字节码?

转载 作者:行者123 更新时间:2023-12-04 08:06:20 28 4
gpt4 key购买 nike

汇编编译器如何编译如下指令:

mov eax, [bx+si]

或者
mov eax, [ebp + 4*eax - 40]

免责声明:我对这些东西还是很陌生。

从我目前的知识水平来看,我很难理解。我已经用尽了谷歌,但找不到关于它如何编译的解释;只是关于它的作用。因为根据我目前的理解,它不能是预先确定的计算。

这是否会生成一个特定的、不同的操作码,然后传入这些片段,然后 CPU 会自动为它处理?如果是这样,我在找到的所有 x86 引用资料中都错过了这一点;或者我可能没有寻找正确的东西或我期望引用文献显示它的内容。

还是在编译时注入(inject)一堆指令来在指令本身之前进行数学运算?虽然,通过阅读使用这种技术执行某些乘法运算的各种资源比调用 MUL 更快(类似于 mov eax, [eax*4 + eax] 的内容(如果我记错了,请原谅我)相当于乘以 5,但更快)。它让我相信这不可能是这样处理的。

我也没有找到关于 x86 程序集编译过程的好的指南/阅读。只有在其中编程的资源。因此,如果有人知道任何好的资源,请告诉我。 :)

谢谢!

最佳答案

所有处理器都有一组寻址模式,必须在架构定义中建模。

编译器后端将中间表示与一系列可用寻址模式的模式进行匹配。通常 IR 会显式计算地址。 “窥视孔优化”寻找机会将计算合并到指令中,使用匹配的寻址模式。

有时优化器会做相反的事情,有时他们将计算提升到循环之外,然后使用简单的指针取消引用寻址模式。最佳选择尚不清楚,这取决于复杂寻址模式计算对目标的接近零成本的程度。

由于减少了保存计算地址的需要,复杂的寻址模式可以减少寄存器压力。

如果你想更深入地了解编译器是如何做的,你应该阅读这个 Stanford University online material关于编译器实现。在讲义 18 和第 8 讲中会很有趣。我假设您将使用解析器生成器,因此现在可以跳过关于它如何精确解析的理论。

关于assembly - 在 x86 汇编中,有效地址中的寄存器算术如何编译为字节码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37176000/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com