DSP技术第4章:DSP汇编程序设计_第1页
DSP技术第4章:DSP汇编程序设计_第2页
DSP技术第4章:DSP汇编程序设计_第3页
DSP技术第4章:DSP汇编程序设计_第4页
DSP技术第4章:DSP汇编程序设计_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章DSP汇编程序设计☆汇编程序格式和伪指令☆汇编语言程序设计

DSP高级C语言编程第一部分DSP汇编程序格式和伪指令

每课一题如何给一个变量定义缓冲区?使用什么伪指令定义一个缓冲区?

1)汇编语言程序以.asm为扩展名

2)源程序=汇编指令+伪指令+宏指令

3)伪指令:为汇编服务,控制汇编;对程序代码和变量统一管理:分段;对ROM和RAM资源统一分配。

4)目标程序:由多个段组成,COFF格式。

5)段由伪指令在源程序中定义,最后的可执行文件中的段由链接器生成。●

汇编语言源程序格式●

源文件格式助记符指令源语句的每一行通常包含4个部分:标号区、助记符区、操作数区和注释区。

[标号][:]

助记符

[操作数]

[;注释]助记符指令语法格式:

【例】

助记符指令源语句举例。

NANHU

.set

1

;符号NANHU=1

Begin:

LD

#NANHUA,AR1

;将1加载到AR1

标号助记符操作数注释●

汇编语言中的常数与字符串

汇编器可支持7种类型的常数(常量)。

数据类型举例说明二进制1110001b或1110001B八进制226q或572Q十进制1234或+1234或-11234缺省型十六进制0A40h或0A40H或0xA40浮点数1.623e-23仅用于C语言字符‘D’字符串“thisisastring”程序格式:汇编指令大写,伪指令小写;伪指令以“.”开头例子(格式):教材P86汇编器伪指令定义段(代码段,数据段(既常数表),保留空间段等等);在存储器中为变量保留空间;初始化存储器;声明全局变量;为汇编器指定从中可以获得宏的库。●汇编伪指令功能伪指令的类型:1.定义段的伪指令2.初始化常数的伪指令3、声明全局变量伪指令4.段程序计数器(SPC)定位伪指令5.输出列表格式伪指令6.引用其他文件的伪指令7.控制条件汇编的伪指令8、内存划分、段分配伪指令9、其他伪指令1.定义段的伪指令.bss为变量定义缓冲区(单位为字).data定义数据段(常数表).sect定义初始化的段,可定义段名.text定义代码段.usect定义未初始化的段,可定义段名2.初始化常数的伪指令.space:定义保留的BIT数;.byte伪指令:定义8位的常数表;.word:定义16位有符号常数表;.int:定义16位无符号常数表;3.段程序计数器(SPC)定位伪指令.align使SPC对准某一页的1~128字(16位)的边界,操作数必须是2的幂,或默认的页边界。.even使SPC对准偶数字的边界;例:.data.align2

.word011h,022h,033h4.输出列表格式伪指令.title:定义标题.list/nolist:打开/关闭列表文件。5.引用其他文件的伪指令.copy/.include从其他文件包括源语句;.def:在当前模块定义一个全局符号,其他模块可以使用;.global:定义一个全局符号

.mlib:定义宏库.ref:确认一个全局符号,是在其他模块中定义的6.控制条件汇编的伪指令.if/.elseif/.else/.endiftitle条件汇编.loop/.break/.endloop循环汇编7其他伪指令.equ/.set使一个符号等于一个值.end结束程序.set给符号设置一个值有关伪指令更详细的内容见TMS320C54xAssemblyLanguageToolsUser’sGuide.TexasInstrumentsInc,June2001宏指令(自己定义的指令)

Macro:Auser-definedroutinethatcanbeusedasaninstruction汇编器支持宏语言,使用户可以建立自己的“指令”。当程序要将特定的任务执行若干次时,尤其有用。宏的使用DAT0.set60hDAT1.set61hDAT2.set62hDAT3.set63h.textADD3.macroX1,X2,X3,X_SUMLDX1,AADDX2,AADDX3,ASTLA,X_SUM.endm

…ST#0020h,DAT0ST#0030h,DAT1ST#1140h,DAT2ADD3DAT0,DAT1,DAT2,DAT3NOP

….end【例】计算y=

程序:

*********************************************example.asm*********************************************

.title“example.asm”.mmregsstack.usect“STACK”,10h.bssa,4.bssx,4.bssy,1.defstart.data

;为堆栈指定空间

;为变量分配9个字的空间【例】计算y=

程序:

table:

.word1,2,3,4.word8,6,4,2.textstart:STM#0,SWWSR

STM#STACK+10h,SP

STM#a,AR1RPT#7

MVPDtable,*AR1+

CALLSUMend:Bend

;变量初始化

;插入0个等待状态

;设置堆栈指针

;

AR1指向a

;移动8个数据

;从程序存储器到数据存储器

;调用SUM子程序

【例】计算y=

程序:

SUM:STM#a,AR3STM#x,AR4RPTZA,#3MAC*AR3+,*AR4+,ASTLA,@yRET.end

;子程序执行第二部分DSP汇编程序设计

TMS320C54x提供2种编程语言:汇编语言和C/C++。对于完成一般性功能的代码,这2种语言都可以使用,但对于一些运算量很大的关键代码,最好采用手工编写的汇编语言来完成。TMS320C54x提供有2种开发环境:非集成的开发环境、集成开发环境CodeComposerStudio,简称CCS。CCS在WINDOWS操作环境下运行,集成了非集成开发环境的所有功能,并扩展了许多其他的功能。DSP设计流程C源文件C编译器汇编源文件汇编器汇编源文件COFF目标文件链接器可执行的COFF文件宏源文件存档器宏库存档器目标文件库建库工具运行时支持库EPROM编程器交叉引用列表器调试工具TMS320C54x绝对地址列表器HEX代码转换工具汇编语言程序的编辑、汇编和链接过程示意图汇编器调试程序链接器文本编辑器.asm源文件.obj目标文件.out输出文件.cmd链接命令文件.lst列表文件.map存储器映像文件十六进制转换程序HEX500-

o-

m-

l4.4。

COFF格式文件

汇编器和链接器生成的目标文件,是一个可以由’C54x器件执行的文件。这些目标文件的格式称之为公共目标文件格式(COFF)。

在编写汇编语言程序时,COFF采用代码段和数据段的形式,以便于模块化的编程,使编程和管理变得更加方便。

这些代码段和数据段简称为段。汇编器和链接器提供一些伪指令来建立和管理各种各样的段。

4.4.1

COFF文件的基本单元

1.

段(sections)

是COFF文件中最重要的概念。每个目标文件都分成若干段。段——是存储器中占据相邻空间的代码或数据块。一个目标文件中的每个段都是分开的和各不相同的。

COFF目标文件都包含以下3种形式的段:

.text段(文本段),通常包含可执行代码;

.data段(数据段),通常包含初始化数据;

.bss段(保留空间段),通常为未初始化变量保留存储空间。2.段的基本类型

COFF目标文件中的段有两种基本类型。

初始化段

未初始化段(1)初始化段初始化段中包含有数据或程序代码。主要有:

.text段——已初始化段;

.data段——已初始化段;

.sect段——已初始化段,由汇编器伪指令建立的自定义段。2.段的基本类型

COFF目标文件中的段有两种基本类型。(2)未初始化段在存储空间中,为未初始化数据保留存储空间。它包括:.bss段——未初始化段;

.usect段——未初始化段,由汇编命令建立的命名段(自定义段)。3.

段与目标存储器的对应关系

汇编器的任务:在汇编过程中,根据汇编命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。链接器的任务:就是分配存储单元,将目标文件中的段重新定位到目标系统的存储器中,这一过程称为定位或分配。

目标文件中的段与目标存储器之间的关系

目标文件目标存储器.bss.data.textRAME2PROMROM4.4.2

汇编器对段的处理

汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。

汇编器有5条伪指令可识别汇编语言程序的各个部分:

●.bss●.usect●.text●.data●.sect——定义未初始化段,给变量保留空间——定义未初始化段,如定义一个缓冲区——定义已初始化段,即代码段——定义已初始化段,一般是指常数表——定义已初始化段,如定义一段完成某项功能的代码为一个段,可以命名。.bss符号,字数符号.usect“段名“,字数.sect“段名“伪指令使用格式▼堆栈的设置

size.set120stack.usect“STACK”,sizeSTM#

stack

+

size,SP

在数据RAM空间开辟一个堆栈区。在RAM中定义一个STACK的保留空间,共120个单元

设置堆栈指针,#

stack+size→SP。保留区的高地址赋给SP,作为堆栈的栈底若程序中要使用堆栈,必须先进行设置,如:

设置好堆栈后,就可以使用堆栈了,如:CALLpmad;(SP)-1→SP,(PC)+2→TOS,pmad→PCRET;(TOS)→PC,(SP)+1→SP

经汇编后,得列表文件(部分):2*******************************3

**汇编一个初始化表到.data段**4

*******************************5

0000.data6

0000

0044coeff.word044h,055h,066h

00010055

000200667*******************************8**在.bss段中为变量保留空间**9*******************************10

0000.bssbuffer,811*******************************12**仍然在.data段中**13*******************************14

00030456prt.word0456h行号目标代码段名100df0100001f8420001110af166000aF8680006004400550066045600cc00dd00ee00440088

没有数据保留10个字50000.data600000044coeff.word044h,055h,066h100000.bssbuffer,81400030456prt.word0456h.data

6

00446

00556

006610

.bss

没有数据保留8个字14

04564.4.2

汇编器对段的处理

(如下例或者教材P98例)15********************************16**汇编代码到.text段**17********************************18

0000.text19

0000

100dadd:LD0Dh,A20

0001

f010aloop:SUB#1,A

0002

0001

21

0003

f842

BCaloop,AGEQ

0004

0001’

22

**********************************23

**汇编另一个初始化表到.data段**

24**********************************25

0004

.data

26

0004

00ccivals.word0CCh,0DDh,0EEh

0005

00dd

0006

00ee27********************************28

**为更多的变量定义另一个段**29********************************30

0000var2.usect“newvars”,231

0001

inbuf.usect“newvars”,8

行号目标代码段名100df0100001f8420001110af166000aF868000666614004400550066045600cc00dd00ee.data00440088

10没有数据保留8个字.bss没有数据保留10个字.text

180000.text190000100dadd:LD0Dh,A19

100d200001f010aloop:SUB#1,A20

f01020

0001210003f842BCaloop,AGEQ21

f84221

0001250004.data26000400ccivals.word0CCh,0DDh,0EEh.data

26

00cc26

00dd26

00ee300000var2.usect“newvars”,2newvars

30

保留2个字310001inbuf.usect“newvars”,831

保留8个字4.4.2

汇编器对段的处理

32

*********************************33

**汇编更多代码到.text段**34*********************************35

0005

.text

36

0005

110a

mpy:LD0Ah,B

370006

f166mloopMPY#0Ah,B

0007

000a

38

0008

f868BCmloop,BNOV

0009

0006’

39****************************************40

**为中断向量.vectors定义一个自定义段**41****************************************42

0000

.sect“vectors”

430000

0044

.word044h,088h0001

0088

行号目标代码段名1920202121100df0100001f8420001110af166000aF8680006.text66614262626004400550066045600cc00dd00ee.data00440088

10没有数据保留8个字.bss3031没有数据保留10个字newvars350005.text.text

360005110ampy:LD0Ah,B36

110a370006f166mloopMPY#0Ah,B37

f16837

000a380008f868BCmloop,BNOV38

f86838

0006420000.sect“vectors”vectors

4300000044.word044h,088h43

004443

00884.4.2

汇编器对段的处理(如下例或者教材P98例)▼汇编程序开发流程汇编器调试程序链接器文本编辑器.asm源文件.obj目标文件.out输出文件.cmd链接命令文件.lst列表文件.map存储器映像文件十六进制转换程序HEX500-

o-

m-

l▼编辑器编辑源程序,任何文本编辑器都可以。▼汇编器生成目标文件,为COFF格式,即分段格式。汇编时用到的控制参数(教材P105),例如:-l:表示汇编后产生列表文件-x:表示产生一个交叉汇编表。-c:表示汇编时忽略字母大小写。列表文件(教材P105)包括源程序行号,SPC,目标代码和源程序。▼链接器链接器的主要功能:1)将几个不同程序中的相同段连接在一起(SPC重新计算)2)将几个不同的.OBJ文件连接成一个统一的目标文件,即.OUT文件3)根据.CMD文件的要求,对内存资源和程序中的段进行统一管理和分配。链接器使用的控制选项:教材P107-eglobal_symbol,定义程序的入口点-lfilename,指定链接时要用到的库名-mfilename,生成map文件-ofilename,指定生成的.out文件链接器的使用:2种方式1)命令行2)使用链接器命令文件,即.cmd文件,是一个批处理文件例子(教材P107)多个文件的链接例子(教材P108)例4.9(P108)和例4.1(P86)两个文件的链接链接器命令文件(CMD文件)内存划分和段分配:用伪指令MEMORY和SECTIONS描述。MEMORY:内存划分,分为页和区SECTIONS:段分配,分配段到指定的页和区对内存ROM和RAM资源和程序中的段进行统一管理和分配,包括:内存划分和段分配。MEMORY伪指令:内存划分,将内存划分为不同的页和区,每个页和区都命名,如ROM区,RAM区SECTIONS伪指令:段分配,将源文件中定义的段分配给不同的内存区域。如果没有使用MEMORY和SECTIONS定义存储器空间模型和配置,链接器对C54x使用缺省的存储器模型和段分配方法。缺省分配如下:MEMORY/*MEMORY伪指令*/{PAGE0:PROG:origin=0x0080length=0xFF00PAGE1:DATA:origin=0x0080length=0xFF80}SECTIONS/*SECTIONS伪指令*/{.text:PAGE=0.data:PAGE=0.cinit:PAGE=0.bss:PAGE=1}链接命令文件的编写/**********链接命令文件**********//**********example.cmd**********//*******************************/a.objb.objc.obj/*输入文件名*/-oprog.out/*输出out文件*/-mprog.mapMEMORY/*MEMORY伪指令*/{PATE0:ROM:origin=0100hlength=0100hPAGE1:RAM:origin=100hlength=0100h}SECTIONS/*SECTIONS伪指令*/{.text:>ROM.data:>RAM.bss:>RAM}档案管理器(Archiver)档案管理器允许用户将一组文件归入一个单一文件中,这个单一文件就叫库或归档文件。档案管理器的启动:ar500-[command][option]libname[filename1…filenamen]command告诉档案管理器如何处理库option告诉档案管理器如何运行libname归档库名,默认扩展名(.lib)filename独立文件名(.obj)例:创建一个名为function.lib的库,它包括文件sine.obj、cos.obj、flt.obj,命令为:Ar500–afunctionsinecosflt绝对列表器绝对列表器是一个调试工具。它将链接后的目标文件作为输入文件,创建扩展名为.abs的文件作为输出。.abs文件被汇编后,产生显示目标代码绝对地址的列表。启动绝对列表器的命令:

abs500[-option]inputfile具体用法可参考TMS320C54xAssemblyLanguageToolsUser’sGuide.TexasInstrumentsInc,June2001交叉引用列表器交叉引用列表器是一种调试工具。链接后的可执行文件作为交叉引用列表器的输入文件,其输出文件为交叉引用列表文件(.xrf)。此列表文件列出可执行文件中符号、符号的定义及它们的引用情况。启动交叉引用列表器的命令:

xref500[-option][inputfile[outputfilename]]具体用法可参考TMS320C54xAssemblyLanguageToolsUser’sGuide.TexasInstrumentsInc,June2001十六进制转换公用程序C54x汇编器、链接器产生COFF可执行文件。COFF文件是TI公司的二进制格式文件,便于模块化编程和提供灵活、方便的代码管理及存储空间管理。但大多数EPROM编程器不接收COFF格式文件,因此TI公司提供了一个将COFF文件格式转化为Intel、Tektronix、Ti-tagged、Motorola-S、ASCII-hex等文件格式的公用程序。启动十六进制转换程序的命令:

hex500[-option]filename4.6汇编程序设计举例基本程序类型:3类1)程序的控制和转移(改变PC)2)数据块传送程序(复制代码)3)算术运算程序(用于算法)▼程序的控制和转移控制和转移指令:改变PC指针的指令例子:教材P1111、分支转移指令BANZ指令:ARx不等于0则转移,用于控制循环次数或者重复次数。作用:用于循环控制例子:教材P1142、调用与返回指令只有定义了堆栈后才能使用调用和返回指令堆栈的定义方法:先定义一个保留空间,然后将SP指向该空间,则此空间即为堆栈SP总是指向最上面一个单元,即堆栈顶部例子:P114进堆栈,SP先减1,然后压数出堆栈,先取数,然后SP加13、重复操作(即循环操作)3条重复指令RPT(重复下条指令)RPTZ(累加器清零并重复下条指令)RPTB(块重复操作)1)单指令重复操作:RPT例子,P1152)块重复操作指令:RPTB块重复次数控制:使用块重复计数器BRC,使用STM命令设置BRC大小循环开始地址:RSA,即RPTB指令的下一条指令。循环结束地址:REA,由RPTB指令中的操作数指定例子,P1153)循环嵌套(了解)

RPTB指令中可以嵌套RPT指令▼数据块传送程序:复制功能4种类型:1)程序存储器<-->数据存储器2条指令:MVPD,MVDP2)数据存储器<-->数据存储器3条指令:MVDK,MVKD,MVDD3)数据存储器<-->MMR3条指令:MVMD,MVDM,MVMM4)程序存储器(累加器寻址)<-->数据存储器2条指令:READA,WRITEA例子:P117▼算术运算类类型单字运算长字运算整数运算小数运算(定点DSP都采用小数乘法进行乘法运算)定点运算浮点运算有符号数和无符号数符号位:最高位表示符号位,0为正数,1为负数原码=补码取反+1单字运算例子,P119小数表示方法2的补码表示小数使用32768(=215)乘以十进制小数绝对值后,再取反+1得到补码,然后将其结果的十进制整数部分转换为16进制数2个带符号小数相乘时,得到2个符号位,必须移去一个符号位,所以要使FRCT=1,可以使用指令SSBXFRCT实现例子,P124第三部分DSP高级C语言程序设计DSP设计流程C源文件C编译器汇编源文件汇编器汇编源文件COFF目标文件链接器可执行的COFF文件宏源文件存档器宏库存档器目标文件库建库工具运行时支持库EPROM编程器交叉引用列表器调试工具TMS320C54x绝对地址列表器HEX代码转换工具汇编语言程序的编辑、汇编和链接过程示意图汇编器调试程序链接器文本编辑器.asm源文件.obj目标文件.out输出文件.cmd链接命令文件.lst列表文件.map存储器映像文件十六进制转换程序HEX500-

o-

m-

lTMS320C54x开发工具C编译器支持标准C/C++语言;增加了新的语法内容:如:增加了新的关键词、函数、库,用于描述DSP硬件C语言开发的优点

1)便于阅读,维护,交流,如:control_word_4ch(led0,on);

上面的函数是点亮0号led指示灯。2)编程更为容易,不是特别精通汇编语言的开发人员也可以编写;3)便于移植到C55、C2000、C6000等DSP系统;TMS320C54xC编译器支持的关键词const关键词用来控制数据对象的存储分配,const定义的常数被分配在ROM中,关键词volatile定义的数据分配在RAM中。例如定义ROM常数表

constintdigits[]={0,1,2,3,4,5,6,7,8,9}2.ioport关键词用来访问TMS320C54x器件的I/O端口空间格式:

ioporttypeporthex_numioport指示这是一个端口变量的关键词

type(类型)必须是char(字符)、short(短整数)、int(整数)或无符号的变量。porthex_num指端口编号。hex_num变量为十六进制的数。

例:声明I/O端口为无符号端口10h,将a写到端口10h,然后将端口10h读进b:ioportunsignedport10;/*访问I/O端口10h的变量*/intfunc(){…port10=a;/*将a写到端口10h*/…b=port10;/*将端口10h读进b*/…}端口变量的使用对赋值没有限制。端口变量可像其他变量一样用在表达式中。a=port10+b;/*读端口10h,加上b,结果赋给a*/prot10+=a;/*读端口10h,加上a,结果写到端口10h*/3.interrupt关键词用来指定某函数作为中断函数。

interruptvoidint_handler(){unsignedintflags;

…}4.C_int00表示C/C++主函数main()的入口地址。pragma伪指令Pragma伪指令告诉编译器的预处理器如何处理函数,TMS320C54xC编译器支持下列pragma:

CODE_SECTION/*为symbol分配空间,.text段*/#pragmaCODE_SECTION(symbol,”sectionname”)

DATA_SECTION/*为symbol分配空间,.data段*/

#pragmaDATA_SECTION(symbol,”sectionname”)汇编语言与C/C++混合编程在DSPC程序中访问汇编变量和常量在DSPC程序中嵌套汇编语句C语言开发DSP程序可读性和可移置性强,同时使用C编译器的优化功能可以增强编程的效率。而汇编程序比较精练,运行效率高。为了提高程序的开发效率,通常用到汇编语言与C/C++混合编程的方法。特别是用C程序不能深入底层访问硬件寄存器时,可以调用汇编语句来完成一些硬件访问。独立的DSPC语言和汇编接口在DSPC和汇编程序相互访问过程中,为了在访问之后返回时程序不出错,需要保护一些特定的寄存器。因此,要求DSPC与汇编程序接口时必须遵循一定的寄存器规则。(1)必须保护正在运行的函数所用到的几个特定的寄存器AR1、AR6、AR7及SP

PUSH(AR7)/*将AR7压入堆栈*/

CALL_c_int3/*调用C函数*/

AR7=POP()/*将AR7弹出堆栈*/(2)在中断服务子程序执行前,必须保存所有正在使用的寄存器。PUSH(PMST)/*将PMST压入堆栈*/

CALL_c_int3/*调用C函数*/

PMST=POP()/*将PMST弹出堆栈*/(3)函数有值返回时,返回在累加器A中。(4)不论什么目的,汇编程序模块都不能使用.cinit段。(5)所有在DSPC中定义的变量、数组等表示符,在汇编程序中引用时,都要在表示符的前面加上下划线”_”.(6)在汇编程序和C程序中同时使用的变量或函数,要在汇编程序和C程序中同时说明为外部的,这样链接器才能识别。C程序(mixc11.c)externintasmfunction();

/*说明外部的asm函数*/externintgvar;

/*说明外部变量*/intresult;main(){inti=200;i=asmfunction(i);

/*调用汇编函数*/result=gvar*5+10;}汇编程序(mixasm11.asm).global_gvar;说明外部变量.global_asmfunction.data;为汇编变量分配地址_gvar.word100;定义变量

.text_asmfunction:ADD*(_gvar),A;(gvar)+A=>ASTLA,*(_gvar);A=>(gvar)RET.endC程序调用汇编程序C程序(mixc23.c)#defineTABLE_SIZE((int)(&table_size))externinttable_size;/*说明为外部的*/inta[10],b[10];main(){inti;for(i=0;i<TABLE_SIZE;i++)/*引用常量*/{a[i]=0;b[i]=0;}for(i=0;i<TABLE_SIZE;i++)/*引用常量*/{a[i]=i*10+10;b[i]=a[i];}wait:gotowait;}2.访问汇编程序常数

DSPC程序访问在汇编程序中定义的常数有两种方法,其一是利用.set和.global伪指令定义汇编程序外部常量;其二是利用连接器分配语句在链接命令文件中定义他们。汇编程序(mixasm23.asm)_table_size.set10;定义常量.global_table_size;说明为外部的链接命令文件(mix23.cmd)_table_size=10;/*定义常量*/.

..3.在汇编程序中访问DSPC程序变量和常量

C程序(mixc25.c)externintasmfunction();

/*说明外部的asm函数*/intgvar;

/*定义变量*/main(){inti=0;gvar=100;i=asmfunction(i);

/*调用汇编函数*/}汇编程序(mixasm25.asm).global_asmfunction.global_gvar;说明外部变量.text_asmfunction:STM#1000,AADD*(_gvar),A;(gvar)+A=>ASTMA,*(_gvar);A=>(var)RET.end该方法常常应用在C程序遇到无法实现的一些硬件控制问题的情况下。而在C程序中嵌入汇编语句不但能够有效的解决这些问题,而且在C程序的关键部分用汇编语句代替C语句可以优化这个程序。编译器将DSPC程序中嵌入的汇编语句插入到由编译器产生的汇编语言文件中。格式:

在汇编语句前加”\t”,然后再加左右双引号,用小括号将语句括住,在括号前加上asm标识符。

asm(“\tSSBXINTM”);/*使INTM=1*/DSPC程序中直接嵌套汇编语句在DSPC中嵌入汇编语句时,要注意以下几点:要非常小心,不要干扰C环境。编译器不能检验或分析插入的asm指令的正确性;将条件转移或标号插入到C代码会产生无法预测的结果,这是由于混淆了代码产生器使用的寄存器跟踪算法;当使用asm语句时,不能改变C变量的值;不能利用asm语句插入汇编伪指令来改变汇编环境C程序(mixc31.c)externunsignedint*vecTable;externvoidc_int3()inta,b;main(){unsignedint*pmst=(unsignedint*)0x1d;asm(“\tSSBXINTM“);/*INTM=1*/asm(“\tSTM0x08C0PMST”);*pmst|=(unsignedint)&vecTable;asm(“\tSTM0x0100IMR”);wait:asm(“\tRSBXINTM“);/*INTM=0*/gotowait;}DSPC编译器提供的内联函数同一般的函数一样使用,每一条intrinsics函数都相对应一条汇编指令,并与汇编指令的功能相同。intrinsics函数放在头文件intrindefs.h中。4.利用DSPC编译器的内联(intr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论