收藏 分享(赏)

C语言与ASM以及线性汇编初步.ppt

上传人:weiwoduzun 文档编号:4224517 上传时间:2018-12-16 格式:PPT 页数:90 大小:4.57MB
下载 相关 举报
C语言与ASM以及线性汇编初步.ppt_第1页
第1页 / 共90页
C语言与ASM以及线性汇编初步.ppt_第2页
第2页 / 共90页
C语言与ASM以及线性汇编初步.ppt_第3页
第3页 / 共90页
C语言与ASM以及线性汇编初步.ppt_第4页
第4页 / 共90页
C语言与ASM以及线性汇编初步.ppt_第5页
第5页 / 共90页
点击查看更多>>
资源描述

1、C语言与ASM以及线性汇编初步,牛金海等,主要内容,C语言、ASAM和线性汇编三种编程工具的比较 指令集概述 C语言编程初步和实验-学习开发工具的使用,C代码性能的优化的使用(变量声明两种变量访问方式;C优化器选项;Intrinsics;字访问) ASAM汇编语言初步和实验学习用汇编语言编写简单程序 线性汇编编写C可调用的汇编程序,三种开发工具的比较 -C、ASM、线性汇编,三种开发工具的比较,TI的DSP软件设计可采用有C/C+语言(.c)、汇编语言(.asm)和线性汇编(C语言和汇编语言的混合编程,.)。 用语言开发应用程序优缺点:优点:易于开发和维护,用C语言书写接近自然语言,可读性强、

2、利于理解;可移植性强;不容易发生流水线冲突;有大量现存算法可用;适用于的执行效率相对较低,不能满足实时性的要求。线性汇人机界面的开发。缺点:代码量大;程序效率较低;优化代码存在一定困难。一般用C语言设计应用程序的总体框架、解决人机接口和对速度效率要求不太高的复杂算法。编可把两者优点有效结合起来,设计出性价比最好、开发周期较短、比较复杂的系统,已是在C62XX上最流行的编程方法。,用汇编语言开发应用程序的优缺点:优点:更能发挥系统特点,汇编语言设计出的程序更贴近硬件特性,往往能将硬件效能发挥到极致;代码精练、不易产生冗余、效率高;代码量小。缺点:可读性差,不利于复杂算法的开发和实现;可移植性差;

3、容易产生流水线冲突;复杂性高、开发周期长。,三种开发工具的比较,三种开发工具的比较,C 语言程序在执行时,先要调用 C 标准库中的初始化程序(入口标号为“_c_init00”),完成设置之后,才转入用户的主程序 main()运行,而汇编语言程序在执行时直接从用户指定入口开始,常见的入口标号为“start”; 由于 CCS 的代码链接器默认支持 C 语言,在编制汇编语言程序时,需要设置链接参数,选择非自动初始化,注明汇编程序的入口地址。,什么是线性汇编?线性汇编类似于汇编代码,不同的是线性汇编代码中不需要给出汇编代码必须指出的所有信息,线性汇编代码对这些信息可以进行一些选择,或者由汇编优化器确定

4、。下面是不需要给出的信息: 使用的寄存器 指令的并行与否 指令的延时周期 指令使用的功能单元,三种开发工具的比较,何时使用线形汇编?1.当程序中需要操作与硬件密切相关的设备,而用C语言较难实现时;2.当需要绕开C编译器的规定,进行特殊操作时。如:C语言规定程序不能访问代码区,当需要进行类似访问时可用限制较小的汇编语言程序设计;3.当需要提高模块的效率(包括空间上和时间上),而C语言程序无法达到要求时。,三种开发工具的比较,1)点积的C语言代码,三种开发工具的比较,2)ASM语言代码,三种开发工具的比较,3)非并行的ASAM代码4)并行的ASAM代码,三种开发工具的比较,非并行和并行ASAM代码

5、性能比较5)线性汇编代码,三种开发工具的比较,完整的线性汇编代码,三种开发工具的比较,C代码 代码效率低 使用Intrinsics的C代码 嵌入汇编容易破坏C环境 汇编代码编程工作量大,三种开发工具的比较,y = a * b,y = _mpy (a, b),asm (“MPY A0, A1, A2”),MPY A0, A1, A2, ; a, b, y,开发工具 效率 编程工作量,三种开发工具的比较,软件工具流程,三种开发工具的比较,硬件工具流程,三种开发工具的比较,仅软件,含DSP PCI卡,ISA卡 无DSP,指令集概述,指令集概述,操作码映射(.L/.M),指定条件寄存器,是否等于零的测

6、试,源2使用交叉通路,指令域,目的寄存器为A组或B组,并行执行,操作码映射(.D),指令集概述,基址寻址寄存器,寄存器偏移量/5位无符号常量,寻址模式,LDDW位,选择D1或D2,load/store指令域,操作码映射(NOP),指令集概述,并行操作取指包的基本格式 取指包:八条32bit指令; 执行包:并行执行的所有指令。执行包中的每一条指令使用的功能单元必须各不相同; 每条指令的并行执行位(p位)控制本条指令是否与取指包中的其他指令并行执行:p =1 与下条指令并行;p =0 下条指令在当前指令的下个周期执行。,指令集概述,例子:取指包的部分并行p位模式,指令集概述,条件操作,指令集概述,

7、z=1,进行零测试 z=0,进行非零测试 creg=0,z=0,意味着指令将无条件地执行。,C62xx指令集(根据操作类型分类),指令集概述,C62xx指令集(根据功能单元分类),指令集概述,C62xx指令集(根据执行周期分类),指令集概述,C语言编程初步,建议的程序开发流程,C语言编程初步,C程序,C程序优化,用线性汇编改 写关键代码段,C语言编程初步,C的代码产生工具,编译命令,C语言编程初步,编译器选项CL6x -g file1.c file2.asm file.sa file3 -s -as -z C程序直接调用汇编器标准汇编直接调用汇编器线性汇编调用汇编优化器无扩展名默认为C文件,-

8、gks,建工程时可直接调用在CCS中进行编译、汇编和链接工具,也可在CCS外用DOS Shell程序直接调用:C16x options files,常用的编译选项,C语言编程初步,连接器选项,C语言编程初步,CL6x -g -s file.c -z link.cmd -o file.out -l rts6201.lib运行支持库 连接器命令文件 -z调用连接器 输出文件名,链接器可用下面语句调用:,C62xx C 数据类型,C语言编程初步,注意:在32位 计算机上C语 言的long代表 Size是32bits,变量声明对局部变量的访问在堆栈内分配存储空间;用堆栈首地址作首基地址,用指针*+B1

9、5(disp)来访问;堆栈分配在默认段.stack。,C语言编程初步,变量声明 全局变量/静态变量两种访问形式,C语言编程初步,1.默认的访问方式Near变量,int n; main() .n +=. ,2.Far变量,far int n; main() .n += . ,编译后的汇编输出和访问方式,编译后的汇编输出和访问方式,.bss _n, 4, 4 ldw.d1 *+DP(_n), A0,_n .usect .far,2,2 mvk _n, A1 mvkh _n, A1 ldw.d1 *+A1, A0,在.bss内分配地址 一条指令访问,在.far内分 配地址三条 指令访问,变量声明 N

10、ear变量的生成和使用,C语言编程初步,C语言,汇编语言,LDW .D2 *+B15(12), Reg,相对偏移地址,变量声明 Near/Far变量-例子,C语言编程初步,声明,C变量名加下划线,编译输出,变量声明总结局部变量在堆栈段.stack分配地址,用一条指令访问。采用near形式声明全局变量,变量分配在数据段.bss,用一条指令访问。采用far形式声明全局变量,变量分配在数据段.far或用户自定义数据段,用三条指令访问,应尽量避免采用,C语言编程初步,C优化器 经过C优化器的优化,以及其它C语言优化后,C代码效率可达7080 用优化选项启动,C语言编程初步,优化器选项,有软件流水功能,

11、C优化器 与优化有关的其它编译选项建议使用-pm 与-o3合用,进行程序级优化-mt 程序中没有数据aliasing-x2 函数内联不要使用-ml 大模式(使得.bss段内的变量都按far方式访问)-g 符号调试-s, -ss, -os C编译器生成的汇编文件内,C语句作为注释出现,C语言编程初步,Aliasing 两个指针指向同一个变量, 或一个指针修改后指向 另外一个变量,C优化器 使用步骤-建议1.不带优化选项进行编译(功能验证) cl6x -g -s file.c -z2.用优化选项-o2进行编译(-o2是与符号调试兼容的最高优化级别) cl6x -g -o file.c -z3.用最

12、高级别优化选项进行编译 cl6x -o3 -pm file.c -z,C语言编程初步,以上每个步骤都需要进行功能验证,注意,C优化器3. Intrinsics它是直接与C62xx汇编指令相对应的特殊内联函数,没有函数调用开支。常见的Intrinsics列表如下:,C语言编程初步,对应汇编指令 .trip,加法、减法、乘法 位域操作、long转换 为int,Intrinsics的特点函数参数使用C变量名(不是寄存器),与C环境兼容;不增加C的编程工作 量;代码效率与汇编相同。,C优化器4. 字访问字访问优化方法:,C语言编程初步,1) 利用32位字访问16位数据(三种方法) 联合Union 强制

13、类型转换 把数据直接定义为32位字 2). 利用Intrinsics完成数值运算(_mpy, _mpyh, _add2, _sub2,C优化器4. 字访问-联合Union,C语言编程初步,必须按照word 数据定界,C优化器4. 字访问-强制类型转换,C语言编程初步,C优化器4. 字访问-把数据直接定义为32位字,C语言编程初步,C优化器4. 字访问-小结,C语言编程初步,用union方式需要对调用函数和被调用函数进行 修改用强制类型转换,只需要修改被调用函数直接定义为32字,影响程序可读性,实验,实验内容:两个数组点积运算 实验目的: 掌握编译过程、C优化器的使用 熟悉Simulator开发

14、环境 学习程序性能测试方法,实验:两个数组点积运算,代码开发流程,运算的两个基本指令,实验:两个数组点积运算,相加(.L单元),寄存器组A,实验:两个数组点积运算,寄存器取代变量,实验:两个数组点积运算,实验:两个数组点积运算,建立循环 1.添加跳转指令和循环标号,建立循环 2.设定一个循环计数器,实验:两个数组点积运算,建立循环 3.添加递减循环计数指令,实验:两个数组点积运算,建立循环 4.给出基于循环计数值的 跳转条件 所有指令都是根据下面 条件寄存器的值为0或 非0条件地执行:A1、 A2、B0、B1、B2。代码语法 指令执行条件 A2 A2 0 !A2 A2=0,实验:两个数组点积运

15、算,实验:两个数组点积运算,设将数值读入寄存器,如何读取a和x? 1.a、x和Y在存储器中 2.建变量指针3.load/store中使用指针,读取/存入(.D单元),实验:两个数组点积运算,读取指针 1.地址是常数,因此使用指令MVK: 2.MVK指令所移的位数:16 bit 3.表示一个完整地址的位数:32 bit 4.一个地址读入寄存器必须使用两条指令,例如:,实验:两个数组点积运算,关于指针第1次循环后,A4为: 第2次循环如何访问a(1)和x(1),实验:两个数组点积运算,递增指针,实验:两个数组点积运算,另一套功能单元和寄存器,实验:两个数组点积运算,代码复习,只使用A侧,实验:两个

16、数组点积运算,汇编语言初步,汇编语言初步,学习内容 汇编代码的结构 汇编程序的构成 编写简单算法:y = mx+b C:CCStudio_v3.3docsPDFspru187n.pdf 第8.4节,讲了混合编程的调用关系例子,汇编代码的构成,汇编语言初步,label: | cond instruction .unit operand ;comment,标号:代码或变量地址,条件寄存器,指令:助记符(mnemonic)伪指令(directive),功能单元(可选),操作数:寄存器常量指针,注释,x .int 10MPY .M1 A1, A3, A7| ADD .L1x A2, B2, A5,注意

17、:在输入汇编程序时,除标号以外的程序行都要以一个空格或Tab制表字符开始,常用的伪指令,汇编语言初步,注意,在C语言里long是40位,在汇编语言里long是32位,汇编程序的构成-程序数据结构算法,汇编语言初步,C程序的数据结构和算法实现,数据结构,算法,汇编程序-数据结构,汇编语言初步,用汇编语言声明数据结构,完整的汇编程序构成,汇编语言初步,.sect “myData” m .int 5 x .int 10 b .int 2 y .int 0.sect “myCode” start LD .D1 *A0,A1.ST .D1 A7,*A6end B endNOP 5,用汇编语言编写y=mx

18、+b1.数据取入寄存器:m,x,b存储器寄存器1a. 初始化数据指针1b. 取数据2.乘法3.加法4.存储数据:y寄存器存储器,汇编语言初步,用汇编语言编写y=mx+b1a. 初始化数据指针,汇编语言初步,MVK .S1 m, A0 MVKH.S1 m, A0 ; &bA4,32位常量,用汇编语言编写y=mx+b 指令MVK,汇编语言初步,MVK把一个16位常数放入寄存器,用汇编语言编写y=mx+b1b 取数据,汇编语言初步,LDH .D1 *A0, A1 ; 取m LDH .D1 *A2, A3 ; 取x LDH .D1 *A4, A5 ; 取b NOP 4,用汇编语言编写y=mx+b 用L

19、D/ST指令 三种Load指令,对应不同长度的数据LDW 取32位字(word)LDH 取16位半字(short)LDB 取8位字节(byte) 对无符号数(字节、16位半字)LDBULDHU 指令延迟:四个延迟间隙 三个存储指令 STW STH STB,数据取入寄存器 后进行符号扩展,无符号扩展,汇编语言初步,用汇编语言编写y=mx+b 指令延迟间隙,延迟间隙:多周期指令所需要插入的NOP指令个数,汇编语言初步,用汇编语言编写y=mx+b2.乘法,汇编语言初步,MPY .M1 A1, A3, A7 NOP,汇编语言初步,用汇编语言编写y=mx+b 乘法指令 四种乘法指令MPY(U/US/SU

20、) 16LSB16LSBMPYH(U/US/SU) 16MSB16MSBMPYH(U/S)L(U/S) 16MSB16LSBMPYL(U/S)H(U/S) 16LSB16MSB 指令延迟槽:1 两个乘法单元可以在一个周期内做两次乘法,用汇编语言编写y=mx+b3.加法,汇编语言初步,ADD.? 应该使用哪个功能单元?,ADD .? A5, A7, A7,或,或,用汇编语言编写y=mx+b4.加法,汇编语言初步,用汇编语言编写y=mx+b 完整的y=mx+b汇编程序spru189f.pdf,汇编语言初步,.title “lab4.asm“ /*定义数据结构*/.sect “myData” m .

21、short 10 x .short 5 b .short 2 y .short 0 /*算法*/.sect “myCode“ /*指针初始化*/ init: mvk .s1 m,A0 ;A0=A4=&bmvkh .s1 b,A4,mvk .s1 y,A6 ; A6= endless loopnop 5,线性汇编,线性汇编,在C程序中使用汇编语句汇编指令和命令可以嵌入在C程序中,并用asm语句声明,该语句可访问硬件,而只用C语言很难直接访问硬件。asm (“assembly code”) 编写可被C程序调用的汇编函数可用extern语句作为函数的外部声明,如: extern int func()

22、1. 建立C环境2. 建立汇编环境3. 编写线性汇编函数 入口代码 算法 出口代码,编写可被C调用的线性汇编函数1. 建立C环境1) 在C程序前声明线性汇编函数2) 调用汇编函数,线性汇编,1)声明,2)调用,编写可被C调用的线性汇编函数2. 建立汇编环境1) 汇编函数的入口地址声明为全局变量,汇编函数的入口地址C函数名前加下划线;2) 定义函数入口地址。,线性汇编,1)声明,2)定义,编写可被C调用的线性汇编函数3. 编写线性汇编函数,线性汇编,入口 代码,出口 代码,线性汇编的寄存器保护问题,线性汇编,汇编优化器自动完成,!,实验1实验2,线性汇编,实验目的:学习和掌握利用intrinsics进行字长优化;实验内容 改写C语言点积函数,用强制类型转换法实现字优化。,实验目的:掌握线性汇编语言和C语言混合编程的方法;实验内容 用线性汇编改写C的点积函数。,End,Thanks,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > C/C++资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报