gpt4 book ai didi

assembly - 使用CMP reg,0和OR reg,reg测试寄存器是否为零?

转载 作者:行者123 更新时间:2023-12-03 15:29:08 26 4
gpt4 key购买 nike

使用以下代码是否存在执行速度差异:

cmp al, 0
je done


以及以下内容:

or al, al
jz done


我知道JE和JZ指令是相同的,并且使用OR可以使字节大小提高1个字节。但是,我也关心代码速度。逻辑运算符似乎比SUB或CMP快,但我只是想确保。这可能是在大小和速度之间进行权衡,或者是双赢(当然,代码将更加不透明)。

最佳答案

这取决于确切的代码序列,它是哪个特定的CPU以及其他因素。

or al, al,的主要问题是它“修改”了EAX,这意味着以某种方式使用EAX的后续指令可能会停顿,直到该指令完成。请注意,条件分支(jz)也取决于指令,但是CPU制造商做了很多工作(分支预测和推测执行)来减轻这种情况。还要注意,从理论上讲,CPU制造商有可能设计出在这种特定情况下不能识别EAX的CPU,但是有数百种特殊情况,而识别其中大多数的好处太少了。

cmp al,0的主要问题是它稍大一些,这可能意味着较慢的指令获取/更高的缓存压力,并且(如果是循环)可能意味着该代码不再适合某些CPU的“循环缓冲区”。

正如杰斯特在评论中指出的那样; test al,al避免了这两个问题-它小于cmp al,0,并且不修改EAX

当然(取决于特定的顺序)AL中的值必须来自某个地方,并且如果它来自正确设置标志的指令,则可以修改代码以避免使用另一条指令再次设置标志后来。

关于assembly - 使用CMP reg,0和OR reg,reg测试寄存器是否为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33721204/

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