DSO实验2.docx
《DSO实验2.docx》由会员分享,可在线阅读,更多相关《DSO实验2.docx(16页珍藏版)》请在冰豆网上搜索。
DSO实验2
实验二算术运算与数据操作的汇编语言程序设计实验
一、实验内容与步骤(2、3、4、5、7选做,6、8必做)
1、运行CCS。
2、编写程序,计算y=x1+x2+…+x10(xi的值自己定义)。
3、编写程序,计算z=x+y-w、y=mx+bx、y=x1×a2-x2×a2(自变量的值自己定义)。
4、编写程序,计算y=a1x1+a2x2+…+a40x40(aixi的值自己定义)。
5、编写程序,用长字运算指令实现Z32=X32+Y32,用并行运算指令实现z=x+y和f=e+d。
6、编制程序,计算y=a1x1+a2x2+…+a10x10,其中数据均为小数(aixi的值自己定义)。
7、分别编写程序,计算(-0.24)÷0.48和1024÷128。
8、编写浮点乘法程序,计算x1×x2×x3=0.2×(-0.4)×0.25。
答2:
.title"sy2.asm";伪指令。
用于格式化输出清单文件,声明在每页的顶部打印文件标题
.mmregs;伪指令。
声明CPU寄存器名称
STACK.usect"STACK",10H;伪指令。
自定义未初始化段STACK及大小(10H个字),最左边的STACK是标号
.bssx,10;伪指令。
声明数组x,10个字
.bssy,1;伪指令。
声明变量y,1个字
.defstart;伪指令。
声明本文件中的标号start能被别的文件(程序)引用
.data;伪指令,指示下面的代码为数据段,通常包含初始化的数据(常数)。
table:
.word10,20,3,4,5,1,1,1,1,1;伪指令。
声明10个16位整数类型的常数。
table是标号。
.text;伪指令,指示下面的代码为文本段,通常包含可执行的代码。
start:
STM#0,SWWSR;SWWSR=0,插入0个等待状态。
start是标号。
STM#STACK+10H,sp;sp=#STACK+10H,设置堆栈指针指向堆栈段的底部
STM#x,AR1;AR1=#x或AR1指向数组x
RPT#9;下一条指令重复执行9+1=10次
MVPDtable,*AR1+;数据传送。
程序存储器中的table数据表→AR1+指向的数据存储器
LD#0,A;累加器A清零
CALLSUM;调用求和子程序SUM
end:
Bend;无条件转移到标号end所在地方执行程序
SUM:
;标号,指示求和子程序SUM从这里开始
STM#x,AR3;AR3指向数组x
STM#9,AR2;AR2=9
loop:
ADD*AR3+,A;*AR3+A→A,然后AR3=AR3+1。
loop是标号。
BANZloop,*AR2-;如果AR2的值不为0,AR2=AR2-1,跳转到loop处执行;否则执行下一条指令
STLA,*(y);y=AL
RET;子程序返回
.end;伪指令。
指示汇编结束
编写中断向量表文件:
.title"vectors.asm"
.refstart;伪指令。
声明要引用其他程序中定义的标号start
.sect".vectors";伪指令。
定义初始化的段名.vectors,这一种伪指令声明的段与.data和.text功能一致
Bstart;无条件转移到标号start所在的地方执行程序
.end
编写链接命令文件:
vectors.obj/*声明要链接的文件---中断向量表文件的目标文件*/
sy2.obj/*声明要链接的文件---主程序文件的目标文件*/
-osy2.out/*声明链接产生的可执行文件名称,默认为a.out*/
-msy2.map/*声明链接产生的存储器映射文件*/
-estart/*声明主程序入口*/
MEMORY/*关键字加一对{},存储器配置*/
{
PAGE0:
/*程序存储区*/
EPROM:
org=0090Hlen=0F70H/*定义EPROM区,起始地址0090H,长度0F70H*/
VECS:
org=0080Hlen=0010H/*定义VECS区,起始地址0080H,长度0010H*/
PAGE1:
/*数据存储区*/
SPRAM:
org=1000Hlen=1000H/*定义SPRAM区,起始地址1000H,长度1000H*/
DARAM:
org=2000Hlen=2000H/*定义DARAM区,起始地址2000H,长度2000H*/
}
SECTIONS/*关键字加一对{},定位段*/
{
.text:
>EPROMPAGE0/*将.text段映射或定位到PAGE0的EPROM区*/
.data:
>EPROMPAGE0/*将.text段映射或定位到PAGE0的EPROM区*/
.bss:
>SPRAMPAGE1/*将.text段映射或定位到PAGE1的SPRAM区*/
STACK:
>DARAMPAGE1/*将.text段映射或定位到PAGE1的DARAM区*/
.vectors:
>VECSPAGE0/*将.vectors段映射或定位到PAGE0的VECS区*/
}
运行后的结果
答4:
.title"sy2.asm"
.mmregs
STACK.usect"STACK",30H
.bssa,40
.bssx,40
.bssy,2
.data
table:
.word1,2,3,4,5,6,7,8,9,10,11
.word1,2,3,4,5,6,7,8,9,10,11
.word12,13,14,15,16,17,18,19,20
.word12,13,14,15,16,17,18,19,20
.word21,22,23,24,25,26,27,28
.word21,22,23,24,25,26,27,28
.word29,30,1,2,3,4,5,6,7,8,9,10
.word29,30,1,2,3,4,5,6,7,8,9,10
.defstart
.text
start:
STM#a,AR1
RPT#79
MVPDtable,*AR1+
LD#0,B
STM#a,AR2
STM#x,AR3
STM#39,BRC
RPTBdone-1
LD*AR2+,T;单操作数指令
MPY*AR3+,A;单操作数指令
ADDA,B
done:
STHB,*(y)
STLB,*(y+1)
end:
Bend
.end
;数据传送。
程序存储器中的table数据表→AR1+指向的数据存储器
LD#0,A;累加器A清零
CALLSUM;调用求和子程序SUM
end:
Bend;无条件转移到标号end所在地方执行程序
SUM:
;标号,指示求和子程序SUM从这里开始
STM#x,AR3;AR3指向数组x
STM#19,AR2;AR2=9
loop:
ADD*AR3+,A;*AR3+A→A,然后AR3=AR3+1。
loop是标号。
BANZloop,*AR2-;如果AR2的值不为0,AR2=AR2-1,跳转到loop处执行;否则执行下一条指令
STLA,*(y);y=AL
RET;子程序返回
.end;伪指令。
指示汇编结束
编写中断向量表文件:
.title"vectors.asm"
.refstart;伪指令。
声明要引用其他程序中定义的标号start
.sect".vectors";伪指令。
定义初始化的段名.vectors,这一种伪指令声明的段与.data和.text功能一致
Bstart;无条件转移到标号start所在的地方执行程序
.end
编写链接命令文件:
vectors.obj/*声明要链接的文件---中断向量表文件的目标文件*/
sy2.obj/*声明要链接的文件---主程序文件的目标文件*/
-osy2.out/*声明链接产生的可执行文件名称,默认为a.out*/
-msy2.map/*声明链接产生的存储器映射文件*/
-estart/*声明主程序入口*/
MEMORY/*关键字加一对{},存储器配置*/
{
PAGE0:
/*程序存储区*/
EPROM:
org=0090Hlen=0F70H/*定义EPROM区,起始地址0090H,长度0F70H*/
VECS:
org=0080Hlen=0010H/*定义VECS区,起始地址0080H,长度0010H*/
PAGE1:
/*数据存储区*/
SPRAM:
org=1000Hlen=1000H/*定义SPRAM区,起始地址1000H,长度1000H*/
DARAM:
org=2000Hlen=2000H/*定义DARAM区,起始地址2000H,长度2000H*/
}
SECTIONS/*关键字加一对{},定位段*/
{
.text:
>EPROMPAGE0/*将.text段映射或定位到PAGE0的EPROM区*/
.data:
>EPROMPAGE0/*将.text段映射或定位到PAGE0的EPROM区*/
.bss:
>SPRAMPAGE1/*将.text段映射或定位到PAGE1的SPRAM区*/
STACK:
>DARAMPAGE1/*将.text段映射或定位到PAGE1的DARAM区*/
.vectors:
>VECSPAGE0/*将.vectors段映射或定位到PAGE0的VECS区*/
}
运行后的结果:
答6:
.title"sy2.asm"
.mmregs
STACK.usect"STACK",10H
.bssa,10
.bssx,10
.bssy,1
.defstart
.data
table:
.word1*32768/10;0.1
.word2*32768/10;0.2
.word-3*32768/10;-0.3
.word4*32768/10;0.4
.word1*32768/10;0.1
.word2*32768/10;0.2
.word-3*32768/10;-0.3
.word4*32768/10;0.4
.word8*32768/10;0.8
.word6*32768/10;0.6
.word1*32768/10;0.1
.word2*32768/10;0.2
.word-3*32768/10;-0.3
.word4*32768/10;0.4
.word1*32768/10;0.1
.word2*32768/10;0.2
.word-3*32768/10;-0.3
.word4*32768/10;0.4
.word8*32768/10;0.8
.word6*32768/10;0.6
.text
start:
SSBXFRCT
STM#a,AR1
RPT#19
MVPDtable,*AR1+
STM#x,AR2
STM#a,AR3
RPTZA,#9
MAC*AR2+,*AR3+,A
STHA,*(y)
end:
Bend
.end
编写中断向量表文件:
.title"vectors.asm"
.refstart;伪指令。
声明要引用其他程序中定义的标号start
.sect".vectors";伪指令。
定义初始化的段名.vectors,这一种伪指令声明的段与.data和.text功能一致
Bstart;无条件转移到标号start所在的地方执行程序
.end
编写链接命令文件:
vectors.obj/*声明要链接的文件---中断向量表文件的目标文件*/
sy2.obj/*声明要链接的文件---主程序文件的目标文件*/
-osy2.out/*声明链接产生的可执行文件名称,默认为a.out*/
-msy2.map/*声明链接产生的存储器映射文件*/
-estart/*声明主程序入口*/
MEMORY/*关键字加一对{},存储器配置*/
{
PAGE0:
/*程序存储区*/
EPROM:
org=0090Hlen=0F70H/*定义EPROM区,起始地址0090H,长度0F70H*/
VECS:
org=0080Hlen=0010H/*定义VECS区,起始地址0080H,长度0010H*/
PAGE1:
/*数据存储区*/
SPRAM:
org=1000Hlen=1000H/*定义SPRAM区,起始地址1000H,长度1000H*/
DARAM:
org=2000Hlen=2000H/*定义DARAM区,起始地址2000H,长度2000H*/
}
SECTIONS/*关键字加一对{},定位段*/
{
.text:
>EPROMPAGE0/*将.text段映射或定位到PAGE0的EPROM区*/
.data:
>EPROMPAGE0/*将.text段映射或定位到PAGE0的EPROM区*/
.bss:
>SPRAMPAGE1/*将.text段映射或定位到PAGE1的SPRAM区*/
STACK:
>DARAMPAGE1/*将.text段映射或定位到PAGE1的DARAM区*/
.vectors:
>VECSPAGE0/*将.vectors段映射或定位到PAGE0的VECS区*/
}
运行后的结果:
答8:
***x1:
被乘数,m2:
乘数的尾数,m3:
乘数的尾数,x2:
乘数,x3:
乘数,ep:
乘积的指数,e1:
被乘数的指数******************
***mp:
乘积的尾数,m1:
被乘数的尾数,product:
乘积,e2:
乘数的指数,e3:
乘数的指数,temp:
暂存单元***
.title"sy2.asm"
.mmregs
.defstart
STACK.usect"STACK",100
.bssx1,1
.bssx2,1
.bssx3,1
.bsse1,1
.bssm1,1
.bsse2,1
.bssm2,1
.bsse3,1
.bssm3,1
.bssep,1
.bssmp,1
.bssproduct,1
.bsstemp,1
.data
table:
.word2*32768/10;0.2
.word-4*32768/10;-0.4
.word25*32768/100;0.25
.text
start:
STM#STACK+100,SP;设置堆栈指针
LD#x1,DP;设置DP指针为x1所在页
MVPDtable,@x1;将x1和x2传送到数据存储器
MVPDtable+1,@x2
MVPDtable+2,@x3
LD@x1,16,A;将x1规格化为浮点数
EXPA
STT,@e1;保存x1的指数
NORMA
STHA,@m1;保存x1的尾数
LD@x2,16,A;将x2规格化为浮点数
EXPA
STT,@e2;保存x2的指数
NORMA
STHA,@m2;保存x2的尾数
CALLMULT;调用浮点乘法子程序
LD@x3,16,A;将x3规格化为浮点数
EXPA
STT,@e3;保存x3的指数
NORMA
STHA,@m3;保存x3的尾数
CALLMULT
end:
Bend
MULT:
SSBXFRCT
SSBXSXM
LD@e1,A;指数相加
ADD@e2,A
ADD@e3,A
STLA,@ep;乘积指数->ep
LD@m1,T;尾数相乘
MPY@m2,A;乘积尾数在累加器A中
MPY@m3,A;乘积尾数在累加器A中
EXPA;对尾数乘积规格化
STT,@temp;规格化时产生的指数->temp
NORMA
STHA,@mp;保存乘积尾数在mp中
LD@temp,A;修正乘积指数
ADD@ep,A;(ep)+(temp)->ep
STLA,@ep;保存乘积指数在ep中
NEGA;将浮点乘积转换成定点数
STLA,@temp;乘积指数反号,并且加载到T寄存器
LD@temp,T;再将尾数按T移位
LD@mp,16,A
NORMA
STHA,@product;保存定点乘积
RET
.end
编写中断向量表文件:
.title"vectors.asm"
.refstart;伪指令。
声明要引用其他程序中定义的标号start
.sect".vectors";伪指令。
定义初始化的段名.vectors,这一种伪指令声明的段与.data和.text功能一致
Bstart;无条件转移到标号start所在的地方执行程序
.end
编写链接命令文件:
vectors.obj/*声明要链接的文件---中断向量表文件的目标文件*/
sy2.obj/*声明要链接的文件---主程序文件的目标文件*/
-osy2.out/*声明链接产生的可执行文件名称,默认为a.out*/
-msy2.map/*声明链接产生的存储器映射文件*/
-estart/*声明主程序入口*/
MEMORY/*关键字加一对{},存储器配置*/
{
PAGE0:
/*程序存储区*/
EPROM:
org=0090Hlen=0F70H/*定义EPROM区,起始地址0090H,长度0F70H*/
VECS:
org=0080Hlen=0010H/*定义VECS区,起始地址0080H,长度0010H*/
PAGE1:
/*数据存储区*/
SPRAM:
org=1000Hlen=1000H/*定义SPRAM区,起始地址1000H,长度1000H*/
DARAM:
org=2000Hlen=2000H/*定义DARAM区,起始地址2000H,长度2000H*/
}
SECTIONS/*关键字加一对{},定位段*/
{
.text:
>EPROMPAGE0/*将.text段映射或定位到PAGE0的EPROM区*/
.data:
>EPROMPAGE0/*将.text段映射或定位到PAGE0的EPROM区*/
.bss:
>SPRAMPAGE1/*将.text段映射或定位到PAGE1的SPRAM区*/
STACK:
>DARAMPAGE1/*将.text段映射或定位到PAGE1的DARAM区*/
.vectors:
>VECSPAGE0/*将.vectors段映射或定位到PAGE0的VECS区*/
}
运行后的结果: