我现在正在上一门汇编类(class),而检查我们的家庭作业的那个人是一个非常老练的老派优化狂。例如,如果他看到以下情况,则扣除10%:
mov ax, 0
代替:
xor ax,ax
即使只使用一次。
我不是汇编程序设计的初学者,但是我不是优化专家,所以我在某些方面需要您的帮助(可能是一个非常愚蠢的问题,但我还是会问):
如果我需要将寄存器值设置为1或(-1),则最好使用:
mov ax, 1
或做类似的事情:
xor ax,ax
inc ax
我真的需要一个好成绩,所以我正在努力使其尽可能优化。 (我需要同时优化时间和代码大小)
最佳答案
一个快速的8086 instructions timings size
谷歌打开了http://8086.tk/,它似乎具有8086(及更多)指令集的所有时间和大小。
毫无疑问,您可以在网上找到具有类似信息的官方英特尔doco。
对于您的具体问题:
xor ax,ax
inc ax
需要3 + 3 = 6个时钟周期和2 + 1 = 3个字节mov ax,1
需要4个时钟周期和3个字节。因此,在这种情况下,后者更好。
但是您需要与您的教育机构谈谈这个人。像乞for那样简单的事情的返回率为10%。
您应该问,如果有两种可能性,一种更快,一种更短,该怎么办。
然后,一旦他们承认根据您要实现的目标而采用不同的编码方式,请告诉他们您要实现的目标是可读性和可维护性,并且认真地避免浪费在此循环或字节*。
如果遇到性能问题,在一段代码处于接近完整的状态后,通常会执行优化操作-当代码仍然受到不小的影响时,几乎总是浪费精力。
值得一提的是,
sub ax,ax
在时钟周期和字节方面似乎与xor ax,ax
相当,因此也许您下次可以将其放入混音中以使他进行更多工作。* a)不,不是真的,但偶尔发泄很有趣:-)
关于assembly - 将寄存器设置为1或(-1)的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2826872/