第八讲 汇编语言程序的阅读与理解111201_第1页
第八讲 汇编语言程序的阅读与理解111201_第2页
第八讲 汇编语言程序的阅读与理解111201_第3页
第八讲 汇编语言程序的阅读与理解111201_第4页
第八讲 汇编语言程序的阅读与理解111201_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

第八讲 汇编语言程序的阅读与理解数据块传送程序单字运算程序小数运算程序,数据块传送程序共有4种类型(10条指令): (1) 程序存储器数据存储器(MVPD,MVDP)。 (2) 数据存储器数据存储器(MVDK,MVKD,MVDD)。(3) 数据存储器MMR(MVMD、MVDM,MVMM)(4) 程序存储器(由ACC寻址)数据存储器(READA,WRITA)这些指令的特点如下:传送速度比加载和存储指令要快;传送数据不需要通过累加器;可以寻址程序存储器;与RPT相结合时,都变成单周期指令,可以实现数据块传送。,例23: 编写一段程序,首先对数组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 .text,Start: STM #x, AR1 RPT#19 MVPD table, *AR1+; 程序存储器传送到数据存储器 STM #x, AR2 STM #y, AR3 RPT #19 MVDD *AR2+, *AR3+ ; 数据存储器传送到数据存储器end: Bend .end,/ c5416.cmd*/链接命令MEMORYPAGE 0: VECT: origin = 0x28100, len = 0x100 IPROG1: origin = 0x200, len = 0x7c00IPROG2: origin = 0x28200, len = 0x7c00IPROG3: origin = 0x38000, len = 0x8000FLASHL: origin = 0x40000, len = 0x40000FLASHH: origin = 0x4000000,len = 0x80000 PAGE 1: SPRAM: origin = 0x60, len = 0x20DARAM: origin = 0x80, len = 0x3f80SARAM: origin = 0x8000, len = 8000 ,SECTIONS.vector: VECTPAGE 0.text: IPROG2PAGE 0.cinit: IPROG2PAGE 0.switch: IPROG2PAGE 0.const: IPROG2PAGE 0.stack: IPROG1PAGE 0.data: DARAMPAGE 1.bss: DARAMPAGE 1 STACK: IPROG1PAGE 0,单字运算程序例24: 试编一程序,计算 的值,并找出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 .word 8, 6, 7, 2 .text,start: 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存放乘累加的值 RET,MAX: 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存放的最大值 RET .end,假设.bss为变量a、x和y分配的10个字的存储空间,以数据存储器的0060H为起始地址,结果y167(43h),最大值y230(1Eh)。,练习:已知(30H)=50H,AR2=40H,AR3=60H,AR4=80H. MVKD 30H,*AR2 MVDD *AR2,*AR3 MVDM *AR3,AR4 运行以上程序后,(30H)(40H) AR3和AR4的值分别等于多少呢?,.title fir5.asm .mmregs .def _c_int00.datafir_table .word -6,28,46,27,-35,-100,-93,26,191,240,52,-291 .word -497,-278,337,888,773,-210,-1486,-1895,-442,2870 .word 6793,9445,9445,6793,2870,-442,-1895,-1486,-210,773 .word 888,337,-278,-497,-291,52,240,191,26,-93 .word -100,-35,27,46,28,-6 .datainput .word 0x7FDE,0x04CF,0xF7FD,0xE2D4,0xE6F3,0x1AE5,0x9A5F,0xED44,0x0D2C,0x42A1 .word 0x48C3,0xCEF2,0x2889,0xFD21,0xFD3E,0xC78E,0x988E,0x30AC,0x0FBB,0x3216 .word 0x0000,0x058B,0x5BAF,0xDBB1,0xDD85,0xA6EE,0xEFE8,0x347D,0xD778,0x21D4 .word 0x0C7C,0x5688,0x2784,0xAC72,0xEE91,0xCC24,0x190E,0xDC23,0xD14A,0x4D7E .word 0x2A9F,0x4D7E,0xD14A,0xDC23,0x190E,0xCC24,0xEE91,0xAC72,0x2783,0x5688 .word 0x0C7C,0x21D4,0xD778,0x347D,0xEFE8,0xA6EE,0xDD85,0xDBB1,0x5BAF,0x058C .word 0x0000,0x3216,0x0FBB,0x30AC,0x988F,0xC78E,0xFD3E,0xFD21,0x2889,0xCEF2 .word 0x48C3,0x42A1,0x0D2C,0xED44,0x9A5F,0x1AE5,0xE6F4,0xE2D3,0xF7FD,0x04CF .word 0x7FDE,0x04CF,0xF7FD,0xE2D4,0xE6F3,0x1AE5,0x9A5F,0xED44,0x0D2C,0x42A1 .word 0x48C3,0xCEF2,0x2889,0xFD21,0xFD3E,0xC78E,0x988E,0x30AB,0x0FBB,0x3216 .word 0x0000,0x058B,0x5BAF,0xDBB1,0xDD85,0xA6EF,0xEFE8,0x347D,0xD778,0x21D4 .word 0x0C7C,0x5688,0x2784,0xAC72,0xEE91,0xCC24,0x190D,0xDC24,0xD149,0x4D7E .word 0x2A9F,0x4D7E,0xD14A,0xDC23,0x190E,0xCC24,0xEE91,0xAC72,0x2783,0x5688 .word 0x0C7C,0x21D4,0xD778,0x347D,0xEFE8,0xA6EE,0xDD86,0xDBB1,0x5BAF,0x058C .word 0x0000,0x3216,0x0FBB,0x30AC,0x988F,0xC78D,0xFD3E,0xFD21,0x2889,0xCEF1 .word 0x48C3,0x42A2,0x0D2C,0xED44,0x9A5F,0x1AE5,0xE6F4,0xE2D3,0xF7FD,0x04CFfir_coff .usect fir_coff,48in_buf .usect in_buf,48 .bss in,160 .bss out_buf,112 .text_c_int00: SSBx FRCT;小数乘法编程时,设置FRCT(小数方式)位 STM #in,AR1 RPT #159 MVPD input,*AR1+ STM #fir_coff,AR1 RPT #47 MVPD fir_table,*AR1+ STM #in_buf,AR1 RPT #47 MVPD input,*AR1+ STM #in_buf+47,AR2 STM #fir_coff+47,AR3 STM #48,BK STM #-1,AR0 STM #out_buf,AR6 STM #in+48,AR5 STM #111,AR7FIR2: ;FIR滤波运算 RPTZA,#47 MAC*AR2+0%,*AR3+0%,A ; STHA,*AR6+ MVDD *AR5+,*AR2+0%;用最新的样本值替代最旧的样本值 BANZ FIR2,*AR7- NOP NOP .end,汇编源文件fir5.asm,FIR滤波运算,FIR2: ;FIR滤波运算 RPTZ A,#47 MAC *AR2+0%, *AR3+0%,A ; STH A,*AR6+ MVDD *AR5+,*AR2+0%;用最新的样本值替代最旧的样本值 BANZ FIR2,*AR7-,1定点DSP中数据表示方法定点DSP芯片的数值表示是基于2的补码表示形式。数的定标有Q表示法和S表示法,表7-10列出了16位数的16种Q表示和S表示,以及它们所能表示的十进制数范围。16位中有一个符号位、Q个小数位和15-Q个整数位来表示一个数。,表7-10 Q表示、S表示及数值范围,图7-9 DSP定点运算中小数的表示,1) 小数的表示方法采用2的补码表示小数:最高位为符号位,数值范围从1+1。 MSB LSB 0/1(符号位) . 2-1 2-2 2-15 十进制转换成十六进制数:由十进制小数乘以32768后,再将其整数部分转换。如: -1:|-1|32768 再求反+18000h -0.5:|-0.5|32768 再求反+1C000h 0: 0000h 0.5:0.532768 4000h 1: 132768 7FFFh汇编语言程序中:小数0.123 .Word 32768*123/1000。,2Q15定点小数乘法运算两个16位整数相乘,乘积总是“向左增长”,这就意味着多次相乘后乘积将会很快超出定点器件的数据范围。而且要将32位乘积保存到数据存储器,就要耗费两个机器周期以及两个字的程序和RAM单元。然而,两个Q15的小数相乘,乘积总是“向右增长”,这就意味着超出定点器件数据范围的将是不太感兴趣的部分。,3. 小数乘法中的冗余符号位问题:两个带符号小数相乘,将出现得到的积带有两位符号位。解决冗余符号位的办法:在程序中设定状态寄存器ST1中的FRCT(小数方式)位为1,在乘法器将结果传送至累加器时就能自动地左移1位,累加器中结果为Szzzzzz0(Q7格式),自动消去了两个带符号数相乘时产生的冗余符号位。小数乘法编程时:应当先设置FRCT位: SSBX FRCT MPY *AR2,*AR3,A STH A, Z,4混合表示法有些情况下,运算过程中为了既满足数值的动态范围又保证一定的精度,必须采用Q0与Q15之间的表示方法。在做加、减运算时,如果两个操作数的定标不一样,在运算前要进行小数点的调整,为保证运算精度,需要使Q值小的数调整为与另一个数的Q值一样大。,返回本节,【例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 3276 .word 2*32768/10; .word -3*

温馨提示

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

评论

0/150

提交评论