线性汇编总结和函数说明

来源:互联网 发布:eclipse luna linux 编辑:程序博客网 时间:2024/05/02 02:25

线性汇编总结和函数说明
=====================================================================
总体说明:
这部分测试的线性汇编代码是代码是与之前提取出来的函数块(见function_module.c)
对应的函数来写的,线性汇编的在原函数的名称全面加了asm字样,提供了C函数调用的原型,在
本文档中对汇编函数作了详细说明,在simulater工程中进行了测试。
----------------------------------------------------------------------
线性汇编经验总结:
1. 一般只是对有循环结构的代码编写汇编替代,非循环代码不需要流水,性能提高不大
2. 为形成软件流水,循环体不要做条件判断,如果有条件判断尽量移到循环体外,或者用非跳转代码替代
(例如,在量化相同代码,用条件跳转的何不用条件跳转的性能相差5倍,再比如内存搬移大小不固定的可能产生
条件跳转,使用了固定大小的子块后,子块大小对性能影响不大,汇编代码和C代码的性能相差20倍左右)
3. 耗时较多的指令主要是load/store/乘/点乘等指令,一般为提高效率,一个循环尽可能处理多个数据操作,如
一般C循环处理一个字节、半字、字的操作,可以一次加载一个半字、字、双字进行操作处理,由于C64有很多以字节、
半字为单位处理的指令,加上软件流水,程序的效率可以提高达到原来汇编的2倍、4倍甚至8倍。
4. 碰到双循环,一般将较小的循环放到内循环,然后外循环处理一次处理完一个内循环的操作,大大减少跳转的次数。
5. 实现同样操作尽量用数据相关小易于形成软件流水的指令,尽量用最少周期的指令,尽量用特殊指令(一般效率比较高)
例如:循环体实现一个操作 val = is<0? -val : val,可以用比较和跳转指令实现但破环软件流水效率低,可以通过比较
扩展求或操作得到一个-1或1的数,再用乘运算实现这个操作,虽然周期长了一些,但能形成软件流水,实际提高了效率。
6. 线性汇编一般常见的错误:
* 一个.sa汇编文件中的多个函数体内使用同一个标号(特别是循环标号loop/LOOP)等,编译会报rededine
的错误,由于同一个汇编文件形成同一个目标文件,不同函数体中重复/使用同一个标号肯定是不对的,要使用不同的标号区别开
* 指令使用不当,加/减乘/除/移位等指令一定要注意操作数的类型,对于无符号/绝对值类型的操作数最好
使用无符号的操作指令
* 操作数溢出问题
* ...
7. 线性汇编调试经验:
* 汇编程序先调试通过再进入具体工程中使用,一般是新建一个仿真工程用于编写、调试、测试汇编代码,
一方面,可以保证汇编程序准确无误;另一方面,可以方便观察汇编代码和对应C代码的性能提高情况,保证仿真测试下,
汇编代码的效率确实比C代码有所提高。
* 汇编代码调试时先不使用任何优化选项,这样可以通过Debug单步执行所编的代码,便于检查代码的错误,
需要注意的是,即使不使用优化选项,在没有分配资源单元时,编译器仍然对寄存器的使用进行了调整(尤其是寄存器冗余
使用时),即单步调试时,寄存器的值不一定和代码里的执行得到的值相对应,但通过Watch Window观察到所有寄存器及其
值的变化。
* 内存的观察最简便的方法就是使用memory window,还可以调整显示的数据类型,通过红色标记看到存储
的变化,如果要对比前后的数值可以将其打印到输出窗口。
* 周期性能的测试,有没有使用优化选项其结果的正确性是一致的,汇编程序调试通过后,使用优化选项
-o2/-o3来优化代码,使用profile里面的时钟工具测试C代码和汇编代码执行的周期。

原创粉丝点击