实验四汇编语言程序设计一、实验目的:通过本实验,熟悉指令系统,初步掌握汇编语言程序设计的基本方法和技巧。实验条件:本实验在学习教材第五章的基础上进行。二、实验步骤:1、编写实验y=51iiixa,小鼠乘法累加的汇编语言程序lab4a.asm.其中a={0.1,0.2,0.3,0.4.0.5}.2、将第五章例9和例10组合成一个程序lab4b.asm,实现对一个数组x[5]={1000h,2000h,3000h,5000h}进行初始化,并利用块重复操作指令将该数组每个元素加3、将第五章例20或例21,分别编写成完整的除法运算程序lab4c1.asm和lab4c2.asm.4、编写实现两个64位数相加的汇编语言程序lab4d.asm。5、再设计好上述每一个汇编语言程序的通知,均设计相应的链接命令文件lab4x.cmd,并利用CCS调试。三、实验程序:Lab4a.asm:******************************************************lab4a.asmy=a1*x1+a2*x2+a3*x3+a4*x4+a5*x5******************************************************.titlelab4a.asm.mmregsSTACK.usectSTACK,10h;allocatespaceforstack.bssx,5;allocate11wordforvariates.bssa,5.bssy,1.defstart.datatable:.word1*32768/10,2*32768/10,3*32768/10,4*32768/10,5*32768/10.word1*32768/10,2*32768/10,3*32768/10,4*32768/10,5*32768/10.text;codefollows...start:SSBXFRCTSTM#STACK+10h,SP;setstackpointerSTM#table,AR1;AR1pointtotableSTM#x,AR2;AR2pointtoxSTM#9,AR0LD#0,Aloop:LD*AR1+,A;move8valuesSTLA,*AR2+;fromprogrammemoryBANZloop,*AR0-;intodatamemoryCALLSUM;callSUMsubrotineend:BendSUM:STM#a,AR3;ThesubrotinelmplememtSTM#x,AR4;multiply--accumulateRPTZA,#4MAC*AR3+,*AR4+,ASTHA,@yRET.end实验体会:1)、C54x采用2的补码小数,其最高位为符号位,一个十进制小数乘以32768后再将其十进制部分转换成16进制数,就能得到这个十进制小数的2的补码表示。2)、AR1的地址范围为0090~009A,AR0的值从9变为0;AR2为数据存储器,其地址为0060到006A变化,AR3的地址范围为0065~006A3)执行STHA,@y后A的值004665999C,取其高8位,则y=0x4665Lab4b.asm:.titlelab4b.asm.mmregs.bssx,5.defstart.datatable.word1000h,2000h,3000h,4000h,5000h.text;codefollows...start:STM#x,AR2;AR2pointtoxRPT#4MVPDtable,*AR2+;*************************************next:LD#1,16,B;将1左移16位后加载到累加器B上STM#4,BRC;立即数4存到BRC寄存器STM#x,AR4;将x存到寄存器AR4中RPTBend-1;重复4次ADD*AR4,16,B,A;将累加器B的值左移16位后与AR4的内容相加并STHA,*AR4+;存储在累加器A中end:Bend.end实验体会:1)、由于x的值存到寄存器AR2中,故AR2的地址为0060到0065;AR4地址为0060到0065。2)、BRC的值由0003变为0000,A的值依次为0010010000、0020010000、0030010000、0040010000、00500100003)、结果显示0x0CCC0x19990x26660x33330x40000x46650x00030x00040x00080x00060x00040x00024)、与lab4a.cmd一样lab4b.cmd的数据存储地址也应改为.data:SPRAMPAGE1否则Memory里的对应地址空间没有显示值。Lab4c1.asm:;**************;*lab4c1.ASM*;**************.titlelab4c1.asm.defstartSTACK.usectSTACK,100.bssnum,1;分子.bssden,1;分母.bssquot,1;商.datatable:.word-128;4*32768/10;0.4.word1024;-8*32768/10;-0.8.textstart:STM#num,AR1RPT#1MVPDtable,*AR1+;传送2个数据至分子、分母单元LD@den,16,A;(num)*(A(32-16))-BMPYA@numABSA;分母取绝对值STHA,@den;分母绝对值存回原处LD@num,16,A;分子-(32-16)ABSA;分子取绝对值RPT#14;15次减法循环,完成除法SUBC@den,AXC1,BLTNEGASTLA,@quot;保存商done:Bdone.end运行结果如下:被除数num除数den商quot(十六进制)商(十进制)4*32768/10(0.4)-8*32768/10(0.8)0xC000-0.5-12810240xF000-0.125Lab4c2.asm:;**************;*lab4c2.ASM*;**************.titlelab4c2.asm.defstartSTACK.usectSTACK,100.bssnum,1.bssden,1.bssquot,1.datatable:.word16384;66*32768/100.word512;-33*32768/100.textstart:STM#num,AR1RPT#1MVPDtable,*AR1+LD@den,16,AMPYA@numABSASTHA,@denLD@num,AABSASUB@den,ABCnext,ALTADD@den,ARPT#15SUBC@den,ABnext1next:LD@num,16,AABSARPT#14SUBC@den,Anext1:XC1,BLTNEGASTLA,@quotdone:Bdone.end运行结果如下:被除数num除数den商quot(十六进制)商(十进制)163845120x20003266*32768/100(0.66)-33*32768/100(-0.33)0xFFFE-2Lab4d.asm;lab4d.asm.titlelab4d.asm.defstarttable:.word4000h;x3.word0f000h;x2.word0f000h;x1.word0f000h;x0.word4000h;y3.word3000h;y2.word2000h;y1.word1000h;y0.bssx,4.bssy,4.bssz,4.textstart:STM#x,AR1RPT#7MVPDtable,*AR1+;*****************************LD#x,DPDLD@x+2,ADADD@y+2,ADLD@x,BADDC@y+1,BADD@y,16,B;*****************************STLA,@z+3STHA,@z+2STLB,@z+1STHB,@zhere:Bhere.end运行结果:x(加数)16进制4000F000F000F000y(被加数)4000300020001000z(和)8001200110010000实验体会:通过本实验,了解了两数相乘、相除、相加等汇编语言程序设计的基本方法和技巧,学会如何观察指令和数据所在数据存储器的地址,与书本知识相结合;基础知识很重要,需要熟悉和掌握书本上的知识;实践出真知,在不断地仿真试验中发现问题,解决问题,使自我得以提升。