TMS320C54x的软件开发

上传人:cl****1 文档编号:589003283 上传时间:2024-09-09 格式:PPT 页数:57 大小:259.50KB
返回 下载 相关 举报
TMS320C54x的软件开发_第1页
第1页 / 共57页
TMS320C54x的软件开发_第2页
第2页 / 共57页
TMS320C54x的软件开发_第3页
第3页 / 共57页
TMS320C54x的软件开发_第4页
第4页 / 共57页
TMS320C54x的软件开发_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《TMS320C54x的软件开发》由会员分享,可在线阅读,更多相关《TMS320C54x的软件开发(57页珍藏版)》请在金锄头文库上搜索。

1、第4章 TMS320C54x的软件开发4.1 TMS320C54x软件开发过程 4.2 汇编语言程序的编写方法4.3 汇编伪指令和宏指令4.4 公共目标文件格式COFF4.5 汇编源程序的编辑、汇编和链接4.6 汇编语言程序设计4.7 C语言与汇编混合编程4.6 汇编语言程序设计汇编语言程序设计 基本程序设计分为基本程序设计分为3大类大类: (1) 程序的控制与转移。程序的控制与转移。 (2) 数据块传送程序。数据块传送程序。 (3) 算术运算类程序。算术运算类程序。 4.6.1 程序的控制与转移程序的控制与转移包括:包括:分支转移分支转移 子程序操作子程序操作(调用与返回程序调用与返回程序)

2、 循环控制(重复操作)循环控制(重复操作) 这些指令都将影响程序计数器这些指令都将影响程序计数器(PC),会造成把一个不,会造成把一个不是顺序增加的地址加载到是顺序增加的地址加载到PC。表。表43P111条件:条件:有一些指令只有当一个条件或多个条件得到满足时有一些指令只有当一个条件或多个条件得到满足时才能执行。如条件分支转移或条件调用、条件返回指令。才能执行。如条件分支转移或条件调用、条件返回指令。表表4-4P112。多重条件多重条件 :BC pmad, cond,cond,cond,当这条指令的,当这条指令的所有条件得到满足时,程序才能转移到所有条件得到满足时,程序才能转移到pmad。不是

3、所有条。不是所有条件都能构成多重条件,某些条件的组合如表件都能构成多重条件,某些条件的组合如表4-5所示。所示。-P113 1. 分支转移分支转移 根据条件判断改写根据条件判断改写PC值,使程序发生分支转移。值,使程序发生分支转移。两种形式:两种形式:有条件分支转移和无条件转移。有条件分支转移和无条件转移。常用指令常用指令: BD、BACCD ;BCD、BANZDBACC: Branch to Location Specified by Accumulator BANZ: Branch on Auxiliary Register Not Zero 合理地设计延迟转移指令,可以提高程序的效率。合

4、理地设计延迟转移指令,可以提高程序的效率。应当注意,紧跟在延迟指令后面的两个字,不能是造成应当注意,紧跟在延迟指令后面的两个字,不能是造成PC不连续的指令不连续的指令(如分支转移、调用、返回或软件中断如分支转移、调用、返回或软件中断指令指令)。【例【例4.11】 条件分支转移指令条件分支转移指令BC举例。举例。 BC new, AGT, AOV ; 若累加器若累加器A0且溢出,则转至且溢出,则转至new,否则往下执行,否则往下执行 单条指令中的多个条件是单条指令中的多个条件是“与与”的关系。的关系。如果需要两个条件相如果需要两个条件相“或或”,只能写成两条指令。如上,只能写成两条指令。如上一条

5、指令改为一条指令改为“若累加器若累加器A大于大于0或溢出,则转移至或溢出,则转移至new”,可以写成如下两条指令,可以写成如下两条指令BC new, AGTBC new, AOV 【例4.12】 计算 .bss x, 5 ;为变量分配6个字的存储空间 .bss y, 1 STM #x, AR1 ;AR1指向x STM #4, AR2 ;设AR2初值为4 LD #0, Aloop: ADD *AR1+, A BANZ loop, *AR2- ;当AR2不为0时转移,AR2-1AR2 STL A, y 本例中用AR2作为循环计数器,设初值为4 AR2取值为4,3,2,1,0CH4_72. 调用与返

6、回指令调用与返回指令 当调用子程序或函数时,当调用子程序或函数时,DSP就会中断原先的程序,转就会中断原先的程序,转移到程序存储器的其他地址继续运行。调用时,下条指令移到程序存储器的其他地址继续运行。调用时,下条指令的地址被压入堆栈,以便返回时将这个地址弹出至的地址被压入堆栈,以便返回时将这个地址弹出至PC,使,使中断的程序继续执行。中断的程序继续执行。两种形式两种形式: 无条件调用与返回,有条件调用与返回。无条件调用与返回,有条件调用与返回。常用指令常用指令: CALLD、CALAD、CCD、 RETD、 RCDCALA:Call to accumulator addressCC:Condi

7、tional callRC:Conditional return例如例如(堆栈设置后) CALL pmad ;(SP)-1SP,(PC)+2TOS, pmadPC RET ;(TOS)PC, (SP)+1SP堆栈堆栈: 16位堆栈指针位堆栈指针(SP)寻址的软件堆栈。寻址的软件堆栈。 堆栈是一个特殊的存储区域,遵循先进后出的原则,堆栈是一个特殊的存储区域,遵循先进后出的原则,当向堆栈中压入数据时,堆栈从高地址向低地址增长,堆当向堆栈中压入数据时,堆栈从高地址向低地址增长,堆栈指针栈指针SP始终指向栈顶。始终指向栈顶。堆栈用法堆栈用法: 压入操作:压入操作:SP先减先减1,然后再将数据压入栈顶。

8、,然后再将数据压入栈顶。 弹出操作:数据弹出后,再将弹出操作:数据弹出后,再将SP加加1。堆栈设置堆栈设置:size.set100stack .usect “STK”, size ;自定义一个名为自定义一个名为STK的保留空间,共的保留空间,共100个单元个单元 STM #stack+size, SP ;将这个保留空间的高地址将这个保留空间的高地址+1(#stack+size)赋给赋给SP,作为,作为栈底。栈底。 stack+0stack+size-13. 重复操作重复操作( 3条指令)条指令) RPT(重复下条指令重复下条指令)、 RPTZ(累加器清累加器清0并重复下条指令并重复下条指令)

9、RPTB(块重复指令块重复指令)。(1) 重复执行单条指令重复执行单条指令含义:含义:RPT或或RPTZ允许重复执行紧随其后的那一条指令。允许重复执行紧随其后的那一条指令。重复次数:重复次数:如重复执行如重复执行n次,则重复指令中计数值为次,则重复指令中计数值为n1。说明:与说明:与BANZ指令进行循环相比,指令进行循环相比,效率要高得多效率要高得多。 特别是对于那些乘法累加和数据传送的多周期指令特别是对于那些乘法累加和数据传送的多周期指令(如如MAC、MVDK、MVDP和和MVPD等等),在执行一次之后,在执行一次之后就变成了单周期指令,大大提高了运行速度。就变成了单周期指令,大大提高了运行

10、速度。【例【例4.13】 对数组进行初始化。对数组进行初始化。x5=0,0,0,0,0主要程序主要程序(部分部分)如下:如下: .bss x, 5 STM #x, AR1 LD #0, A RPT #4 STL A, *AR1+或者或者 .bss x, 5 STM #x, AR1 RPTZ A, #4 STL A, *AR1+(2) 块程序重复操作块程序重复操作RPTB含义:含义:RPTB将重复操作的范围扩大到任意长度的循环回路。将重复操作的范围扩大到任意长度的循环回路。重复次数:重复次数:先加载到块重复计数器先加载到块重复计数器(BRC)。循环开始地址循环开始地址(RSA):是是RPTB指令

11、的下一行;指令的下一行;结束地址结束地址(REA):由由RPTB指令的操作数规定。指令的操作数规定。 特点:特点: 对任意长的程序段的循环开销为对任意长的程序段的循环开销为0; 其本身是一条其本身是一条2字字4周期指令;周期指令; RPT指令一旦执行,不会停止操作,即使有中断请求也不响指令一旦执行,不会停止操作,即使有中断请求也不响应;而应;而RPTB指令是可以响应中断的。指令是可以响应中断的。【例【例4.14】 对数组对数组x5中的每个元素加中的每个元素加1。 .bss x, 5begin: LD #1, 16, B STM #4,BRC ;BRC赋值为赋值为4 STM #x,AR4 RPT

12、B next-1 ;next-1为循环结束地址为循环结束地址 ADD *AR4,16,B,A STH A,*AR4+next: LD #0, B 用next1作为结束地址是恰当的。如果用循环回路中最后一条指令(STH指令)的标号作为结束地址,若最后一条指令是单字指令也可以,若是双字指令,就不对了。 (3) 循环的嵌套循环的嵌套(三重循环嵌套、开销-p116) 问题:外层循环为何不问题:外层循环为何不采用采用RPTB实现?实现?1st:14.6.2 数据块传送程序数据块传送程序共有共有4种类型(种类型(10条指令):条指令): (1) 程序存储器程序存储器数据存储器数据存储器(MVPD,MVDP

13、)。 (2) 数据存储器数据存储器数据存储器数据存储器(MVDK,MVKD,MVDD)。(3) 数据存储器数据存储器MMR(MVMD、MVDM,MVMM)(4) 程序存储器程序存储器(由由ACC寻址寻址)数据存储器数据存储器(READA,WRITA)MVDP Smem, pmad MVMD MMR, dmadMVDD Xmem, Ymem MVMM MMRx, MMRyMVDK Smem, dmad READA Smem这些指令的特点如下:这些指令的特点如下:传送速度传送速度比加载和存储指令要比加载和存储指令要快快;传送数据不需要通过累加器;传送数据不需要通过累加器;可以寻址程序存储器;可以寻

14、址程序存储器;与与RPT相结合时,都变成单周期指令,可以实现数据块传相结合时,都变成单周期指令,可以实现数据块传送送。 【例【例4.15】 编写一段程序,首先对数组编写一段程序,首先对数组x20赋值,再将数据赋值,再将数据存储器中的数组存储器中的数组x20复制到数组复制到数组y20。 .title“exp15.asm” .mmregs STACK .usect “STACK”, 30h .bss x, 20 .bss y, 20 .data table: .word 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 .defstart .te

15、xtStart: STM #x, AR1 RPT#19 MVPD table, *AR1+; 从程序存储器传送到数据存储器从程序存储器传送到数据存储器 ; 程序存储器指针自动下移程序存储器指针自动下移 STM #x, AR2 STM #y, AR3 RPT #19 MVDD *AR2+, *AR3+ ; 从数据存储器传送到数据存储器从数据存储器传送到数据存储器end: B end .endMVDD Xmem, Ymem注意:注意:双操作数指令只能用辅助寄存器双操作数指令只能用辅助寄存器AR2AR5进行间进行间接寻址获得操作数接寻址获得操作数/ exp15.cmd*/链接命令链接命令 vecto

16、rs.obj exp15.obj -o exp15.out -m exp15.map -e startMEMORY PAGE 0: EPROM:org=0E000hlen=01F80h VECS:org=0FF80hlen=00080h PAGE 1: SPRAM:org=00060hlen=00030h DARAM:org=00090hlen=01380hSECTIONS .vectors:VECS PAGE 0 .data: EPROMPAGE 0 .text: EPROMPAGE 0 .bss: SPRAMPAGE 1 .STACK: DARAMPAGE 1 实现20个数据先从EPROM

17、的0E000Hh0E013h传送到数据存储器SPRAM的0060h0073h单元,实现数据的初始化,再从0060h0073h单元传送到0074h0087h单元,实现数据搬移,其示意图如图4.7所示。注意,实际看到的是十六进制数。 4.6.3 算术运算类程序算术运算类程序1.单字运算(单字运算(16位)位)2.长字运算(长字运算(32位)位)3.小数运算小数运算4.浮点运算浮点运算5.双操作数乘法双操作数乘法DSP表示整数时表示整数时,分为有符号数和无符号数两种格式。,分为有符号数和无符号数两种格式。DSP表示小数时,表示小数时,其符号和上面整数的表示一样,但是其符号和上面整数的表示一样,但是必

18、须注意如何必须注意如何安排小数点的位置安排小数点的位置。 1.单字运算单字运算【例例4.16】 试编一程序,计算试编一程序,计算 的值,并找出的值,并找出4项乘积项乘积 (i=1,2,3,4)中的最大值,放入累加器中的最大值,放入累加器A中。中。 .title“exp16.asm” .mmregsSTACK .usect “STACK”, 10h ;堆栈的设置;堆栈的设置 .bss a, 4 ;为变量分配;为变量分配10个字的存储空间个字的存储空间 .bss x, 4 .bss y1, 1 .bss y2, 1 .def start .data table: .word 1, 5, 3, 4

19、.word 8, 6, 7, 2 .textstart: STM #0, SWWSR ;插入个等待状态插入个等待状态 STM #STACK+10h,SP ;设置堆栈指针设置堆栈指针 STM #a, AR1 RPT #7 MVPD table, *AR1+ CALL SUM ;调用乘累加子程序调用乘累加子程序 CALL MAX ;调用求最大值子程序调用求最大值子程序end: B endSUM: STM#a, AR3 STM#x, AR4 RPTZA, #3 MAC*AR3+, *AR4+, A STLA, y1 ;变量变量y1存放乘累加的值存放乘累加的值 ; STLA, *(y1) RET MA

20、X: STM #a, AR1 STM #x, AR2 STM #2,AR3 LD *AR1+, T MPY *AR2+, A ;第一个乘积在累加器;第一个乘积在累加器A中中loop: LD *AR1+, T MPY *AR2+, B ;其他乘积在累加器;其他乘积在累加器B中中 MAX A ;累加器;累加器A和和B比较,选大的存在比较,选大的存在A中中 BANZ loop, *AR3- ;此循环中共进行;此循环中共进行3次乘法和比较次乘法和比较 STL A, y2 ;变量;变量y2存放的最大值存放的最大值 ; STL A, *(y2) RET .end CH4_82. 长字运算长字运算 可以利用

21、长操作数可以利用长操作数(32位位)进行长字运算。进行长字运算。长字指令如下:长字指令如下:(1)长字运算指令长字运算指令DADD、DSUB、DRSUB等等(2) (见表见表3.10P69);(2) 长字存储和装入指令长字存储和装入指令DST、DLD (见表见表3.20、3.21P79-80)。 除除DST指令指令(存储存储32位数要用位数要用E总线总线2次,需要次,需要2个机个机器周期器周期)外,其余都是单字单周期指令,也就是在单外,其余都是单字单周期指令,也就是在单个周期内同时利用个周期内同时利用C总线和总线和D总线,得到总线,得到32位操作数。位操作数。32位乘法运算:位乘法运算:只能利

22、用只能利用16位乘法指令完成。位乘法指令完成。X1 X0 S U * Y1 Y0 *S U - X0 *Y0 U * U Y1 *X0 S * U X1 *Y0 S * U Y1 *X1 S * S - W3 W2 W1 W0 S U U U3条乘法指令:条乘法指令:UU: MPYU Smem, dst; dst=U (T)*U(Smem)SU: MACSU Xmem, Ymem, Src; Src= U(Xmem)* S(Ymem)+SrcSS: MAC Xmem, Ymem,Src ; Src=S(Xmem)*S(Ymem)+Src 【例【例4.18】 编写计算编写计算W64=X32Y32

23、的程序。的程序。 .title“exp18.asm” .mmregs.bss x, 2 ;32位占位占2字空间字空间 .bss y, 2 ;32位占位占2字空间字空间 .bss w0, 1 .bss w1, 1 .bss w2, 1 .bss w3, 1 .def start .data table: .word 10h, 20h, 30h, 40h .textCH4-11start: STM #0, SWWSR LD #50H, DP STM #x, AR1 RPT #3 MVPD table, *AR1+ ;初始化初始化x,y STM #x, AR2 STM #y, AR3 LD *AR2

24、,T ;T=x0 MPYU *AR3+, A ;A=x0y0 (UU) STL A,w0 ;w0=(x0y0低低16位)位) LD A, -16,A ;A右移右移16位,位,A高位高位A低位低位 MACSU *AR2+, *AR3-, A ;A+=y1x0(SU) MACSU *AR3+, *AR2, A ;A+=x1y0(SU) STL A, w1 ;w1=A LD A, -16, A ;A右移右移16位,位,A高位高位A低位低位 MAC *AR3,*AR2, A ;A+=x1y1(SS) STL A, w2 ;w2=A的低的低16位位 STH A, w3 ;w3=A的高的高16位位end:

25、 B end .end结果W1=0A00h测试数据测试数据(低位先存,和低位先存,和DSP长字整数的表示不同):长字整数的表示不同):x:00200010hy:00400030h 00200010 00400030 00000300 00000600 00000400 00000800 000008000A000300 W3=0000,W2=0800,W1=0A00,W0=0300编写计算编写计算W64=X32Y32的程序的程序给程序设置新的测试数据:给程序设置新的测试数据:.word 0x0400,0x0000,0xFFFD,0xFFFF ; x=64,y=-3执行结果:W3=FFFF,W2

26、=FFFF,W1=FFFF,W0=F400FFFF,FFFF,FFFF,F400是-192的补码表示192的原码0000,0000,0000,0C00H3. 小数运算小数运算两个两个16位整数相乘位整数相乘:乘积总是:乘积总是“向左增长向左增长”。这意味着多。这意味着多次相乘后乘积将会很快超出定点器件的数据范围。次相乘后乘积将会很快超出定点器件的数据范围。两个小数相乘:两个小数相乘:乘积总是乘积总是“向右增长向右增长”。这就意味着超出这就意味着超出定点器件数据范围的将是不太感兴趣的部分。定点器件数据范围的将是不太感兴趣的部分。1) 小数的表示方法小数的表示方法采用采用2的补码表示小数的补码表示

27、小数:最高位为符号位,数值范围从:最高位为符号位,数值范围从1+1(Q15格式)。格式)。 MSB LSB 0/1(符号位符号位) . 2-1 2-2 2-15 如:如:0100,0000,0000,0000B=4000H=0.5 0110,0000,0000,0000B=6000H=0.75汇编语言程序中,十进制小数的表示:汇编语言程序中,十进制小数的表示:小数小数0.123.Word 32768*123/10002) 小数乘法中的冗余符号位小数乘法中的冗余符号位问题:问题:两个带符号小数相乘,将出现得到的积带有两位两个带符号小数相乘,将出现得到的积带有两位符号位。符号位。解决冗余符号位的办

28、法:解决冗余符号位的办法:在程序中设定状态寄存器在程序中设定状态寄存器ST1中中的的FRCT(小数方式小数方式)位为位为1,在乘法器将结果传送至累加,在乘法器将结果传送至累加器时就能自动地左移器时就能自动地左移1位,消去了两个带符号数相乘时产位,消去了两个带符号数相乘时产生的冗余符号位。生的冗余符号位。小数乘法编程时小数乘法编程时:应当先设置:应当先设置FRCT位:位: SSBX FRCT MPY *AR2,*AR3,A STH A, Z例:0.5*0.5 在程序中设定状态寄存器在程序中设定状态寄存器ST1中的中的FRCT(小数方式小数方式)位为位为1,在乘法器将结果传送至累加器时就能自动地左

29、移,在乘法器将结果传送至累加器时就能自动地左移1位,位,消去了两个带符号数相乘时产生的冗余符号位。消去了两个带符号数相乘时产生的冗余符号位。 0100B 0100B-00010000B消除冗余符号位后的结果为:消除冗余符号位后的结果为:00100000B-0.25【例【例4.19】 编制计算编制计算 的程序段,其中数据均为小数。的程序段,其中数据均为小数。 .title“exp19.asm” .mmregsSTACK .usect “STACK”,10H .bss a, 4 .bss x, 4 .bss y, 1 .data table: .word 1*32768/10 .word 2*32

30、768/10 .word -3*32768/10 .word 4*32768/10 .word 8*32768/10 .word 6*32768/10 .word -4*32768/10 .word -2*32768/10CH4-12 start: SSBX FRCT;小数方式位;小数方式位FRCT1, 结果自动左移结果自动左移1位位 STM #a, AR1 RPT #7 MVPD table, *AR1+ ;初始化初始化ai,xi STM #x, AR2 STM #a, AR3 RPTZ A, #3 MAC *AR2+, *AR3+, A STH A, y ;乘积向右增长,丢弃低乘积向右增长

31、,丢弃低16位乘积结果位乘积结果end: B end .end计算结果为计算结果为y=1eb7h=0.23996。4. 双操作数乘法双操作数乘法含义:含义:允许在一个机器周期内通过两个允许在一个机器周期内通过两个16位数据总线位数据总线(C总线和总线和D总线总线)寻址两个数据和系数,图寻址两个数据和系数,图4.9。 特点:特点:(1)用间接寻址方式获得操作数,且辅助寄存器只能用用间接寻址方式获得操作数,且辅助寄存器只能用AR2AR5(2) 寻址方式:寻址方式:*ARn、*ARn+、*ARn-、*ARn+0%。(3)比较比较p57,62指令码格式指令码格式(2) 占用的程序空间小。占用的程序空间

32、小。(3) 运行的速度快。运行的速度快。双操作数双操作数MAC形式的指令有形式的指令有4种,表种,表4-7p126。 【例【例4.21】 求解求解 的程序段的程序段p127。程序程序(部分部分)如下:如下: STM#a, AR2 STM#x, AR3 RPTZ A,#19;1个机器周期个机器周期 MAC *AR2+, *AR3+,A;1个机器周期个机器周期 STH A,y STL A,y+1效果:效果:单操作数需单操作数需(3N+4+1)T (例(例4.20) 双操作数需(双操作数需(2N+4+1)T(例(例4.20) 使用使用MAC 的双操作数只需要(的双操作数只需要(N+2)T(例例4.2

33、1 )5. 浮点运算浮点运算1) 浮点数的表示方法浮点数的表示方法 浮点数由尾数和指数两部分组成浮点数由尾数和指数两部分组成. 定点数定点数=尾数尾数2(指数指数) 浮点数的尾数和指数可正可负,均用补码表示。浮点数的尾数和指数可正可负,均用补码表示。 指数的范围从指数的范围从831。例如,定点数例如,定点数0x2000(0.25)用浮点数表示时,用浮点数表示时, 尾数为尾数为0x4000(0.5),指数为,指数为1,即即 0.25=0.5212) 定点数转换为浮点数(定点数转换为浮点数(3条指令)条指令) EXP src功能:功能:提取指数。计算提取指数。计算src的指数值并存放于的指数值并存

34、放于T寄存器中。寄存器中。 指数值通过计算指数值通过计算src的冗余符号位数并减的冗余符号位数并减8得到,冗余符号位数等于得到,冗余符号位数等于去掉去掉40位位src中除符号位以外的有效位所需左移的位数。累加器中除符号位以外的有效位所需左移的位数。累加器src中的中的内容不变。指数的数值范围是内容不变。指数的数值范围是831。例如:例如: EXP A0CH=1100B,所以累加器所以累加器A中左端有中左端有8*4+2=34位为位为1,去除,去除1位符号位,冗余符号位位符号位,冗余符号位=33,指数,指数=33-8=25=0019H ST T,EXPONENT 将保存在将保存在T寄存器中的指数存

35、放到数据存储器的指定单元中。寄存器中的指数存放到数据存储器的指定单元中。 NORM src ,dst 将将src中有符号数左移中有符号数左移TS位,结果存放在位,结果存放在dst中中得到尾数。得到尾数。 该指令常与该指令常与EXP指令结合使用,完成归一化处理。指令结合使用,完成归一化处理。 例如:例如: NORM A3) 浮点数转换为定点数:浮点数转换为定点数: 按指数值将尾数右移按指数值将尾数右移(指数为负时是左移指数为负时是左移)【例【例4.22】 编写浮点乘法程序,完成编写浮点乘法程序,完成x1x20.3(0.8)的运的运算。要求包括将定点数转换成浮点数、浮点乘法,最后再将算。要求包括将

36、定点数转换成浮点数、浮点乘法,最后再将浮点数转换成定点数。浮点数转换成定点数。程序中保留程序中保留10个数据存储单元:个数据存储单元:x1(被乘数被乘数) el(被乘数的指数被乘数的指数) m1(被乘数的尾数被乘数的尾数)x2(乘数乘数) e2(乘数的指数乘数的指数) m2(乘数的尾数乘数的尾数)product(乘积乘积) ep(乘积的指数乘积的指数) mp(乘积的尾数乘积的尾数)temp(暂存单元暂存单元).title“exp22.asm” .defstartSTACK:.usect “STACK”,100 .bssx1,1 .bssx2,1 .bssel,1 .bssm1,1 .bsse2

37、,1 .bssm2,1 .bssep,1 .bssmp,1 .bssproduct,1 .bsstemp,1 .datatable:.word 3*3276810 .wotd -8*3276810 .textstart:STM#STACK+100,SP;设置堆栈指针SP MVPD table,x1 ;将x1和x2传送至数据存储器 MVPD table+1,x2 LDx1,16,A ;将xl规格化为浮点数 EXP A STT,el ;保存x1的指数 NORM A STHA,ml ;保存x1的尾数 LDx2,16,A ;将x2规格化为浮点数 EXPA ST T,e2 ;保存x2的指数 NORM A

38、 STH A,m2 ;保存x2的尾数 CALL MULT ;调用浮点乘法子程序done: B doneMULT: SSBX FRCT SSBX SXM LD e1,A ;指数相加 ADD e2,A STL A,ep ;乘积指数ep LD ml,T ;尾数相乘 MPY m2,A ;乘积尾数存放在累加器A中 EXP A ;对尾数乘积规格化 ST T,temp ;规格化时产生的指数temp NORM A STH A,mp ;保存乘积尾数mp LD temp,A ;修正乘积指数 ADD ep,A ;(ep)+(temp)A STL A,ep ;保存乘积指数ep ;将浮点乘积转换成定点数NEG A ;乘

39、积指数反号,并加载到T寄存器 STL A,temp LD temp,T LD mp,16,A ;再将尾数存到AH NORM A;将尾数按TS移位 STH A,product ;保存定点乘积 RET .end最后得到0.3(0.8)乘积浮点数为:尾数0x8520; 指数0x0002。乘积的定点数为0xEl48,对应的十进制数等于0.23999。用用C语言和汇编语言混合编程方法主要有以下语言和汇编语言混合编程方法主要有以下3种种:(1)独立编写独立编写C程序和汇编程序,分开编译或汇编形成程序和汇编程序,分开编译或汇编形成各自的目标代码模块,然后用链接器将各自的目标代码模块,然后用链接器将C模块和汇

40、模块和汇编模块链接起来。编模块链接起来。(2)直接在直接在C程序的相应位置嵌入汇编语句。程序的相应位置嵌入汇编语句。(3) 对对C程序进行编译生成相应的汇编程序,然后对汇程序进行编译生成相应的汇编程序,然后对汇编程序进行手工优化和修改。编程序进行手工优化和修改。4.7 C语言与汇编混合编程汇编程序和C程序互相调用 灵活性较大,采用这种方法,C程序可以调用汇编程序,并且可以访问汇编程序中定义的变量。同样,汇编程序也可以调用C程序或访问C程序中定义的变量。但用户必须自己维护各汇编模块的入口和出口代码维护各汇编模块的入口和出口代码,自己计算传递的参数在堆栈中的偏移量,工作量稍大,但能做到对程序的绝对

41、控制。 在C程序中直接内嵌汇编语句可以在C程序中实现C语言无法实现的一些硬件控制功能,如修改中断控制寄存器、中断标志寄存器等。嵌入格式:asm(“汇编语句汇编语句”)括号中的汇编语句必须以标号、空格、tab、分号开头,这和通常的汇编编程的语法一样。不要破坏C环境,因为C编译器并不检查和分析嵌入的汇编语句。插入跳转语句和标号会产生不可预测的结果。插入跳转语句和标号会产生不可预测的结果。汇编语句不要改变C程序中变量的值。不要在汇编语句中加入汇编器选项而改变汇编环境。混合编程应遵循的规则和详细的接口规范混合编程应遵循的规则和详细的接口规范 1、寄存器规则、寄存器规则 在C语言中,状态标志的缺省数值如

42、下表所示。 名称名称 缺省值缺省值 名称名称缺省值缺省值 名称名称缺省值缺省值 ARP0CMPT0OVM0ASM-CPL1SXM-BRAF-FRCT0SMUL0C-OVA-SST0C160OVB-TC-辅助寄存器AR1、AR6、AR7、 ST0,ST1由被调用函数保护,而AR0、AR2、AR3、AR4、AR5可以自由使用 变量和函数命名规则 无论是变量还是函数,在C语言和汇编中均需要 说明为全局的。在C语言中需要有准确的函数原 型说明。 在C语言中保持“自然”的命名,而在汇编语言中 该名字需加一个下划线作为前缀。 例例:在:在C程序中定义,被汇编程序引用程序中定义,被汇编程序引用C程序部分程序

43、部分:extern void timer(void); int gScale;汇编部分汇编部分: .global _gScale .global _timer例例:在汇编程序中定义,在:在汇编程序中定义,在C程序中调用程序中调用汇编程序部分:汇编程序部分:.global _testpara_testpara: PSHM AR1 STM #para, AR1C程序部分:程序部分:extern void testpara(int a,int b,int c);void main(void)int x=10,y=20,z=30;testpara(1,2,3);testpara(x,y,z); CH4_9返回地址返回地址参数参数2参数参数3参数参数1在在A中中作业P130-131: 1,9,10

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号