设置寄存器为1或(-1)的最有效方法

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)不,不是真的,偶尔发泄也很有趣:-)