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

标签 assembly performance xor cpu-registers x86-16

我现在正在上一门汇编类(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/

相关文章:

c - 有没有办法将汇编代码插入到 C 中?

iOS ARM64 系统调用

c - ARM汇编跳转到地址

java - 使用try-finally执行return后的语句

ios - Swift - 性能明智 - 比较两个数组并获得每个数组的差异和两个数组的共同点

java - 澄清处理数千个日志文件的线程性能

list - 在 KDB 中是否有与 `outer` 等效的 `exclusive or` 或 `inter` 运算符?

javascript - 将两个32bit寄存器中的64bit除以32bit

c - C中的某些字节异或

algorithm - 数字异或 = X