平博(中国)PINNACLE·官方网站

4软件开平博PINNACLE发ppt|平博
平博

平博咨询热线

18950259620

Classification

新闻动态

18950259620
传真:18950259620
手机:18950259620
邮箱:620@qq.com
地址:福建省福州市鼓楼区洪山镇首凤路1号2#楼113室
当前位置: 首页 > 新闻动态 > 行业资讯

4软件开平博PINNACLE发ppt

发布时间:2024-12-15 07:03:59 丨 浏览次数:914

  免费在线软件开发,软件开发需要学什么,软件开发难学吗,开发一个软件多少钱,软件开发工具,软件开发公司,软件开发工程师,软件下载,软件开发流程,软件设计

  应用电子技术 DSP技术及应用 TMS320C54x的软件开发 (5) 链接。 生成输出文件example.out和映像文件example.map。 将example.out装入目标系统就可运行了。 系统复位后,PC首先指向0FF80h,这是复位向量地址。在这个地址上,有一条B start指令,程序马上跳转到start语句标号,从程序起始地址0e000h开始执行主程序。 以上所述5步是一个常用的简单引导文件范例。 4.6 汇编语言程序设计 基本程序设计分为3大类: (1) 程序的控制与转移。 (2) 数据块传送程序。 (3) 算术运算类程序。 4.6.1 程序的控制与转移 包括:分支转移 子程序操作(调用与返回程序) 循环控制(重复操作) 这些指令都将影响程序计数器(PC),会造成把一个不是顺序增加的地址加载到PC。 多重条件 如:BC pmad, cond[,cond[,cond]], 当这条指令的所有条件得到满足时,程序才能转移到pmad。 不是所有条件都能构成多重条件. 1. 分支程序 根据条件判断改写PC值,使程序发生分支转移。 两种形式:有条件分支转移和无条件转移。 常用指令: B[D]、BACC[D] ;BC[D]、BANZ[D] 合理地设计延迟转移指令,可以提高程序的效率。应当注意,紧跟在延迟指令后面的两个字,不能是造成PC不连续的指令(如分支转移、调用、返回或软件中断指令)。 【例4.11】 条件分支转移指令BC举例。 BC new, AGT, AO ; 若累加器A0且溢出,则转至new,否则往下执行 单条指令中的多个条件是“与”的关系。 如果需要两个条件相“或”,只能写成两条指令。如上一条指令改为“若累加器A大于0或溢出,则转移至new”,可以写成如下两条指令 BC new, AGT BC new, AO 【例4.12】 计算 .bss x, 5 ;为变量分配6个字的存储空间 .bss y, 1 STM #x, AR1 ;AR1指向x STM #4, AR2 ;设AR2初值为4 LD #0, A loop: ADD *AR1+, A BANZ loop, *AR2- ;当AR2不为0时转移,AR2-1→AR2 STL A, @y 本例中用AR2作为循环计数器,设初值为4,共执行5次加法。也就是说,应当用迭代次数减1后加载循环计数器。 2. 调用与返回程序 当调用子程序或函数时,DSP就会中断原先的程序,转移到程序存储器的其他地址继续运行。调用时,下条指令的地址被压入堆栈,以便返回时将这个地址弹出至PC,使中断的程序继续执行。 两种形式: 无条件调用与返回,有条件调用与返回。 常用指令: CALL[D]、CALA[D]、RET[D]、CC[D]、RC[D] 例如(堆栈设置后) CALL pmad ;(SP)-1→SP,(PC)+2→TOS, pmad→PC RET ;(TOS)→PC, (SP)+1→SP 堆栈: 16位堆栈指针(SP)寻址的软件堆栈。 堆栈是一个特殊的存储区域,遵循先进后出的原则,当向堆栈中压入数据时,堆栈从高地址向低地址增长,堆栈指针SP始终指向栈顶。 堆栈用法: 压入操作:SP先减1,然后再将数据压入栈顶。 弹出操作:数据弹出后,再将SP加1。 堆栈设置ct “STK”, size ;自定义一个名为STK的保留空间,共100个单元 STM #stack+size, SP ;将这个保留空间的高地址(#stack+size)赋给SP, 作为栈底, 3. 重复操作( 3条指令) RPT(重复下条指令)、 RPTZ(累加器清0并重复下条指令) RPTB(块重复指令)。 (1) 重复执行单条指令 含义:RPT或RPTZ允许重复执行紧随其后的那一条指令。 重复次数:如重复执行n次,则重复指令中计数值为n-1。 说明:与BANZ指令进行循环相比,效率要高得多。 特别是对于那些乘法累加和数据传送的多周期指令(如MAC、MDK、MDP和MPD等),在执行一次之后就变成了单周期指令,大大提高了运行速度。 【例4.13】 对数组进行初始化。x[5]={0,0,0,平博PINNACLE 平博app 官方网站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指令的下一行; 结束地址(REA):由RPTB指令的操作数规定。 特点: 对任意长的程序段的循环开销为0; 其本身是一条2字4周期指令; RPT指令一旦执行,不会停止操作,即使有中断请求也不响应;而RPTB指令是可以响应中断的。 … ST #0034h, DAT0 ; 参数赋值 ST #0243h, DAT1 ST #1230h, DAT2 ADD3 DAT0, DAT1,DAT2,DAT3 ; 宏调用:DAT3 = ; DAT0 + DAT1 + DAT2 NOP … .end 4.4 公共目标文件格式——COFF COFF (Common Object File Format,COFF) :汇编器和链接器所创建的目标文件 。 COFF的核心概念:使用代码块(段)和数据块(段)编程,而不是指令或数据简单的顺序编写。 采用段形式的优缺点: ①更利于模块化编程,管理代码段和目标系统存储器更灵活 ②不必为程序代码或变量指定目标地址,这为程序编写和程序移植提供了极大的方便; ③ 能与系统存储单元充分配合; ④ 编译系统复杂; ⑤ 对编程人员要求高(系统存储器结构;存储器映射方式) 4.4.1 COFF文件中的段 段(Sections)是COFF文件中最重要的概念。 段——就是在编写汇编语言源程序时,采用的代码块或数据块,它占据存储器的某个连续空间。 ① 在编写汇编语言源程序时,程序是按段组织的; ② 每行汇编语句从属一个段,由伪指令标明该段的属性; ③ 一个目标文件中的每个段都是分开的和各不相同的。 所有的COFF目标文件都包含以下3种形式的段: .text 段 (此段通常包含可执行代码); .data段 (此段通常包含初始化数据); .bss 段 (此段通常为未初始化变量保留存储空间)。 此外,汇编器和链接器可以建立、命名和链接自定义段。 ①自定义段是程序员自己定义的段; ②使用起来与.data、.text以及.bss段类似; ③它的好处是在目标文件中与.data、.text以及.bss分开汇编,链接时作为一个单独的部分分配到存储器。 ④有2种形式: .sect 建立的自定义段是已初始化段; .usect 建立的自定义段是未初始化段。 汇编器根据伪指令用适当的段将各部分程序代码和数据连在一起,构成目标文件; 链接器分配存储单元,即把各个段重新定位到目标存储器中。 图4.2 目标文件中的段与目标存储器之间的关系 4.4.2 汇编器对段的处理 汇编器对段的处理是通过段定义伪指令区分出各个段,且将段名相同的语句汇编在一起。 ①汇编器有5个段定义伪指令支持该功能,这5个伪指令是:.bss,.usect,.text, .data, .sect ②如果汇编语言程序中一个段伪指令都没有用,汇编器会把程序中的内容都汇编到.text段。 ③汇编器对不同类型段的处理不同。 1. 未初始化段 未初始化段(Uninitialized sections)由.bss和.usect伪指令建立。 未初始化段就是在目标存储器中的保留空间,以供程序运行过程中的变量作为临时存储空间使用。 在目标文件中,这些段中没有确切的内容,通常它们定位到RAM区。 未初始化段分为默认的和命名的2种,其句法如下 .bss 符号,字数 符号 .usect “段名”,字数 每调用.bss伪指令一次,汇编器在相应段保留预留字数的空间; 每调用.usect伪指令一次,汇编器在指定的命名段保留预留字数的空间。 2. 初始化段 初始化段(Initialized sections)由.text、.data和.sect伪指令建立,包含可执行代码或初始化数据。 这些段中的内容都在目标文件夹中,当加载程序时再放到存储器中。 每个初始化段都是可以重新定位的,并且可以引用其他段中所定义的符号。链接器在连接时自动处理段间的相互引用。 3种初始化伪指令的句法如下: .text [段起点] .data [段起点] .sect “段名”[,段起点] 二者的不同: 当汇编器遇到.text或.data或.sect伪指令时,将停止对当前段的汇编(相当于一条结束当前段汇编的伪指令),然后将紧跟着的程序代码或数据汇编到指定的段中,直到再遇到另一条.text或.data或.sect伪指令为止。 而当汇编器遇到.bss和.usect伪指令时,并不结束当前段的汇编,只是暂时从当前段脱离出来,并开始对新的段进行汇编。.bss和.usect伪指令可以出现在一个已初始化段的任何位置上,而不会对它的内容发生影响。 3. 自定义段 .usect和.sect可以创建自定义的段。 自定义段是用户自己创建的,可以同默认的.test、.data、.bss段一样使用,但它们之间是单独汇编的。 可为那些未初始化的、不在.bss段的变量保留空间。.usect创建同.bss段一样使用的自定义段,它在RAM中为变量保留空间。 也可以汇编已初始化的、不在.data段中的数据,.sect创建像默认的.text和.data一样的段,可包含代码和数据,而且有可重定位的地址。 4. 段程序计数器(SPC) 汇编器为每个段都安排一个单独的段程序计数器(SPC)。 SPC表示一个程序代码段或数据段内的当前地址。 一开始,汇编器将每个SPC置0。当汇编器将程序代码段或数据加到一个段内时,相应的SPC就增加。如果继续对某个段汇编,则相应的SPC就在先前的数值上继续增加。 链接器在链接时要对每个段进行重新定位。 【例4.4】 段伪指令应用举例。 1 0000 .data ;汇编至.data段 2 0000 0011 coeff .word 011h, 022h, 033h 0001 0022 0002 0033 3 0000 .bss buffer, 10 ;在.bss段为buffer变量 ;保留10个字的空间 4 0003 0123 ptr .word 0123h ;继续汇编至.data段 5 0000 .text ;汇编至.text 段 6 0000 100f add: LD 0Fh, A 7 0001 f010 aloop: SUB #1, A 0002 0001 8 0003 f842 BC aloop, AGEQ 0004 0001 9 0004 .data 10 0004 00aa ivals .word 0AAh,0BBh,0CCh;继续汇编至.data段 0005 00bb 0006 00cc 11 0000 var2 .usect “newvars”,1 ;自定义数据段,保留8 ;个字的空间 12 0001 inbuf .usect “newvars”,7 13 0005 .text ;继续汇编至.text 段 14 0005 110a mpy: LD 0Ah, B 15 0006 f166 mloop: MPY #0Ah, B 0007 000a 16 0008 f868 BC mloop, BNO 0009 0006 17 0000 .sect “vectors” ;自定义数据段,包含 ;2个初始化字 18 0000 0011 .word 011h, 033h 19 0001 0033 ↑ ↑ ↑ ↑ field1 field2 field3 field4 行号 SPC 代码 源程序 共建立了5个段。目标代码图 4.4.3 链接器对段的处理 链接器在处理段的时候,有如下2个主要任务: 将由汇编器产生的COFF格式的一个或多个.obj文件链接成一个可执行的.out文件; 重新定位,将输出的段分配到相应的存储器空间。 链接器有2条命令支持上述任务: (1) MEMORY命令。定义目标系统的存储器配置图,包括对存储器各部分命名,以及规定它们的起始地址和长度; (2) SECTIONS命令。平博PINNACLE 平博app 官方网站告诉链接器如何将输入段组合成输出段,以及将输出段放在存储器中的什么位置。 1. MEMORY命令 作用:定义系统中所包含的各种形式的存储器,以及它们占据的地址范围。 句法: MEMORY { PAGE0:name 1[(attr)]: orign=constant, length=constant; PAGEl:name n[attr]: orign=constant, length=constant; } PAGE——对一个存储空间加以标记。PAGE 0程序存储器,PAGE l定为数据存储器。 Name——对一个存储区间取名。 Origin——存储区的起始地址。键入Origin、Org或O都可 Length——规定存储区的长度。键入Length、Len或L都可以 Attr——这是一个任选项,为命名区规定1~4个属性。如果有选项,应写在括号内。当输出段定位到存储器时,可利用属性加以限制。属性选项一共有4项: R 规定可以对存储器执行读操作; W 规定可以对存储器执行写操作; X 规定存储器可以装入可执行的程序代码 I 规定可以对存储器进行初始化。 如果一项属性都没有选中,就可以将输出段不受限制的定位到任何一个存储器位置。任何一个没有规定属性的存储器(包括所有默认方式的存储器)都有全部4项属性。 。 【例4.5】 MEMORY命令的使用。 MEMORY { PAGE 0: ROM: origin=0c00h, length=1000h; PAGE 1: SCRATCH: origin=60h, length=20h; ONCHIP: origin=80h, length=200h; } 上述MEMORY命令所定义的系统的存储器配置如下: PAGE 0为程序存储器,名ROM,起始地址0C00H,长度4K字。 PAGE l为数据存储器,名SCRATCH,起始地址60H,长32字。 PAGEl为数据存储器,名ONCHIP,起始地址80H,长度512字。 2. SECTIONS命令 作用:说明如何将输入段组合成输出段; 规定输出段在存储器中的存放位置; 并允许重新命名输出段。句法: SECTIONS {name:[property,property,property,……] name:[property,property,property,……] name:[property,property,property,……]} Name——段名,每一个输出段的说明都从段名开始。 Property——性能参数 【例4.6】 SECTIONS命令的使用。 file1.obj file2.obj SECTIONS { .text: load=ROM, run=800h .bss: load=RAM .vectors: load=FF80h } .bss段结合file1.obj和file2.obj的.bss段且被装入RAM空间。 .text段结合file1.obj和file2.obj的.text段,链接器将所有命名为.text 的段都结合进该段,在程序运行时该段必须重新定位在地址 0800h。 .vectors段定位在地址FF80h。 3. MEMORY和SECTIONS命令的缺省算法 如果没有利用MEMORY和SECTIONS命令,链接器就按缺省算法来定位输出段: MEMORY { PAGE 0:PROG:origin=0x0080, length=0xFF00 PAGE 1:DATA:origin=0x0080, length=0xFF80 } SECTIONS { .text: PAGE=0 .data: PAGE=0 .cinit: PAGE=0 .bss: PAGE=1 } 4.5 汇编源程序的编辑、汇编和链接过程 4.5.1 编辑: 利用诸如Word、Edit、记事本等文本编辑器,编写汇编语言源程序,后缀为.asm。 4.5.2 汇编器 作用: 汇编语言源文件(.asm)翻译成机器语言目标文件(.obj) 。 输入文件: 汇编语言源文件,其省缺的文件扩展名是.asm。 1. 汇编器的功能 (1) 处理源语句,产生一个可重新定位的目标文件(.obj); (2) 根据要求,产生源列表文件(.lst),并提供对该列表的控制; (3) 根据要求,将交叉引用列表添加到源程序列表中; (4) 将代码分段;设置一个段程序记数器(SPC); (5) 定义和引用全局符号; 2. 汇编器的调用 命令格式如下 asm500[input file[object file[listing file]]][-options] 其中: input file——汇编源文件名,缺省后缀为.asm; object file——编译输出的目标文件名,缺省后缀为.obj; listing file——产生的列表文件名,缺省后缀为.lst; options——编译器使用的各种选项,每个选项前面加有短横。 常用选项有: -c:编译器忽略字母的大小写。 -1:(小写的L)在编译时产生列表文件,缺省后缀为.lst。 -s:将所有的符号都放入符号表。 -x:产生一个交叉汇编表,并把它附加到列表文件的最后。 例如:asm500 example.asm -l -s -x 3. 列表文件 列表文件包括源程序的行号、段程序计数器(SPC)、目标代码和源程序4个部分。 【例4.7】 列表文件举例(example.lst部分) 10 000004 0008 .word 8,6,4,2 000005 0006 000006 0004 000007 0002 11 000000 .text ;code follows 12 000000 7728 start: STM #0,SWWSR ;adds no wait states 000001 0000 4.5.3 链接器 1. 链接器的功能 作用: 将扩展名为.obj的一个或多个COFF目标文件链接起来,生 成可执行的输出文件(.out)和存储器映像文件(.map)。 功能: (1) 将各个段配置到目标系统的存储器中; (2) 对各个符号和段进行重新定位,并给它们制定一个确定的地 址; (3) 解决输入文件之间未定义的外部引用。 2. 链接器的调用(2种方法) (1) 在命令行中制定选项和文件名。命令格式如下 lnk500 filename1 …filename n [-options] filenames 为文件名,可是目标文件、链接命令文件或文件库。 输入默认值为.obj,输出默认为.out。 -options为可选项,常用的选项有: -e global_symbol:定义程序的进入点。global_symbol必须在源程 序中,用.global伪指令说明。 -m filename:生成.map文件。 -o filename:指定生成的.out文件名。系统缺省为a.out。 例如, lnk500 file1.obj file2.obj -m prog.map -o prog.out (2)链接命令文件(扩展名为.cmd) 链接命令文件是将链接的信息放在一个文件中,这在多次使用同样的链接信息时,可以方便地调用。 另外, 在命令文件中可用两个十分有用的命令MEMORY和SECTIONS,指定实际应用中的存储器结构和进行地址的映射。而在命令行调用时不能使用这两个命令。 命令文件为ASCII文件,可包含以下内容: ① 输入文件名; ② 链接器选项; ③ MEMORY和SECTIONS链接命令; ④ 赋值说明。 【例4.8】 链接命令文件(file.cmd)的编写。 file1.obj file2.obj -m prog.map -o prog.out MEMORY { PAGE 0: EPROM :org=0E00h,len=100h PAGE 1: SPRAM :org=0060h,len=0020h DARAM :org=0080h,len=100h } SECTIONS { .text : EPROM PAGE 0 . data : EPROM PAGE 0 .bss : SPRAM PAGE 1 STACK : DARAM PAGE 1 } 3. 多个文件的链接 (1) 编写复位向量文件vectors.asm。 【例4.9】 复位向量vectors.asm。 *************************************** * Reset vectors for example.asm * *************************************** .title “vectors.asm” .ref start .sect “.vectors” rst: B start .end vectors.asm文件中引用了example.asm中的标号“start”, 这是在两个文件之间通过.ref和.def伪指令实现的。 (2) 编写example.asm,.def start是用来定义语句标号start的汇编伪指令,start是源程序.text段开头的标号,供其他文件引用。 (3) 分别对两个源文件进行汇编, example.asm和vectors.asm →example.obj和vectors.obj. (4) 编写链接命令文件example.cmd。 链接example.obj和vectors.obj →输出文件example.out, →映像文件example.map 假设目标存储器的配置如下: 程序存储器 EPROM E000h~FFFh(片内) 数据存储器 SPRAM 0060h~007Fh(片内) DARAM 0080h~017Fh(片内) 【例4.10】 链接命令文件example.cmd. vectors.obj example.obj -o example.out -m example.map -e start MEMORY { PAGE0: EPROM: org=0E000h, len=100h ECS: org=0FF80h, len=04h PAGE1: SPRAM org=0060h, len=20h DARAM org=0080h, len=100h } SECTIONS { .text :EPROM PAGE 0 .data :EPROM PAGE 0 .bss :SPRAM PAGE 1 STACK :DARAM PAGE 1 .vectors :ECS PAGE 0 } * TMS320C54x的软件开发 * 第4章 TMS320C54x的软件开发 1 TMS320C54x软件开发过程 2 汇编语言程序的编写方法 3 汇编伪指令和宏指令 4 公共目标文件格式——COFF 5 汇编源程序的编辑、汇编和链接过程 6 汇编语言程序设计 4.1 TMS320C54x软件开发过程 C编译器(C compiler) →汇编源程序 汇编器(assembler) → COFF目标文件 源文件中包括汇编语言指令、汇编伪指令以及宏指令。 链接器(linker) →可执行的COFF目标模块 调整对符号的引用,并解决外部引用的问题。它也可以接收来自文档管理器中的目标文件,以及链接以前运行时所生成的输出模块。 调试工具 → C54x 通过软件仿真程序或硬件在线仿真器的调试,最后将程序加载到用户的应用系统。 图中非阴影部分为任选: 归档器(archiver) 将一组文件(源文件或目标文件)集中为一个文档文件库。 助记符指令到代数式指令翻译器(mnemonic to algebraic translator utility) 建库工具(library-build utility) 用来建立用户自己用C语言编写的支持运行库函数。 十六进制转换工具(hex conversion utility) 绝对地址列表器(absolute lister) 交叉引用列表器(cross-reference lister) 4.2 汇编语言程序的编写方法 4.2.1 汇编语言源程序举例 包含标号区、指令区、操作数区和注释区4部分(参看3.1 ) 指令区可以写助记符指令、汇编伪指令或宏指令。 助记符指令一般用大写; 汇编伪指令和宏指令,以“.”号开始,且为小写。 【例4.1】 汇编语言程序编写方法举例 .title “example.asm” ;用双引号括起的源程序名 .mmregs ;定义存储器映射寄存器的替代符号 STACK.usect “STACK”, 10H ;在数据存储器中留出16个单元作为 ; 堆栈区,名为STACK .bss a, 4 .bss x, 4 ;在数据存储器中空出4个存储单元存放 ;变量x1,x2,x3和x4. .bss y, 1 .globalstart ;在此模块中定义,可为别的模块引用 .data ;紧跟其后的是已初始化数据 table: .word 1, 2, 3, 4 ;在程序存储器标号为table开始的8个单 .word 8, 6, 4, 2 ;元存放初始化数据 .text ;紧跟其后的是汇编语言程序正文 start: STM #0, SWWSR ;adds no wait states STM #STACK+10H,SP ;set stack pointer STM #a, AR1 ;AR1 point to a RPT #7 ;move 8 values MPD table, *AR1+ ;from program memory into ; data memory CALL SUM ;call SUM subroutine end: B end ;原地等待 SUM: STM #a, AR3 ;ar3指向a的首地址 STM #x, AR4 ;ar4指向x的自地址 RPTZ A, #3 ;累加器a清零后重复执行下条指令4次 MAC *AR3+, *AR4+, A ;乘累加后结果送入累加大a STL A, @y ;将累加器后16位结果送入y RET ;子程序返回 .end ;结束汇编,汇编器将忽略 ;此后的任何源 语句 4.2.2 汇编语言常量 C54x汇编器支持7种类型的常量: 二进制整数:最多由16个二进制数字组成,其后缀为B(或b) . 八进制整数:最多由6个八进制数字组成,其后缀为Q(或q)。 十进制整数:由十进制数字串组成 范围从-32768~32767或0~65535 十六进制整数: 最多由4个十六进制数字组成,包括0~9和字符A~F及a~f; 必须由十进制值0~9开始; 其后缀为H(或h),也可以由前缀(0x)标明。 如: 78h、0Fh、 37Ach、0x37AC 5.浮点数常量:由整数、小数点、小数部分和指数部分组成 +(-)nnn.nnnE(e)+(-)nnn 整数 小数 指数 有效的浮点数常量: 3.0、3.14、-0.314e13、+314.59e-2 6.字符常量:由单引号括住的一个或两个字符组成。它在机器内部由8位ASCII码来表示一个字符。 有效的字符常量:‘a’(内部表示为61h), ‘为D’(内部表示为2744h) 7.汇编时常量:用.set伪指令给一个符号赋值。 例如: shift .set 3 ; 将常数值3赋给符号shift LD #shift, A ; 再将3赋给A累加器 汇编器在内部把常量作为32位量。常量不能进行符号扩展。 4.2.3 汇编源程序中的字符串 字符串(character strings)是包括在双引号内的一串字符。 字符串的最大长度是变化的,由要求字符串的伪指令所规定。每个字符在内部用8位ASCII码表示。 以下是字符串的例子: “sample program”定义了一个长度为14的字符串:sample progran; “PLAN“C””定义了一个长度为7的字符串:PLAN“C”。 4.2.4 汇编源程序中的符号 符号可用于标号、常量和替代其他字符。 符号名最多可为32位字符数字串(A~Z、a~z、0~9、_和$),第一位不能是数字,字符间不能有空格; 符号对大小写敏感,如汇编器将ABC、Abc、abc认作不同的符号,用-c选项可以使汇编器不区分大小写; 符号只有在汇编程序中定义后才有效,除非使用.global伪指令声明才是一个外部符号。 DSP内部的寄存器名和$等都是汇编器已预先定义的全局符号。 4.2.5 汇编源程序中的表达式 表达式是由运算符隔开的常量、符号或常量和符号序列。 表达式值的有效范围从-32768~32767。 表达式运算符及优先级: 2. 表达式溢出 当算术运算在汇编中被执行时,汇编器将检查溢出状态。 但在作乘法时,不检查溢出状态。 3. 表达式的合法性 由于符号的属性不同(定义不同)使表达式存在合法性问题。 符号的属性分为3种:外部的、可重定位的和绝对的。 含有乘、除法的表达式中只能使用绝对符号。 4.3 汇编伪指令和宏指令 4.3.1 汇编伪指令(又称为汇编命令) 作用:给程序提供数据并且控制汇编过程。 表示:指令区以“.”号开始且为小写的为汇编伪指令。 指令数目:C54x汇编器共有64条汇编伪指令。 汇编伪指令用以形成常数和变量,当用它控制汇编和链接过程时,可以不占存储空间。 伪指令只对程序的编译过程(汇编指令—机器二进制指令)起作用,它能告诉编译器怎样正确的编译程序的某些部分,但编译出来的目标程序里不再有伪指令的任何痕迹。伪指令只是相当于一些用户自定义的编译规则,其本身不产生目标代码。所以不占用存储空间。 汇编伪指令分成8类(根据功能): 对各种段进行定义的伪指令; 对常数(数据和存储器)进行初始化的伪指令; 调整SPC(段寄存器)的指令; 输出列表文件格式伪指令; 引用其他文件的伪指令; 控制条件汇编的伪指令; 在汇编时定义符号的伪指令; 执行其他功能的伪指令。 1. 段定义伪指令(5条) 作用:把汇编语言程序的各个部分划分在适当的段中。 .bss 为未初始化的变量保留空间; .data 通常包含了初始化的数据; .sect 定义已初始化的带命名段,其后的数据存入该段; .text 该段包含了可执行的代码; .usect 在一个未初始化的有命名的段中为变量保留空间。 段是通过叠加方式来建立的。例如在汇编器第一次遇到.data伪指令时,data指令后面的语句都被汇编在.data段中(直到汇编器遇到.text和.sect伪指令为止)。如果后来又在其他的段中遇到.data指令,其后的语句继续加到.data段中。这样虽然程序中是多个.data段分散在各处,但汇编器只创建一个.data段,它可以连续地被分配到内存中。 2. 常数初始化伪指令(共有24条)和.word 把一个或多个16位数存放到当前段的连续字 中。.int为无符号整型量,.word为带符号整型量。 .byte 把一个或多个8位的值放入当前段的连续字中。该指令类似于.word,不同之处在于.word中的每个值的宽度限制为16位。 .float和.xfloat 计算以IEEE格式表示的单精度(32位)浮点数,并存放在当前段的连续字中,高位先存。.float能自动按域的边界排列,.xfloat不能。 .long和.xlong 把32位数存放到当前段连续的两个字中,高位字先存。.long能自动按长字的边界排列,.xlong 却不能。 .string和.pstring 把8位的字符从一个或多个字符串中传送到当前段中。 【例4.2】 1 0000 00aa .byte 0AAh, 0BBh 0001 00bb 2 0002 0ccc .word 0CCCh 3 0003 0eee .xlong 0EEEEFFFh 0004 efff 4 0006 eeee .long 0EEEEFFFFh 0007 ffff 5 0008 dddd .int 0DDDDh 6 0009 3fff .xfloat 1.99999 1 000a ffac 7 000c 3fff .float 1.99999 1 000d ffac 8 000e 0068 .string “help” 1 000f 0065 1 0010 006c 1 0011 0070 3. 段程序计数器(SPC)定位指令 .align 使SPC对准1字(16位)~128字的边界,这保证了紧接着该指令的代码从一个整字或页的边界开始。如果SPC已经定位于选定的边界,它就不会增加了。.align伪指令的操作数必须等于20~216之间的一个2的幂值(尽管超过27的值没有意义)。不同的操作数代表了不同的边界定位要求。 操作数为1是让SPC对准字边界; 操作数为2是让SPC对准长字(偶地址)边界; 操作数为128是让SPC对准页边界; 不带操作数时,其默认值为128,即对准页边界。 4. 输出列表格式伪指令 .title 为汇编器提供一个打印在每一页顶部的标题。 .list/.nolist 打开/关闭列表文件。使用.nolist可禁止汇编器列出列表文件中选定的源语句,使用.list则允许列表。 .mlist/.mnolist 源代码中包含着宏扩展和循环块的列表。这两条指令用来打开/关闭列表。使用.mlist把所有的宏扩展和循环块打印到列表中,用.mnolist则禁止列入列表。 .sslist/.ssnolist 分别允许/禁止替换符号扩展到列表,在调试替换符号的扩展时很有用。 .page 在输出列表中产生新的一页。 .option 控制列表文件中的某些特性。 5. 引用其他文件的伪指令 .def 确认一个在当前模块中定义的且能被其他模块使用的符号,汇编器把这个符号存入符号表中。 .ref 确认一个在当前模块中使用但在其他段中定义的符号。汇编器把这个符号标注成一个未定义的外部符号,且把它装入目标符号表中,以便链接器能还原它的定义。 .global 表明一个外部符号,使其他模块在连接时可以使用。如果在当前段定义了该符号,那么该符号就可以被其他模块使用,与.def功能相同;如果在当前段没有定义该符号,则使用了其他模块定义的符号,与.ref功能相同。一个未定义的全局符号只有当它在程序中使用的时候,链接器才对其进行处理。y/.include 伪指令告诉汇编器开始从其他文件中读源语句。当汇编读完以后,继续从当前文件中读源语句。从.copy文件中读的语句会打印在列表中,而从.include文件中读的语句不会打印在列表中。 .mlib 向汇编器提供一个包含了宏定义的文档库的名称。当汇编器见到一个在当前库中没有定义的宏,就在.mlib确认的宏库中查找。 6. 控制条件汇编的伪指令 .if/.elseif/.else/.endif 这些指令告诉汇编器,根据表达式的值条件汇编一块代码。.if 表示一个条件块的开始,如果条件为真就汇编紧接着的代码;.elseif是表示如果.if的条件为假,而.elseif的条件为真,就汇编紧接着的代码;.endif结束该条件块。 .loop/.break/.endloop 告诉汇编器按照表达式的值循环汇编一块代码。.loop标注一块循环代码的开始;.break告诉汇编器当表达式为假时,继续循环汇编,当表达式为真时,立刻转到.endloop后的代码去执行;.endloop标注一个可循环块的末尾。 7. 在汇编时定义符号的伪指令 作用:汇编时的定义符号指令是使有意义的符号名与常数值或字符串相等同。 .asg 规定一个字符串与一个替代符号相等,并将其存放在替代符号表中。当汇编器遇到一个替代符号,就用对应的字符串来代替这个符号。替代符号可以重新定义。 .eval 计算一个表达式的值并把结果传送到与一个替代符号等同的字符串中。该指令在处理计数器时非常有用。el 定义一个专门的符号以表示当前段内装入时的地址,而不是运行时的地址。 .set/.equ 把一个常数值等效成一个符号,存放在符号表中,且不能被清除。 8. 其他方面的汇编伪指令 .end 结束汇编。它是一个程序的最后一个源语句。 .mmregs 定义存储器映射寄存器的替代符号。对于所有的存储器映射寄存器,使用该指令和执行一个.set是一样的。 .algebraic 告诉编译器程序包含了算术汇编源代码。如果没有使用-mg编译器选项,该指令必须出现在文件的第一行。lock 使局部标号复位。局部标号是$n或name?形式的符号。当它们出现在标号域中时,就对它们进行定义。局部标号是可以用来作为jump指令操作数的临时标号。.netblock在局部标号使用后对其复位,从而限制它的范围。 .version 决定指令所运行的处理器。每一种C54x芯片都有自己的值。 4.3.2 宏及宏的使用 作用:程序中的子程序往往要多次使用,此时,可将该子程序定义为一个宏。在程序反复执行该子程序时就调用这个宏,从而避免多次重复使用该子程序的源语句。 ①宏语言的功能包括: 定义自己的宏和重新定义已存在的宏; 简化较长的或复杂的汇编代码; 访问归档器创建的宏库; 处理一个宏中的字符串; 控制宏扩展列表。 ②如果想多次调用一个宏,而每次使用的是不同的参数,可以在宏里指定参数。 ③宏的使用可分为3个过程:定义宏、调用宏和展开宏。 1. 定义宏:有两种方法 (1) 宏可以在源文件起始处或者在.include/.copy文件中定义。格式 宏名 .macro[参数1],[…],[参数n] 汇编语句或宏指令it] .endm 宏名——定义的宏名如果与某条指令或已有的宏定义重名,就将代替它们; 汇编语句——每次调用宏时执行的汇编语言指令或汇编伪指令; 宏指令——用来控制展开宏; [.mexit]——功能类似于goto .endm语句,该项为可选项; .endm——结束宏定义; 注释——注释前加一感叹号“!”,表示该注释包括在宏定义中,而又不出现在 宏展开中;若注释前加星号或分号,表示让注释出现在宏展开中。 (2) 在宏库中定义宏 ①宏库由归档器创建,是采用归档格式的文件集合。 ②归档文件(宏库)里的每一个文件都包含着一个与文件名相对应的宏定义; 宏名与文件名必须相同; 宏库中的文件必须是未被汇编过的源文件,其扩展名是.asm。 ③可以使用.mlib指令访问宏库。其语法为 .mlib 宏库文件名 2. 调用宏 在源程序中通过把宏名作为操作数来调用宏。其格式为 宏名 [参数1],[…],[参数n] 3. 展开宏 ①当源程序调用宏时,编译器会将宏展开。 ②在展开期间,编译器把自变量传递给宏参数,用宏定义来代替宏调用语句并对源代码进行编译。 ③在默认状态下,宏展开会在指令列表文件中列出,可以使用.mnolist指令关掉宏指令列表。 【例4.3】 宏定义、宏调用和宏展开举例(部分程序)。 DAT0 .set 60h ;把一个常数值等效成一个符号 DAT1 .set 61h ;表示地址 DAT2 .set 62h DAT3 .set 63h .text ADD3 .macro P1, P2, P3, ADDRP ; 宏定义:三数相加 ;ADDRP = P1 + P2 + P3 LD P1, A ADD P2, A ADD P3, A STL A, ADDRP .endm * TMS320C54x的软件开发 * *

  2024年企业人力资源管理师之二级人力资源管理师模拟考试试卷A卷含答案完整版720780578.pdf

  2024年检验类之临床医学检验技术(师)全真模拟考试试卷B卷含答案优质 完整版720844645.pdf

  2024年四川省成都市第七中学初中学校中考一模物理试题(解析版).pdf

  2024年二级建造师之二建水利水电实务过关检测试卷B卷附答案 .pdf

  2024年教师资格之中学思想品德学科知识与教学能力综合检测试卷A卷含完整版720848701.pdf

  2024年教师信息技术2.0教研组研修计划(优秀模板6篇)(6) .pdf

  2024年心理咨询师之心理咨询师基础知识通关提分题库及完整答案完整版720794806.pdf

  2024年消防设施操作员之消防设备初级技能题库附答案(典型题).pdf

  专题解密(一) 陌生的化学(离子)方程式书写(实战演练)-【高考引领教学】2023届高考化学一轮针对性复习方案(全国通用)(解析版).docx

  2024年学校教师校本培训专题学习PPT:弘扬教育家精神做新时代好老师.pptx

  原创力文档创建于2008年,本站为文档C2C交易模式,即用户上传的文档直接分享给其他用户(可下载、阅读),本站只是中间服务平台,本站所有文档下载所得的收益归上传人所有。原创力文档是网络服务平台方,若您的权利被侵害,请发链接和相关诉求至 电线) ,上传者

Copyright © 2018-2023 平博PINNACLE集团有限公司 版权所有
电 话:18950259620    手 机:18950259620   传 真:18950259620    E-mail:620@qq.com
地 址:福建省福州市鼓楼区洪山镇首凤路1号2#楼113室
闽ICP备19017801号-1

扫一扫关注微信公众帐号

免费咨询 投诉建议