第5章_汇编程序举例2_第1页
第5章_汇编程序举例2_第2页
第5章_汇编程序举例2_第3页
第5章_汇编程序举例2_第4页
第5章_汇编程序举例2_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

第五章汇编程序设计 顺序结构分支结构循环结构 汇编语言程序的基本结构 1 堆栈的设置2 数据传送3 算术运算指令举例 一 顺序结构 乘 加运算 小数乘法运算 除法运算 第5章TMS320C54x汇编语言程序设计 1 1堆栈的使用方法 当程序调用中断服务程序或子程序时 需要将程序计数器PC的值和一些重要的寄存器值进行压栈保护 以便程序返回时能从间断处继续执行 C54x提供一个用16位堆栈指针SP寻址的软件堆栈 当向堆栈中压入数据时 堆栈是从高地址向低地址方向填入 堆栈指针SP先减1 然后将数据压入堆栈 当从堆栈中弹出数据时 数据先从堆栈中弹出 然后堆栈指针SP加1 第5章TMS320C54x汇编语言程序设计 1 2堆栈的使用方法 1 堆栈的设置 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 第5章TMS320C54x汇编语言程序设计 2 堆栈区大小的确定 先开辟一个较大的堆栈区 用已知数充填 如 LD 9224 BSTM length AR1MVMMSP AR4loop STLB AR4 BANZloop AR1 堆栈区的大小可以按照以下步骤来确定 堆栈区要充填的数0DBF8h加载B 设置循环次数 设置数据指针AR4 SP AR4 循环 充填数据 DBF8 DBF8 DBF8 DBF8 DBF8 DBF8 AR4 第5章TMS320C54x汇编语言程序设计 先开辟一个较大的堆栈区 用已知数充填 堆栈区的大小可以按照以下步骤来确定 6B14 0013 SP 运行程序 执行所有堆栈操作 检查堆栈中的数值 7AB3 用过的堆栈区就是实际需要的堆栈空间 用过的栈区 第5章TMS320C54x汇编语言程序设计 1 2数据传送 重复执行MVPD指令 可以实现程序存储器至数据存储器的数据传送 在系统初始化过程中十分有用 例5 6 1 数组x 5 1 2 3 4 5 初始化 bssx 5 dataTBL word1 2 3 4 5 textSTART STM x AR5RPT 4MVPDTBL AR5 第5章TMS320C54x汇编语言程序设计 例 编写一段程序将数据存储器中的数组X 20 复制到数组Y 20 中 bssx 20 bssy 20 STM x AR2STM y AR3RPT 19MVDD AR2 AR3 第5章TMS320C54x汇编语言程序设计 1 3算术运算程序 基本算术运算包括 加减法和乘法运算除法运算长字和并行运算 例 编写完成y aixi i 1 20 采用单操作数方法 LD 0 BSTM a AR2STM x AR3STM 19 BRCRPTBDone 1LD AR2 TMPY AR3 A ADDA BDone STHB ySTLB y 1 采用双操作数的方法 LD 0 BSTM a AR2STM x AR3STM 19 BRCRPTBDone 1MPY AR2 AR3 A ADDA BDone STHB ySTLB y 1 进一步优化的程序 STM x AR2STM a AR3RPTZA 19MAC AR2 AR3 ASTHA ySTLA y 1 第5章TMS320C54x汇编语言程序设计 例5 4 3 计算y 程序 example asm title example asm mmregsstack usect STACK 10h bssa 4 bssx 4 bssy 1 defstart data 为堆栈指定空间 为变量分配9个字的空间 第5章TMS320C54x汇编语言程序设计 例5 4 3 计算y 程序 table word1 2 3 4 word8 6 4 2 textstart STM 0 SWWSRSTM STACK 10h SPSTM a AR1RPT 7MVPDtable AR1 CALLSUMend Bend 变量初始化 插入0个等待状态 设置堆栈指针 AR1指向a 移动8个数据 从程序存储器到数据存储器 调用SUM子程序 第5章TMS320C54x汇编语言程序设计 例5 4 3 计算y 程序 SUM STM a AR3STM x AR4RPTZA 3MAC AR3 AR4 ASTLA yRET end 子程序执行 第5章TMS320C54x汇编语言程序设计 例5 4 4 求4项乘积aixi i 1 2 3 4 中的最大值 并存放累加器A中 程序 STM a AR1STM x AR2STM 2 AR3LD AR1 TMPY AR2 Aloop1 LD AR1 TMPY AR2 BMAXABANZloop1 AR3 ai首地址a给AR1 xi首地址x给AR2 设置计数器AR3 2 取系数T ai 并修改AR1 乘法运算A aixi 并修改AR2 取系数T ai 并修改AR1 乘法运算B aixi 并修改AR2 求A和B中的最大值 若AR3 0 则循环 并修改AR3若AR3 0 则不循环 二 分支结构 汇编语言中程序的分支是由条件转移指令实现的 C54xCPU以累加器A B及标志位C TC OVA OVB等状态最为条件 判断程序是否转移 这些指令见第三章 例 比较两数data0和data1的大小 若两者相等 将值存入data2单元 否则将大者存入data2单元 思路1 使用SUB指令 data0 set200data1 set100 bssdata2 1 textLD data0 ASUB data1 A data0 data1BCd1 ALT data0 data1时转入d1ST data0 data2 将data0存入data2BDloopNOPNOPd1 ST data1 data2 将data1存入data2loop NOP end 例 比较两数data0和data1的大小 若两者相等 将值存入data2单元 否则将大者存入data2单元 思路2 使用CMPS指令 data0 set200data1 set100 bssdata2 1 textLD data0 16 A 将data0送入A 31 16 ADD data1 A 将data0送入A 15 0 CMPSA data2 比较 选择 存储大者 end 三 循环结构 在程序设计中 如果有一段程序需要多次重复执行时 就可以使用循环结构 以提高效率 简化程序 循环程序通常有4部分组成 a 置循环初值 包括循环次数 置存储区的地址指针 置其他变量的初值等 b 循环体 是程序中需要多次重复的部分 c 循环控制部分 每循环一次 检查结束条件是否满足 若满足 循环结束 否则继续循环 d 修改控制变量 每进行一次循环 将控制变量加一或减一 第5章TMS320C54x汇编语言程序设计 3 1循环操作程序 在程序设计时 经常需要重复执行某一段程序 利用BANZ 当辅助寄存器不为0时转移 指令可实现循环计数和操作 循环操作指令 BANZ转移地址 辅助寄存器指令功能 当辅助寄存器不为0时 则转至转移地址 否则顺序执行 第5章TMS320C54x汇编语言程序设计 例5 3 4 bssx 10 给x保留10个空间 bssy 1 给y保留1个空间STM x AR1 设置数据段的首地址STM 9 AR2 设置循环计数值LD 0 A 累加器清0loop ADD AR1 A 累加运算 并修改地址BANZloop AR2 若计数值不为0 则循环 并计数值减1若计数值为0 则结束循环STLA y 累加和存入y中 用AR2作为循环计数器 由BANZ实现程序的循环控制 注意 BANZloop AR2 先判断 再修正AR2 AR2 1 第5章TMS320C54x汇编语言程序设计 3 2重复操作程序 C54x的重复操作是使CPU重复执行一条指令或一段指令 可以分为单指令重复和块程序重复 实现重复操作的指令 RPT 重复下条指令 RPTZ 累加器清0 并重复下条指令 RPTB 块重复指令 使用RPT RPTZ能重复下一条指令 而RPTB用于重复代码块若干次 利用重复指令可实现比BANZ指令更快的循环程序 第5章TMS320C54x汇编语言程序设计 5 5 2块程序重复操作 对于整个程序块需要重复操作时 可采用程序块重复操作 用于块程序重复操作指令为RPTB和RPTBD 程序块的长度由块程序重复指令RPTB的操作数来确定 而重复次数由块重复计数器BRC来决定 通常RPTB的操作数为程序块的结束地址 而重复次数可用STM指令对BRC进行设定 第5章TMS320C54x汇编语言程序设计 块重复操作的特点 程序块的起始地址RSA是RPTB指令的下一行 块结束地址REA由RPTB指令的操作数规定 对程序块进行重复操作时 不论程序块多长 重复次数多大 所用的机器周期为0 与单指令重复操作不同 块重复操作可以响应中断 第5章TMS320C54x汇编语言程序设计 例5 5 2 对数组x 8 中的每一元素加1 bssx 8begin LD 1 16 BSTM 7 BRCSTM x AR4RPTBnext 1ADD AR4 16 B ASTHA AR4 next LD 0 B 设置数组空间 立即数1送入BH 设置重复次数 BRC 7 循环8次 数组首地址x送入AR4 设置循环结束地址 数组数据左移16位与BH相加 存入数组结果 并修改地址 B清0 注意 块结束地址REA通常取程序块最后一条指令的下一条指令地址 1 重复次数为7次 RPTB指令可以响应中断 第3章TMS320C54x的指令系统 3 2重复操作指令 程序块重复操作可以使紧随RPTB指令之后的程序块重复执行 块起始地址 RSA RPTB指令的下一行 块结束地址 REA 由RPTB指令的操作数给出 块重复执行次数 由块重复计数器BRC的内容来确定 第5章TMS320C54x汇编语言程序设计 例5 5 2 三重循环嵌套程序 STM L 1 AR7 2T1st 外部STM M 1 BRC 2TRPTB2nd 1 4T中间中间RPT N 1 1T内部中间中间2nd 外部外部BANZ1st AR7 4T 内层 中层 外层 第5章TMS320C54x汇编语言程序设计 3 3循环嵌套 三重循环嵌套结构 内层中层外层 RPT RPTB BANZ 执行N次 执行M次 执行L次 第5章TMS320C54x汇编语言程序设计 4 算术运算程序 4 1长字运算和并行运算 长字指令 DLDLmem dstDSTsrc LmemDADDLmem src dst DSUBLmem src dst DRSUBLmem src dst 1 长字运算 dst Lmem单周期 Lmem src双周期 dst src Lmem单周期 dst src Lmem单周期 dst Lmem src单周期 C54x可以利用32位长操作数进行长字运算 第5章TMS320C54x汇编语言程序设计 1 长字运算 1 偶地址排列 如 DLD AR3 A 执行前 A AR3 高字 低字 执行后 A AR3 6CAC 0101 BD90 0102 指令中给出的地址为偶地址 则存储器低地址存放高16位操作数 第5章TMS320C54x汇编语言程序设计 1 长字运算 1 偶地址排列 例5 4 5 偶地址排列法举例 bssa 2 bssy 2 datatable word06CACH 0BD90H text STM a AR1RPT 1MVPDtable AR1 STM a AR3DLD AR3 A 执行前 A 0000000000hAR3 0100h 0100h 6CACh 高字 0101h BD90h 低字 执行后 A 006CACBD90hAR3 0102h 0100h 6CACh 0101h BD90h 第5章TMS320C54x汇编语言程序设计 1 长字运算 2 奇地址排列 如 DLD AR3 A 执行前 A AR3 低字 高字 执行后 A BD90 6CAC AR3 0102 0103 指令中给出的地址为奇地址 则存储器低地址存放低16位操作数 第5章TMS320C54x汇编语言程序设计 1 长字运算 2 奇地址排列 例5 4 6 奇地址排列法举例 bssa 2 bssy 2 datatable word06CACH 0BD90H text STM a AR1RPT 1MVPDtable AR1 STM a AR3DLD AR3 A 执行前 A 0000000000hAR3 0101h 0100h 6CACh 低字 0101h BD90h 高字 执行后 A 00BD906CAChAR3 0103h 0100h 6CACh 0101h BD90h 第5章TMS320C54x汇编语言程序设计 例5 4 7 计算Z32 X32 Y32 标准运算 bssxhi 1 bssxlo 1 bssyhi 1 bssylo 1 bsszhi 1 bsszlo 1 LD xhi 16 AADDS xlo AADD yhi 16 AADDS ylo ASTHA zhiSTLA zlo LD xhi 16 A X31 X160000 ADDS xlo A X15 X0 X31 X16X15 X0 ADD yhi 16 A Y31 Y160000 Z31 Z16X15 X0 ADDS ylo A Y15 Y0 Z31 Z16Z15 Z0 STHA zhi STLA zlo 6字 6T 第5章TMS320C54x汇编语言程序设计 例5 4 7 计算Z32 X32 Y32 标准运算 LD xhi 16 AADDS xlo AADD yhi 16 AADDS ylo ASTHA zhiSTLA zlo6字 6T 长字运算 bssxhi 2 1 1 bssyhi 2 1 1 bsszhi 2 1 1 DLD xhi ADADD yhi ADSTA zhi DLD xhi A X31 X16X15 X0 DADD yhi A Y31 Y16Y15 Y0 Z31 Z16Z15 Z0 DSTA zhi 3字 3T 第5章TMS320C54x汇编语言程序设计 2 并行运算 并行运算就是同时利用D总线和E总线 通过并行指令来实现数据的加载和算术运算 D总线用来执行加载或算术运算 E总线用来存放先前的结果 并行指令 并行加载和乘法指令 并行加载和存储指令 并行存储和乘法指令 并行存储和加 减指令 第5章TMS320C54x汇编语言程序设计 2 并行运算 LD MAC R LD MAS R 例如 LDXmem dst1 MAC R Ymem dst2 功能 dst1 Xmem 16 dst2 dst2 T Ymem 并行加载和乘法指令 第5章TMS320C54x汇编语言程序设计 2 并行运算 ST LD例如 STsrc Ymem LDXmem dst功能 Ymem src 16 ASM dst Xmem 16 并行加载和存储指令 第5章TMS320C54x汇编语言程序设计 2 并行运算 ST MPYST MAC R ST MAS R 例如 STsrc Ymem MAC R Xmem dst功能 Ymem src 16 ASM dst dst T Xmem 并行存储和乘法指令 第5章TMS320C54x汇编语言程序设计 2 并行运算 ST ADDST SUB例如 STsrc Ymem ADDXmem dst功能 Ymem src 16 ASM dst dst Xmem 并行存储和加 减指令 第5章TMS320C54x汇编语言程序设计 2 并行运算 注意并行指令均为单字单周期指令 并行指令先存储 后加载或算术运算 并行指令的操作均在累加器的高位中进行 并且大多数指令受ASM位的影响 第5章TMS320C54x汇编语言程序设计 2 并行运算 例5 4 8 编写计算z x y和f e d的程序 bssx 3 bssd 3STM x AR5STM d AR2LD 0 ASMLD AR5 16 AADD AR5 16 ASTA AR5 LD AR2 BADD AR2 16 BSTHB AR2 bssx 3 bssd 3 STM x AR5 LD 0 ASM LD AR5 16 A ADD AR5 16 A STA AR5 LD AR2 B ADD AR2 16 B STHB AR2 STM d AR2 第5章TMS320C54x汇编语言程序设计 4 3小数运算程序 在定点DSP芯片中 采用定点数进行数值运算时 若操作数采用整型数 则DSP芯片给定的字长 一般16位 决定了整型数的最大范围 通常 定点DSP采用小数乘法 其原因 乘法器为16位 对于大于16位的数据难以实现乘法递推 且乘积占用存储资源大 小数乘法时 既可以存储32位乘积 也可以存储高16位乘积 可用较少的资源保存结果 小数乘法便于乘法递推 第5章TMS320C54x汇编语言程序设计 1 数的定标 采用小数运算时 设定小数点在16位中的位置称为定标 小数点在16位数中的位置不同 可以表示不同大小和不同精度的小数 数的定标通常有Q表示法 如Q0 Q1 Q15 Q越大 可以表示的数的范围越小 但精度越高 在具体的定点程序中 必须根据具体情况适当选择合适的定标 第5章TMS320C54x汇编语言程序设计 2 小数的表示方法 C54x采用基于2的补码小数表示形式 每个16位数用1个符号位 最高位 i个整数位 15 i个小数位来表示 采用2的补码小数 Q15格式 其位权值为 MSB LSB 1 2 12 22 3 2 15 例如 00000010 10100000 21 2 1 2 3 2 625 第5章TMS320C54x汇编语言程序设计 2 小数的表示方法 2的补码小数表示方法 将十进制小数乘以32768 并将整数乘积转换成16进制数 正数 乘以32768 整数转换成16进制数 负数 其绝对值乘以32768 整数取反加1 第5章TMS320C54x汇编语言程序设计 2 小数的表示方法 如 1 7FFFH0 5 4000H0 25 2000H0 0000H 0 25 E000H 0 5 C000H 1 8000H 1 32768 7FFFH0 5 32768 4000H0 25 32768 2000H0 32768 0000H 0 25 32768 补 E000H 0 5 32768 补 C000H 1 32768 补 8000H 注意 汇编时 不能直接写成十进制小数 如 0 907 word32768 907 1000 第5章TMS320C54x汇编语言程序设计 3 小数乘法与冗余符号位 小数乘法实例 0 5 0 375 0 1875 0100 0 5 1101 0 375 0100 0000 0100 1100 0100 1110100 0 1875 字长为4位累加器8位 第5章TMS320C54x汇编语言程序设计 3 小数乘法与冗余符号位 乘积 0 1875 11101007位二进制 扩展8位后 乘积 11110100 0 09375 出错原因 两带符号数相乘 其结果带有2个符号位 Sxxx Q3格式 Syyy Q3格式 SSzzzzzz Q6格式 解决办法 运算结果左移一位 消去多余符号位 可通过对FRCT位置1 乘法器自动将乘积结果左移一位 如 11110100左移1位 11101000结果 0 1875 第5章TMS320C54x汇编语言程序设计 3 小数乘法与冗余符号位 在小数乘法编程时 应事先设置FRCT位 如 SSBXFRCTMPY AR2 AR3 ASTHA Z完成了Q15 Q15 Q15的小数乘法 第5章TMS320C54x汇编语言程序设计 例5 7 1 编制计算的程序 a1 0 3a2 0 2a3 0 4a4 0 1x1 0 6x2 0 5x3 0 1x4 0 2 bssa 4 bssx 4 bssy 1 datatable word3 32768 10 word2 32768 10 word 4 32768 10 word1 32768 10 word6 32768 10 word5 32768 10 word 1 32768 10 word 2 32768 10 a x y 第5章TMS320C54x汇编语言程序设计 a x y textstart SSBXFRCTSTM x AR1RPT 7MVPDtable AR1 STM x AR2STM a AR3RPTZA 3MAC AR2 AR3 ASTHA y done Bdone 第5章TMS320C54x汇编语言程序设计 4 5除法运算 在 C54x中没有除法器硬件 也没有专门的除法指令 但是 利用条件减法指令 SUBC 和重复指令 RPT 可实现两个无符号数的除法运算 条件减法指令 SUBCSmem src功能 src Smem 15 ALU输出端若ALU输出 0 则 ALU输出 1 1 src否则 src 1 src 重复指令 RPT K功能 RC K 重复执行下条指令K

温馨提示

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

评论

0/150

提交评论