Bob*_*Bob 19 performance assembly xor cpu-registers x86-16
我现在正在参加一个装配课程,那个检查我们家庭作业的人是一个非常迂腐的老派优化狂.例如,如果他看到,他会扣除10%:
mov ax, 0
Run Code Online (Sandbox Code Playgroud)
代替:
xor ax,ax
Run Code Online (Sandbox Code Playgroud)
即使它只使用一次.
我不是一个完整的汇编程序初学者,但我不是一个优化专家,所以我需要你的帮助(可能是一个非常愚蠢的问题,但无论如何我都会问):如果我需要将寄存器值设置为1或(-1)最好使用:
mov ax, 1
Run Code Online (Sandbox Code Playgroud)
或做类似的事情:
xor ax,ax
inc ax
Run Code Online (Sandbox Code Playgroud)
我真的需要一个好成绩,所以我试图让它尽可能优化.(我需要优化时间和代码大小)
pax*_*blo 10
一个快速谷歌8086 instructions timings size出现http://8086.tk/似乎有8086(和更多)指令集的所有时间和大小.
毫无疑问,您可以在网上找到具有类似信息的官方英特尔doco.
针对您的具体问题:
xor ax,ax
inc ax
Run Code Online (Sandbox Code Playgroud)
需要3 + 3 = 6个时钟周期和2 + 1 = 3个字节
mov ax,1
Run Code Online (Sandbox Code Playgroud)
需要4个时钟周期和3个字节.
所以后者在这种情况下更好.
但你需要和你的教育机构谈谈这个人.对于像乞丐信仰那样简单的事情,这个10%.
你应该问在你有两种可能性的情况下应该做些什么,一种更快,一种更短.
然后,一旦他们承认根据你想要实现的目标有不同的编码方式,告诉他们你想要实现的是可读性和可维护性,并且严重无法实现浪费的飞跃循环或字节在这里或那里*a.
在一段代码处于接近完成状态之后,如果遇到性能问题,通常会执行优化 - 当代码仍然受到无关紧要的变更可能性时,几乎总是浪费精力.
对于它的价值而言,sub ax,ax似乎与xor ax,ax时钟周期和字节数相当,所以也许你可以在下次将其投入混音中以使他做更多的工作.
*a)不,不是真的,偶尔发泄也很有趣:-)