我组装当然,现在服用,谁检查我们的家分配的家伙是一个很迂腐的老派优化怪胎。例如他扣除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个字节。

因此后者是在这种情况下更好。


但你需要谈谈你对这个家伙的教育机构。 10%这样的乞丐信念一个简单的事情。

您应该问什么应该在你有两种可能性,一种更快,更短的一个。

的情况下进行

然后,一旦他们承认有不同的方式取决于你想要达到什么样的代码,告诉他们,你想达到什么样的可读性和可维护性和严重无法给出的飞跃关于浪费周期或这里字节或有 *一个

优化是你一般做些什么,如果当你有一个性能问题,经过一段代码是在一个近乎完整的状态 - 它几乎总是事倍功半当代码仍然受到变化的不可忽略的可能性

有关它的价值,sub ax,ax似乎是在同水准与时钟周期和字节为单位xor ax,ax,所以也许你可以把那到混合下一次造成他一些更多的工作。

<分> <子> *一)不,不是真的,但它的乐趣,偶尔发泄: - )

其他提示

你最好不要用

MOV AX,1

在8086,如果你跟踪寄存器的内容,你都不可能做的更好,如果你知道,例如,BX已经有一个1在里面:

MOV AX,BX

或者如果知道AH是0:

MOV AL,1

根据您的情况,您可能能够逃脱...

 sbb ax, ax

结果要么是0,如果进位标志未设置,或者-1,如果进位标志置位。

然而,如果上面的例子并不适用于你的情况,我会推荐

xor  ax, ax
inc  ax

方法。它应该满足您的尺寸为教授。但是,如果你的处理器使用的任何管衬,我认为会有一些耦合像两条指令之间的延时(我很可能是错上)。如果这样的耦合存在,则速度可以略微通过重新排序你的指令稍微有(一个不使用斧)在它们之间的另一个指令的提高。

希望这有助于。

我会使用在任何情况下mov [e]ax, 1。它的编码比hackier xor序列不再,我敢肯定它的速度更快,任何地方。 8086只是奇怪足以成为例外,而且因为那个东西是如此缓慢,这样的微型优化将使得大多数的区别。但是,任何别的地方:执行2“容易”的指令总是慢于执行1,尤其是当你考虑数据的危害和长管道。你想在第二天指令读取寄存器修改后,所以,除非你的CPU可以绕过来自流水线级N(其中xor正在执行)的结果向第N-1(其中inc一家努力的负荷的寄存器,没关系增加1到它的价值),你将有摊位。

其它需要考虑的事项:取指令带宽(没有实际意义为16位代码,都是3个字节); mov避免改变标志(更可能是比他们都迫使零有用的);这取决于其它值寄存器可能会保留,你也许可以做到lea ax,[bx+1](也是3个字节,即使是在32位代码,对标志没有影响);正如其他人所说,sbb ax,ax可以在环境工作过 - 这也是在更短的2个字节

当面临这些各种各样的微优化你真的应该测量替代品,而不是连在处理器手册盲目地依赖

P.S。新作业:是xor bx,bxxor bx,cx任何更快(在任何处理器)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top