李忠武
(保山学院,云南保山,678000)
基于汇编语言教学中优化语言代码方法探讨与研究
李忠武
(保山学院,云南保山,678000)
本文讨论一些优化X86汇编语言代码的简单编程技巧。建议把这些技巧应用在运行于Intel最新微架构(包括Haswell、Sandy Bridge和Nehalem)代码中。大多数技巧同样适用于更早的微架构。可以把优化技巧和辅助性的指导方针分为五大类:基本优化、浮点算术、程序分支、数据对齐、SIMD技巧。
基本优化;浮点算术;程序分支;数据对齐;SIMD技巧
需要谨记的一个要点是,接下来的基本优化、浮点算术、程序分支、数据对齐、SIMD技巧优化技巧都必须谨慎使用。[1]例如,如果仅为避免使用不推荐的指令形式一次,就增加多条额外的push和pop指令,那么是没有意义的。
下面列出了一些常用于提高X86汇编语言代码性能的基本优化技巧。
(1)尽可能使用test指令,而不是cmp指令。
(2)尽可能避免使用内存与立即数形式的cmp和test指令(例如,cmp dword ptr[ebp+16],100或者test byte ptr[r12],0fh)。最好先将内存值载入寄存器,然后使用寄存器与立即数形式的cmp和test指令(如mov eax,dword ptr[ebp+16],接着cmp eax,100)。
(3)使用add或者sub指令,而不是inc或者dec指令,特别是在性能关键的循环中。后面的两个指令不会更新EFLAGS寄存器中的所有标志位,通常会慢一些。
(4)使用or、sub、pxor、xorps等指令将一个寄存器置0,而不是用数据传送指令。例如,xor eax,eax和xorps xmm0, xmm0比mov eax,0和movaps xmm0,xmmword ptr[XmmZero]要好。
(5)在所有操作数宽度前缀的指令中,避免使用16位立即数,而应该使用对应的32位或者8位立即数。例如,使用mov edx,42而不是mov dx,42。
(6)展开(或者部分展开)循环次数是常数的小循环。(7)将在计算中多次使用的内存值载入寄存器。……