Sep*_*and 6 x86 assembly flags parity
我们都知道,在查看源代码时,可以安全地假设方向标志清晰.方向标志的概率非常低.
我想了解其他旗帜的可能性.这就是为什么我编写了一个测试程序,它单步执行我现有的一些软件,为前12个EFLAGS位中的每一个增加一个计数器.
结果证实了关于方向标志(DF)的假设,并且毫不奇怪地表明溢出标志(OF)的概率非常低.
但其他旗帜怎么样?进位标志(CF),辅助标志(AF),零标志(ZF)和符号标志(SF)似乎稳定在25%,但奇偶校验标志(PF)跳出超过50%.
我想知道为什么CF,AF,ZF和SF的概率如此之低.
对于PF,我自己的两分钱解释告诉我,鉴于所有可能的8位位模式中的奇偶校验偶数和奇偶校验的50-50分布并且意识到一些最常用的数字(0和-1)具有甚至平价,超过50%的机会是合理的.
某些 EFLAGS 位发生更改的事实通常仅反映了这样一个事实:早期的 Intel 8086 指令(顺便说一句,仍然经常使用的指令)被设计为无条件更新标志。这个设计决策并没有得到很好的回报,但它也不会损害现代 x86 设计,直到有人使用标志值。使用标志(作为条件分支的谓词)会在代码流中创建依赖关系,并且可能会影响性能。
\n\n如果有两条(三、四\xe2\x80\xa6)指令随后更新相同的标志位,但稍后第三条指令仅使用最后一个值,则可以省略所有先前的标志计算。或者,可以延迟 EFLAGS 的重新计算,直到某些内容请求其实际值。
\n\n因此,单个 EFLAG 位的使用频率是一个更有趣的问题。有研究可以回答这个问题。
\n\n下图取自 Yair Lifshitz 等人。“Zsim:用于 ISA 设计空间探索的快速架构模拟器”第 3.2.3 节PDF:
\n\n\n\n正如您所看到的,没有人关心辅助标志,而进位标志和零标志会影响代码中的许多决策。其他作者得出了类似的结论,这在软件模拟设计等环境中很重要,因为它们允许在二进制翻译器和解释器中应用惰性标志评估的重要优化。
\n