线性汇编总结和函数说明
=====================================================================
总体说明:
这部分测试的线性汇编代码是代码是与之前提取出来的函数块(见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代码和汇编代码执行的周期。

线性汇编总结和函数说明相关推荐

  1. 【数学知识】三种方法求 [1,n] 中所有数欧拉函数(线性筛欧拉函数优化至 O(n) )

    整理的算法模板合集: ACM模板 ①直接求小于或等于n,且与n互质的数个数(求[1,n]中所有数的欧拉函数时间复杂度:O(nn)O(n\sqrt{n})O(nn​)) ②求[1,n]之间每个数的质因数 ...

  2. 线性筛法 与 线性求欧拉函数 的计算模板

    简介 懂得如何快速计算质数是十分重要的 在筛法的基础上,我们可以使用更为高级的线性筛法! 顾名思义,就是时间复杂度是线性的,即 O(N)O(N) ,N 为所求的质数范围 而对编程有所接触的人,应该都知 ...

  3. 【汇编】汇编中的函数

    前言:本文章将讲解什么是函数,以及汇编中函数的存在形式,使用到的工具是DTDEBUG. 1.什么是函数?   在汇编中,函数就是一系列指令的合集,为了完成某个会重复使用的特定功能.         下 ...

  4. 线性筛求莫比乌斯函数前缀和

    大家知道有一类问题,让你把1~N之间每一个数的莫比乌斯函数都输出来,或者把它们全部加起来再输出.这种问题应该属于求前缀和一类的啦 用正规的方式表达: 就论求1~N间每个数的莫比乌斯函数吧.我们一般使用 ...

  5. 线性探测法的查找函数 (20 分)

    6-22 线性探测法的查找函数 (20 分) 试实现线性探测法的查找函数. 函数接口定义: Position Find( HashTable H, ElementType Key ); 其中HashT ...

  6. matlab 线性索引 转换,自己编写的 matlab 线性索引转换下标 函数

    matlab自带的线性索引转换下标函数必须指定下标个数,也就是数据的维度.这在实际应用中受到了限制. (什么是线性索引,什么是下标,不再介绍,相信你如果搜到了本贴,必然知道这两个概念) % 原函数: ...

  7. 汇编达人视频学习6(汇编眼中的函数、CALL指令执行函数、堆栈传参、堆栈平衡、外平栈、内平栈)

    title: 汇编达人视频学习6 date: 2021年8月4日 15点15分 tags: 汇编达人 categories: 汇编达人 21.汇编眼中的函数 1.什么是函数 函数就是一系列指令的集合, ...

  8. 线性探测法的查找函数

    线性探测法:如遇到了冲突,用pos+i(i=1,2,3-)的方式来找到新的未用过的位置. 查找时,如果没有,我们的结束条件就时i>=表的长度. 这样缺点也很突出,就是很多元素会扎堆的出现,降低了 ...

  9. C代码+汇编 C的 函数汇编学习分析 rep stos dword ptr [edi]

    如分析有误,请在评论区中,指出 谢谢合作 主要是分析C的函数调用在汇编中的执行流程 本章主要是说一下函数调用时堆栈的变化,重点理解部分 C代码 #include"stdafx.h" ...

最新文章

  1. 漫画 | 大数据风控从业者的一天
  2. ICMP诊断报文类型
  3. linux smplayer 快捷键,SMPlayer:让 MPlayer 的使用更简单
  4. 由web项目中上传图片所引出的路径问题
  5. 管理软件实施(5)——实施先了解下售前工作的特点(上)
  6. javascript概要
  7. Source Insight 3.5 序列号分享
  8. MVC3开发常常遇到的问题及常常使用到的代码片段
  9. 数字水印--给我的文件充当保护神
  10. 转:驳Moxie关于Web3中“去中心化”、“服务器”和“密码学”的观点
  11. 【电力电子】【2014.08】电力电子系统公用接口的三相功率因数校正设计
  12. 复数计算器 Java 正则表达式
  13. 红色警戒常用的快捷键
  14. 防线 2020/3/31
  15. 迷失lost结局什么意思_《lost》《迷失》大结局,没看懂的进,详细讲解
  16. Java解析excel工具easyexcel 助你快速简单避免OOM
  17. 华为 eNSP easy ip转换实验+NAT服务器
  18. imshow 显示图像(Matlab)
  19. linux网络编程:splice函数和tee( )函数高效的零拷贝
  20. C# 计算太阳倾角、太阳高度角

热门文章

  1. 用开源项目PhotoView实现图片的双指缩放和双击放大缩小
  2. 前端 html结合css-1篇
  3. 如何更有效使用 Rational AppScan 扫描大型网站,第 2 部分: 案例分析
  4. php用于防SQL注入的几个函数
  5. vue中用的swiper轮播图的用法github的地址
  6. 计算机知识产权结合,计算机知识产权.doc
  7. linux物理硬盘和sd的对应关系_计算机硬盘
  8. java 人脸识别 demo_java引用Arcface,实现人脸识别(demo)
  9. A/B Matrix CodeForces - 1360G(思维构造)
  10. python plt画半对数坐标_特征工程大传:对数变换