




已阅读5页,还剩71页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章讲述如何进行汇编程序设计和汇编与C语言混合编程的一些知识 第五章程序设计 程序的控制和转移 堆栈的使用基本运算 加法 减法 乘法数据块传送双操作数乘法除法运算浮点运算汇编与C的混合编程 程序的控制和转移 基本程序控制指令 条件操作循环操作比较操作 基本程序控制指令 基本程序控制指令主要分为 分支转移指令 子程序调用指令和子程序返回指令 分支指令与子程序调用的区别 分支转移指令只是通过改变PC来改变程序运行流向 无堆栈操作 子程序调用指令是首先将返回地址压入堆栈 再执行子程序 在子程序的最后执行返回指令 将返回地址出栈并加载pc 同时复原堆栈指针 程序控制与转移 基本程序控制指令条件操作 循环操作比较操作 条件操作所使用的条件算符 条件分支指令或条件调用指令 条件返回指令都属于条件操作 条件算符分为两组 每组又分为几类 第一组 组内可以对同一累加器的两类条件可以进行 与 逻辑运算 第二组 可以对三类条件同一性质的条件进行组合 如都是位有效 或都是位无效 只有BIO是反逻辑 其它都是1有效 0无效 条件操作举例 条件分支种类很多 例如 RCTC 条件返回 表示若TC 1 则子程序返回 否则继续执行 CCsub BNEQ 条件调用 表示若累加器B不等于0 则调用sub子程序 BCnew AGT AOV 与关系的条件分支操作 如果A 0且A溢出 则跳转到new行语句 否则顺序执行 BCnew AGTBCnew AOV 或关系的逻辑分支操作 循环控制 基本程序控制指令条件操作循环操作 比较操作 循环操作 BANZ 由BANZ构成的循环单指令重复块重复操作循环的嵌套 循环操作 BANZ BANZ指令格式 BANZ D pmad Sind 表示辅助寄存器Sind不为 就跳转到pmad行语句 否则顺序执行下面语句 Sind在这里只是表示一种条件 形式与寻址相同 但不进行寻址 BANZ例子 如 计算 bssx 5 定义数组型变量 从x0到x4 bssy 1 定义变量ySTM x AR1 将变量x的开始地址送给AR1STM 4 AR2 将立即数4送给AR2LD 0 A 将累加器A清零loop ADD AR1 A 依次累加变量x中的所有单元BANZloop ar2 连续执行5次 每次AR2的 数值减1 直到AR2中数值为0时跳出循环 STLA y 存储结果 循环操作 单指令重复 由BANZ构成的循环单指令重复块重复操作循环的嵌套 单指令重复 种类 有RPT和RPTZ两条指令指令格式 PRT n 将该指令后面的指令重复执行n 1次RPTZA n 在重复执行前 将累加器A清零使用寄存器 该指令使用16位RC寄存器 最大重复次数为65536 即设置的n的最大值为65535 优点 重复操作可以使乘法 累加 数据块传送等多周期指令转化为单周期指令来提高执行速度 如 RPT 99 重复执行100次MVPD指令MVPDPmad Smem注意 单指令重复过程中不能响应中断 循环操作 块重复 由BANZ构成的循环单指令重复块重复操作循环的嵌套 块重复操作 控制块重复操作主要有3个寄存器 块重复计数器 BRC 块重复起始地址 RSA 和块重复结束地址寄存器 REA 如 STM 99 BRC 设置循环次数100RPTBNEXT 1 设置REA块循环开始语句 RSA等于此行地址 块循环结束语句 REA等于此行地址NEXT 块循环后面的第一条语句程序进入循环时 置BRAF 块循环操作标志 1 每次执行到REA地址时 若BRC不为0 则重新转到RSA进行执行 同时BRC自动减1 若BRC等于0 则置BRAF 0 结束块循环 注意 块循环操作不能嵌套 但可以响应中断 循环操作 循环的嵌套 由BANZ构成的循环单指令重复块重复操作循环的嵌套 循环的嵌套 从前面的学习我们知道 单指令重复 块循环都不能嵌套使用 但我们在编程时往往要使用多重循环 我们可以采用 内层使用单指令重复 次外层使用块重复 最外层使用BANZ循环的方法来实现多重循环 BANZ循环可以嵌套使用 只是使用不同的辅助寄存器 下面是一个单指令重复指令又外加循环嵌套的例子 循环的嵌套例子 LD 0 ASTM L 1 AR7LOOP STM M 1 BRCRPTBNEXT 1RPT N 1ADD 1 A 主循环语句NEXT NOPBANZLOOP AR7 主循环体语句被执行L M N次见程序5 4例子 程序控制与转移 基本程序控制指令条件操作循环操作比较操作 比较操作 将数据进行比较就要用到比较指令 CMPR用于测试AR1 AR7与AR0中的无符号数 条件满足则置TC 1 指令格式 CMPRCC ARx CC为2位操作码 ARx表示除AR0以外的辅助寄存器 比较中使用的条件如下表所示 下面例子是使用用CMPR和BC指令构建的循环结构 STM 0 AR1STM 10 AR0LOOP MAR AR1 AR1 AR1 1 辅助寄存器加1 循环开始 循环体结束CMPRLT AR1 ifAR1小于AR0thenTC 1BCLOOP TC if TC 1 thenBLOOP 因此循环体共被循环了10次循环嵌套例子见讲义配套例程5 1 本章主要内容 程序的控制和转移堆栈的使用 基本运算 加法 减法 乘法数据块传送双操作数乘法长字运算小数运算除法运算浮点运算汇编与C的混合编程 堆栈的使用 C54x提供一个16位堆栈指针 SP 用来指向栈顶位置 注意 C54x的堆栈是负向增长的 堆栈的设置格式 symbol setvalue 定义符号常量如 size set100 size 100STACK usect STK size 设置未初始化段 地址为STACK 段名为STK 为堆栈段保留100个连续单元 地址用于段引用 名字用于段输出定位 STM STACK SIZE SP 设置堆栈指针堆栈的操作 例子见5 1只要有子程序调用 无论是常规子程序还是中断子程序 都要使用堆栈来保存返回地址 如常规子程序调用和返回对堆栈的操作如下 CALLpmad SP 1SP PC 2TOS pmadPCRET TOS PC SP 1SP 本章主要内容 程序的控制和转移堆栈的使用基本运算 加法 减法 乘法 数据块传送双操作数乘法长字运算小数运算除法运算浮点运算汇编与C的混合编程 基本运算 DSP即数字信号处理器 它支持许多快速算法 在运算中自然也离不开基本运算 下面我们来看一个程序 该程序执行以下功能1 计算z a b c2 计算z a b c3 计算z a0 b0 a1 b14 计算z 5 找出小xi yi乘积项的最大值结合讲义配套例程5 3程序 要读懂并学会编写简单运算程序 本章主要内容 程序的控制和转移堆栈的使用基本运算 加法 减法 乘法数据块传送 双操作数乘法长字运算小数运算除法运算浮点运算汇编与C的混合编程 数据块传送指令 1 主要使用指令有 数存与数存之间 注意dmad和SmemMVDKSmem dmad 目的操作数使用绝对寻址MVKDdmad Smem 源操作数使用绝对寻址MVDDXmem Ymem数存与MMR之间 数存单元操作数只能绝对寻址MVDMdmad MMR MVMDMMR dmadMVMMMMR MMR 数据块传送 1 主要使用指令有 数存与程存之间 对程存单元使用绝对寻址或累加器寻址方式 MVPDpmad SmemMVDPSmem pmadREADASmemWRITASmem2 数据块传送指令特点 传送速度快 不使用累加器 还可以寻址程序存储器 可以运行于单指令重复方式 例 RPT 99MVDD AR2 AR3 将 ar2 ar3 完成数存复制 本章主要内容 程序的控制和转移堆栈的使用基本运算 加法 减法 乘法数据块传送双操作数乘法 长字运算小数运算除法运算浮点运算汇编与C的混合编程 双操作数乘法 1 在C54x中允许在同一个机器周期内同时使用两条16位数据总线 CB总线和DB总线 来寻址两个不同的数存单元 可以完成乘法 乘加等操作 2 以下是乘法操作的两个例子比较 运算y mx b单操作数方法双操作数乘法LD m T1 1MPY ar2 ar3 A1 1MPY x A1 1ADD b A1 1ADD b A1 1STLA y1 1STLA y1 1共使用4 43 33 优点 采用双操作数乘法运算时占用程序空间少 运算快 双操作数乘法 4 注意 1 在双寻址操作数运算中 若采用间接寻址方式来寻址 此时所用的辅助累加器只能选用AR2 AR5 2 寻址方式只能选择 ARn ARn ARn ARn 0 5 双操作数乘法所使用指令 双操作数乘法举例 例如 编写y 参见例5 6程序 bssx 20 bssa 20 bssy 2 text 给x a赋初值STM x AR2STM a AR3STM y AR0RPTZA 19MAC AR2 AR3 ASTHA AR0 STLA AR0 本章主要内容 程序的控制和转移堆栈的使用基本运算 加法 减法 乘法数据块传送双操作数乘法长字运算 小数运算除法运算浮点运算汇编与C的混合编程 长字运算与并行运算 2 长字指令 1 长字指令有 只有DST指令是双周期指令 两次使用EB 其余均为单周期指令 都是同时使用CB DB总线 长字运算与并行运算 2 偶地址排列法 指令中给出的地址是偶地址 按照先高16位存放在偶地址空间 低16位存放在奇地址空间的方法 偶地址 1 例如 常量定义方法 long12345678h 偶地址中装载1234h奇地址中装载5678h变量定义方法 如在数据段中定义一个开始于偶地址的多字长的变量 bssxhi 2 1 1 变量名字长页相邻偶地址排列法 3 奇地址排列法 指令中给出的地址是奇地址 存储器高16位存放在奇地址空间 低16位存放在奇地址空间的方法 奇地址 1 奇地址排列法不推荐使用 长字运算与并行运算 4 计算Z32 X32 Y32单字长算法 共6字 6T 长字算法 共3字 4T LD Xhi 16 A1 1DLD Xhi A1 1ADDS Xlo A1 1 A A uns Smem DADD Yhi A1 1ADD Yhi 16 A1 1DSTA Zhi1 2ADDS Ylo A1 1STHA Zhi1 1STLA Zlo1 1 长字运算与并行运算 1 并行运算 要求能读懂 不要求会编程 并行运算是同时使用DB和EB DB用来执行加载或算术运算 EB用来存储 并行指令主要有四类 注意 1 公式中无 R 为基本指令 有R表示有舍入2 注意并行指令中的LD与ST同单指令的LD和ST不同 隐含着移位操作 长字运算与并行运算 略讲 并行指令主要有四类 例如 编写z x y和f e d程序段 bssx 1 bssy 1 bssz 1 bssd 1 bsse 1 bssf 1STM x AR5STM d AR2LD 0 ASM 不使用asm进行移位LD AR5 16 AADD AR5 16 ASTA AR5 保存在z中p233 LD AR2 B 同时将变量d加载到累加器BHADD AR2 16 BSTHB AR2 并行指令同时执行节省时间 3 64位加法和减法运算教材上排列是奇地址方式编写计算Z64 W64 X64 Y64如果单元顺序为W0 W1 W2 W3的话 两个32位数分别是W2W3 W0W1 高位在前 偶地址排列 bssW 4 1 1 定义变量W 共4字长 页相邻 偶地址排列 bssX 4 1 1 bssY 4 1 1 bssZ 4 1 1 变量初始化DLD W A 将W0W1加载到ADADD X A A A X0X1DLD W 2 B 将W2W3加载到BADDC X 3 B B B X3 CADD X 2 16 B B B X2 16 DSUB Y A A A Y0Y1 可能产生借位CDSTA Z 保存累加器A的结果 Z的低32位SUBB Y 3 B B B Y3 CSUB Y 2 16 B B B Y2 16DSTB Z2 保存累加器B的结果 Z的高32位 4 32位乘法运算 没有按照偶地址排列方式进行X1 s X0 u XY1 s Y0 u X1 Y0X0 Y0 X1 Y1Y1 X0编写计算W64 X32 Y32 0 x56781234 0 x67892345X word1234h 5678h X1 5678h X0 1234hY word2345h 6789h Y1 6789h Y0 2345h bssW 4 假定常 变量排列由低到高STM X AR2STM Y AR3LD AR2 T T X0MPYU AR3 A 无符号乘法A u X0 u Y0 STLA W 保存低阶位LDA 16 A A A 16MACSU ar2 ar3 A 符号数与无符号乘 加 A A u X0 Y1MACSU AR3 AR2 A A A u Y0 X1STLA W 1 W1 ALLDA 16 A A A 16MAC AR2 AR3 A 符号数乘法累加A A X1 Y1STLA W 2 保存ALSTHA W 3 保存AH 本章主要内容 程序的控制和转移堆栈的使用基本运算 加法 减法 乘法数据块传送双操作数乘法长字运算小数运算 除法运算浮点运算汇编与C的混合编程 整数相乘时 乘积总要增大 多次相乘就可能产生溢出 而小数相乘 乘积总会减小 再加上累加器还有8位保护位 因此可以在一定程度上防止乘法累加时产生溢出 1 小数的表示方法格式 采用16位二进制补码小数形式 即最高位是符号位 其余15位是小数位 Q15小数 该方法属于定点DSP模拟小数运算 也就是使用机器中的整数来模拟小数 人为的认为小数点在第15位后面 运用小数运算的规则来模拟实现小数乘法运算 由于使用了Q15小数 可以认为由于DSP不能识别小数 因此将小数放大32768倍后给机器去进行运算 表示小数范围 从 1 1 因为有符号整数表示范围在 32768到 32767之间 各位权值 第15位 MSB 第14位 第2位 第1位 第0位 LSB 权值 12 1 2 132 142 15 小数运算 下表是十进制小数与Q15小数转换方法 Q15小数是人们的一种假设 在机器中放大为有符号整数的补码 小数乘法举例 0 2345 D 0 2345 32768 7864 1 7864 1E04H 0 2345 D 1E04 1 E1FCH小数乘法计算剖析 以4位字长和8位累加器为例00 100 Q3小数相乘0 5X 0 375 X11 101 每数前面进行了一位符号扩展 0010000000001000010000100001 110100得1 110100B 0 1875D 结果左移一位011101000去掉冗余符号位后只取高四位得1 110B 0 25D 由于舍掉低阶位所产生误差为0 0625D 小数乘法运算编程方法 SSBXFRCT 乘法前设置为小数乘法方式 MPY AR2 AR3 A 双操作数小数乘法STHA Z 保存累加器的高阶位以下是y bssx 4 bssa 4 bssy 1 texttable word1 32768 10 0 1在程序存储器中 定义常量用来给变量赋值 word2 32768 10 0 2 word 3 32768 10 0 3负小数定义方法 word4 32768 10 0 4 word5 32768 10 0 5 word6 32768 10 0 6 word 7 32768 10 0 7 word83 32768 100 0 83多位小数定义 c int00 SSBXFRCT 设置为小数乘法STM x AR1RPT 7MVPDtable AR1 用常量来给变量赋值STM x AR2STM a AR3RPTZA 3 4次单指令重复操作 在运算之前将A清0MAC AR2 AR3 A 进行乘法累加运算STHA y 存储结果 保存累加器的高16位done bdone 本章主要内容 程序的控制和转移堆栈的使用基本运算 加法 减法 乘法数据块传送双操作数乘法长字运算小数运算除法运算 浮点运算汇编与C的混合编程 在C54x中即没有专用的硬件除法器 也没有专用的16位除法指令 1 除法运算靠单指令重复指令rpt 15和条件减法指令SUBCSmem src来共同完成 指令 SUBCSmem src src smem 15ALU输出端 if ALU输出端 0 则 ALU输出端 1 1src 否则 src 1src如将1000h 41h进行整数除法操作 除法运算 2 在进行除法操作之前要首先获得结果的符号 3 除法分为结果为整数的除法和结果为小数的除法 不区分被除数和除数是整数还是小数 只根据绝对值大小来区分 区别如下 1 被除数加载到累加器的方式不同 对于 被除数 除数 的除法 采用被除数直接加载到累加器 而 被除数 除数 的除法 重复执行16次 而 被除数 除数 的除法重复执行15次 1 编程例子 1 被除数 除数 情况 商为小数编写0 4 0 8 除法运算 bssnum 1 被除数 bssden 1 除数 bssqout 1 结果 datatable word4 32768 10 0 4 word 8 32768 10 0 8有0 4 0 8 textstart LD num DP 将DP指针指向变量当前页STM num AR1RPT 1MVKDtable AR1 LD den 16 A 被除数左移16位加载累加器A 除法运算 MPYA num B A 31 16 Smem 乘积结 果的符号作为商的符号ABSA 分子取绝对值STHA den 保存除数的绝对值LD num 16 A 被除数左移加载累加器ABSARPT 14 15次条件减法SUBC den AXC1 BLT 条件执行指令 若B小于0 则执行下 一条否则跳过下一字指令NEGA A ASTLA quot 保存商 除法运算 2 被除数 除数 商为整数 有余数编写16384 512的程序段 bssnum 1 bssden 1 bssqout 1 bssyushu 1 datatable word16384 word512 textstart LD num DP 将DP指针指向变量当前页STM num AR1RPT 1 除法运算 MVKDtable AR1 LD den 16 A 被除数左移16位加载累加器AMPYA num B A 31 16 Smem 乘积结 果的符号作为商的符号ABSASTHA den 保存除数的绝对值LD num A 将被除数直接加载累加器A 与前例不同 ABSARPT 15 16次条件减法 与前例不同 SUBC den AXC1 BLT 若B小于0 则执行下一条否则跳过下 一字指令NEGA A ASTLA quot 保存商STHA yushu 保存余数较前例多此语句 本章主要内容 程序的控制和转移堆栈的使用基本运算 加法 减法 乘法数据块传送双操作数乘法长字运算小数运算除法运算浮点运算 汇编与C的混合编程 浮点运算 1 C54x虽然是定点DSP 但是支持浮点运算 浮点运算具有以下两个主要优点 浮点运算表示的范围大 运算时精度高 2 浮点的表示方法定点数 尾数 2 指数 尾数和指数全为补码形式 尾数为归一化Q15小数 指数范围 8 31 注意该指数为负指数形式 如 Q15小数0 x4000 0 5 0 x4000 20 尾数 0 x4000 0 5 指数为0Q15小数0 x2000 0 25 0 x4000 2 1 尾数 0 x4000 0 5 指数为1Q15小数0 xA000 0 75 0 xA000 20 尾数 0 xA000 0 75 指数为0Q15小数0 xE000 0 25 0 x8000 2 2 尾数 0 x8000 1 指数为2 浮点运算 3 定点数转换成浮点数 假设待转换的数据已经存入累加器 1 EXPA 提取指数指令 并将指数保存到T寄存器中 如果A 0 则T 0 如果累加器A不等于0 则T 累加器A中的冗余符号位数 8 提取后A中数值不变 如 EXPA 如果A FFFFFFFFCB 执行后T 0019h 34 1 8 25 19h 查1的个数减9EXPA 如果A 0783452105h 执行后T 0FFFCh 5 1 8 4 查0的个数减9指数 从保护位的最高位开始数连零 或连1 个数 9 符号位数 9 冗余符号数 8 2 STT EXPONENT 保存指数到数存单元 浮点运算 3 NORMA 将累加器进行规格化处理 移位 A A TS如 NORMA 如果A FFFFFFF001 T 13h则执行 后A FF80080000 左移19位 如果A 210A0A0A0A T FFF9则执 行后A 0042141414 右移7位4 浮点数转换成定点数方法只要将尾数按照与规格化相反方向移动即可 例 LD x1 16 A 加载到高16位单元中EXPA 提取指数STT e1 存储指数NORMA 归一化移位STHA m1 保存尾数 1 浮点数乘法举例0 3 0 8 title float asm defstartSTACK usect STACK 100 bssx1 1 被乘数 bssx2 1 乘数 bsse1 1 被乘数的指数 bssm1 1 被乘数的尾数 bsse2 1 乘数的指数 bssm2 1 乘数的尾数 bssep 1 乘积的指数 bssmp 1 乘积的尾数 bssproduct 1 乘积结果 bsstemp 1 暂存单元 datatable word3 32768 10 0 3 word 8 32768 10 0 8 定点被乘数 定点乘数 尾数 指数 尾数 指数 尾数 尾数 尾数 指数 指数 指数 尾数 指数 定点结果 textstart STM STACK 100 SP 初始化堆栈指针 调用子程序MVKDtable x1 初始化被乘数 0 3MVKDtable 1 x2 初始化乘数 0 8 下面将被乘数化为浮点数LD x1 16 A 加载到高16位单元中EXPASTT e1 存储指数NORMASTHA m1 保存尾数 下面将乘数化为浮点数LD x2 16 a EXPASTT e2NORMaSTHA m2 CALLMULT 调用浮点乘法子程序done bdone 浮点乘法子程序MULT SSBXFRCT 小数乘法LD e1 a 取被乘数指数ADD e2 a 加乘数指数STLa ep 保存指数的和 将被乘数和乘数的尾数相乘LD m1 tMPY m2 a 将尾数的乘积进行归一化EXPASTT tempNORMASTHA mp 将归一化产生的指数与原指数和相加得到最终指数 LD temp aADD ep aSTLa ep 保存最终的结果的尾数 将乘积结果由指数形式化为小数形式NEGA 将指数取反 为了反向移位STLa temp LD temp t LD mp 16 aNORMaSTHA product 以小数形式保存乘积结果RET end 本章主要内容 程序的控制和转移堆栈的使用基本运算 加法 减法 乘法数据块传送双操作数乘法长字运算小数运算除法运算浮点运算汇编与C的混合编程 汇编与C的混合编程 具体程序例子见实验程序 1 多个汇编程序之间的子程序调用如 程序中有包含两个汇编程序文件a1 asm b1 asm 1 a1 asm程序文件 globalinit 定义一个外部程序文件可以引用的符号 defsub2 定义一个外部程序文件可以引用的符号init 可以被外部程序文件调用的子程序段 retsub2 可以被外部程序文件调用的子程序段 ret 2 b1 asm程序文件 refsub2 表示引用的标号来自于外部程序文件 globalinit 表示引用的标号来自于外部程序文件 callinit 调用子程序 来自于外部程序文件callsub2 调用子程序 来自
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年软件工程师面试宝典软件技术预测试题及解析
- 2025年烷基化工艺作业考试常见问题及解答
- 2025年猪肉行业趋势分析与预测题
- 28、水平二篮球备课18课时+匹配教案
- 2025年物联网技术领域高级职位求职必-备面试题答案详解
- 电力供应基础知识培训课件
- 2025年初中音乐特岗教师招聘面试指南及预测题
- 2025年基于实际案例的灌区管理工初级面试题分析与解答
- 2025年物联网技术入门指南与初级考试要点解析
- 人口手耳目教学课件
- 《飞机结构与系统》课件-机翼结构
- (正式版)JBT 3300-2024 平衡重式叉车 整机试验方法
- 公司跟合作社合作协议书
- 五年级下册计算题400道及答案
- 游戏传媒策划方案
- 变压器油色谱分析(详细超值版)
- 青少无人机科普教育方案课件
- 文物安全培训课件
- 叉车操作规程管理制度
- 传播学概论课件
- 小学生品德发展与道德教育PPT完整全套教学课件
评论
0/150
提交评论