DSP程序题.docx
- 文档编号:5304865
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:26
- 大小:141.58KB
DSP程序题.docx
《DSP程序题.docx》由会员分享,可在线阅读,更多相关《DSP程序题.docx(26页珍藏版)》请在冰豆网上搜索。
DSP程序题
DSP程序题(总21页)
1、已知(80H)=50H,AR2=84H,AR3=86H,AR4=88H。
MVKD80H,*AR2
MVDD*AR2,*AR3
MVDM86H,AR4
运行以上程序后,(80H)、(84H)、*AR3和AR4的值分别等于多少
解:
(80H)=50H,(84H)=50H,*AR3=50H,AR4=50H
2、已知,(80H)=20H、(81H)=30H。
LD#0,DP
LD80H,16,B
ADD81H,B
运行以上程序,B等于多少
答:
(B)=0000000000H
3、阅读以下程序,分别写出运行结果。
.bssx,4
.data
table:
.word4,8,16,32
……
STM#x,AR1
RPT#2
MVPDtable,*AR1+
①解:
数据表table中的常量4传送到以变量x的地址为地址的存储单元中;数据表table中的常量8传送到以变量x+1的地址为地址的存储单元中;数据表table中的常量16传送到以变量x+2的地址为地址的存储单元中;
.bssx,4
.data
table:
.word4,8,16,32
……
STM#x,AR1
RPT#2
MVPDtable,*+AR2
②解:
数据表table中的常量4传送到以变量x+1的地址为地址的存储单元中;数据表table中的常量8传送到以变量x+2的地址为地址的存储单元中;数据表table中的常量16传送到以变量x+3的地址为地址的存储单元中;
4、指令
●ADD#4568H,8,A,B●STM#1000H,*AR2●MVDD*AR3-,100H●SYM1.set2;符号SYM1=2
●Begin:
LD#SYM1,AR1;将2装入AR1
●Label:
ADD#123,B;表示将操作数123(十进制)和累加器B中的内容相加
●Label:
LD*AR4,A;操作数*AR4为间接地址,将AR4中的内容作为地址,然后将该地址的内容装入到指定的累加器A
●RPT#99;将下一条指令循环100次
●LD#0h,DP;将0装入数据页指针
●ADD#0ffh,A;将0ffh加给AccA
●ADD#1234h,A;将#1234h加给AccA
●MVKDsample,*AR5;sample所代表的就是一个dmad
●MVKD1000h,*AR5;将数据存储器1000h单元的数据传送到由AR5所指的存储单元中。
1000h代表的是一个dmad(数据存储器地址(dmad)寻址)
●MVPDtable,*AR5table所代表的就是一个pmad(程序存储器地址(pmad)寻址)
●PORTRPA,Smem;从PA单元端口读入一个数据,传送到Smem所指的数据单元中去
●PORTWSmem,PA;从Smem所指的数据单元取出一个数据,传送到PA单元端口
●PORTRFIFO,*AR5;把一个数从端口为FIFO的I/O口传送到AR5所指向的数据单元
●LD*(BUFFER),A;把地址为BUFFER的数据单元中的数据装到AccA中
●LD#4,DP;指向页4(0200h-027Fh)
●ADD9h,A;将数据页4中地址9h的数据加给AccA
●ADD*,8,A;将当前辅助寄存器所指的地址里的数据,左移8-bit后加给AccA
●ADD*+,8,A;将当前辅助寄存器所指的地址里的数据,左移8-bit后加给AccA,当前辅助寄存器加1.
●ADD*+,8,A,AR4;数据左移加给AccA后,当前辅助寄存器加1,选择辅助寄存器AR4
●ADD*0+,8,A;执行加法后,将AR0的值加给当前辅助寄存器
●ADD*AR0+,8,A;执行加法后,将AR0的值加给当前辅助寄存器,但反向进位
●ADD*AR3+,14,A;将AR3指向的地址单元0100h的内容1500h左移14位,得到5400000h加上1200h,将结果5401200h存在累加器A中
●ADDC*+AR2(5),A;将AR2加上5后指向的地址单元内容,并进位加到累加器A中,此指令计算0013h+0004h+1h=0018h。
●MAC#345h,A,B;B=A+T*#345h
●MAC*AR5+,*AR6+,A,B;B=A+(*AR5)*(*AR6)T=(*AR5)
●MACR*AR5+,A;A=rnd(A+T*(*AR5))
●MACR*AR5+,*AR6+,A,B;B=rnd(A+((*AR5)*(*AR6)))T=(*AR5)
●MACA*AR5+;B=B+(*AR5)*A(31~16)T=(*AR5)AR5=AR5+1
●AND*AR3+,A;A=A&(*AR3)AR3=AR3+1
●ANDM#00FFh,*AR4+;(*AR4)=(*AR4)&(#00FF)AR4=AR4+1
●SFTAA,–5,B;SHIFT<0,指令执行算术右移;SXM=1,移出的高位用符号位填。
●BIT*AR5+,15-12;指令中的(15-12)表示测试第12位,TC=(*AR5)(15-12),AR5=AR5+1
●BITF5,#00FFh;测试Smem中指定的某些位,lk常数在测试一位或多位时起屏蔽作用。
假如指定的一位或多位为0,状态寄存器ST0的TC位清0,否则该位置1。
●CMPM*AR4+,0404h;比较16位单数据存储器操作数Smem和16位常数lk是否相等。
若相等,ST0寄存器的TC位置1,否则该位清0。
●CMPR2,AR4;测试AR4是否大于AR0
●BD1000h;程序指针指向指定的程序存储器地址(pmad),该地址可以是符号或一个数字。
如果是延迟转移(指令带有后缀D),紧接着该指令的两条单字指令或一条双字指令从程序存储器中取出先执行。
●BACCA;程序指针指向src的低16位所确定的地址。
如果是延迟转移(指令带有后缀D),紧跟着该指令的两条单字或一条双字指令从程序存储器中取出先执行。
●CALAA;程序指针转移到src的低位所确定的地址单元,返回地址压入栈顶。
如果是延迟调用,紧接着该指令的两条单字指令或一条双字指令从程序存储器中取出来先执行。
●RPTDATA127;该指令实现对下一条指令的自动循环执行。
在循环执行期间,所有外部的中断都不会响应,如果有较长时间的循环,一定保证循环期间没有中断产生。
●ST#99,BRC;执行循环块100次
●RPTBend_block–1;
循环执行一段指令块,循环的次数由存储器映射的块循环计数器(BRC)确定。
BRC的值必须在指令执行之前设置。
程序执行时,块循环起始地址寄存器(RSA)中装入程序指针PC+2(如果是采用了延迟就是PC+4);块循环尾地址寄存器(REA)中装入程序存储器地址(pmad)。
●RPTZA,#1023;对目的累加器dst清0,并且循环执行下一条指令n+1次。
FRAME10h;把一个短立即数K加到堆栈指针SP中。
●POPD10;把由堆栈指针SP寻址的数据存储器单元的内容转移到由Smem确定的数据存储器单元中,然后堆栈指针SP执行加1操作。
●POPMAR5;把由堆栈指针SP寻址的数据存储器单元的内容转移到指定的存储器映射寄存器MMR中,然后堆栈指针SP执行加1操作。
●PSHD*AR3+;SP减1后将数据压入堆栈。
●PSHMBRC;BRC:
存储器映射的块循环计数器。
SP减1后,将MMR压入堆栈。
●MAR
*AR3+;修改由Smem所确定的辅助寄存器的内容。
在兼容方式下(CMPT=1),并且ARx≠AR0,指令会修改ARx的内容以及辅助寄存器指针(ARP)的值;在非兼容方式下(CMPT=0),指令只修改辅助寄存器的值,而不改变ARP。
●XC1,ALEQ
MAR*AR1+该指令的运行情况由n和所选择的条件决定。
如果n=1并且满足条件,就执行该指令的下一条单字指令;如果n=2并且满足条件,就执行该指令的下两条单字指令或者一条双字指令;如果不满足条件,执行n次nop操作。
●DLD*AR3+,B;把一个32位的长操作数Lmem装入目的累加器dst中。
●LD*AR4,DP;把一个数据存储器的值或一个短立即数装入T寄存器或状态寄存器中的DP、ASM和ARP位。
●LDMAR4,A;把存储器映射寄存器MMR中的值装入到目的累加器的低位字中,累加器的高位字和保护位清0。
不论DP的当前内容或ARx的高9位是多少,有效地址的高9位清0,将数据页指针设置为0。
●LDR*AR1,A;把单数据存储器操作数Smem左移16位后装入目的累加器DST的高端(位31~16)。
Smem通过对累加器的位14~0清0进行四舍五入运算,累加器的第15位设置为1。
●LDU*AR1,A;把单数据存储器Smem的值装入目的累加器dst的低端(位15~0),dst的保护位和高端(位39~16)清0。
因此,数据被看成是一个无符号的16位数,不管SXM位的状态如何都不进行符号扩展。
●DSTB,*AR3+;把源累加器的内容存放在一个32位的长数据储存器单元中Lmem中。
●STHA,10;把源累加器src的高端(位31~16)存放到数据存储器单元Smem中.
●STHB,–8,*AR7–;把源累加器移位后位31~16存放到数据存储器单元(Smem或Xmem)中。
●STLMA,BRC;把源累加器src的低端(位15~0)存放到存储器映射寄存器MMR中。
无论DP的当前值或ARx的高9位是多少,有效地址的高9位清0。
●LD*AR4+,16,A
||MAC*AR5+,B16位双数据存储器操作数Xmem左移16位后装入目的累加器的高端。
同时并行执行一个双数据操作数Ymem与T寄存器的值相乘再把乘积加到dst_中的操作。
●LD*AR4+,16,A
||MACR*AR5+,B指令带有R后缀,则对乘积和累加器操作的结果进行四舍五入,再存在dst中。
四舍五入的方法是:
给该值加上215,然后将结果的低端(位15~0)清0。
●MVDD*AR3+,*AR5+;将Xmem寻址的数据存储器单元的内容复制到Ymem寻址的数据存储器单元中。
●若辅助寄存器AR0的值为0x0005H,AR3的值为0x030FH,请分别给出下列寻址方式修改后的辅助寄存器的值。
(6分)
*AR3+;AR3=0310H
*AR3+0;AR3=0314H
*AR3(15);AR3=0324H
●分别解释以下指令的功能。
(6分)
LD#80h,A;把立即数80H装入累加器A
LD80h,A;把80H为地址的数据装如累加器A
LD#80h,16,A;把立即数80H左移16位后装如累加器A
5、MACX0,Y0,AX:
(R0)+,X0Y:
(R4)+N4,Y0
这条指令命令DSP56300
将寄存器X0和Y0中的数相乘,结果加到AccA中,将寄存器R0所指的X存储器地址中的值装入寄存器X0,将寄存器R4所指的Y存储器地址中的值装入寄存器Y0,R0的值加1,寄存器N4的值加给R4。
6、定点加法temp3=temp1+temp2
ldtemp1,a;变量temp1装入累加器A
addtemp2,a;变量temp2与累加器A相加,结果放入A中
stla,temp3;结果(低16位)存入变量temp3中。
(没有特意考虑temp1和temp2是整数还是小数)
●编程实现小数乘法,要求将变量temp1装入累加器高16位与temp2相乘,结果存入temp3。
SSBXFRCT;置FRCT标志位,准备小数乘法
LDtemp1,16,A;将变量temp1装入累加器A的高16位
MPYAtemp2;完成temp2与累加器A的高16位相乘,结果放入B累加器,并将temp2装入T寄存器
STHtemp3;将乘积结果的高16位存入变量temp3
7、定点减法stm#temp1,ar3;变量temp1的地址装入ar3寄存器
stm#temp2,ar2;变量temp2的地址装入ar2寄存器
sub*ar2,*ar3,b;变量temp2和temp1都左移16位,然后相减,结果放入
累加器B中(高16位)
sthb,temp3;相减的结果(累加器B的高16位)存入变量temp3。
8、定点整数乘法
rsbxFRCT;清FRCT标志,准备整数乘
ldtemp1,T;变量temp1装入T寄存器
mpytemp2,a;temp2*temp1,结果放入累加器A(32位)
stha,temp3;结果的高16位存入temp3
stla,temp4;结果的低16位存入temp4
9、定点小数乘法
ssbxFRCT;FRCT=1,准备小数乘法
ldtemp1,16,a;temp1装入A的高16位
mpyatemp2;temp2乘A的高16位,结果在B中,同时将temp2装入T寄存器
sthb,temp3;将乘积的高16位存temp3
10、使用C54X汇编语言编程计算z1=x1+y1;z2=x1-y1;z3=x1*y1;z4=x2*y2。
其中,x1=20,y1=54,x2=,y2=编写汇编源程序如下:
.title“”
.mmregs
.bssx1,1
.bssx2,1
.bssy1,1
.bssy2,1
.bssz1,1
.bssz2,1
.bssz3_h,1
.bssz3_l,1
.bssz4,1
v1.set014h;v1=20
v2.set036h;v2=54
v3.set04000h;v3=
v4.set0b548h;v4=
start:
LD#x1,DP
ST#v1,x1
ST#v2,y1
LDx1,A;x1A
ADDy1,A;A+Y1A
STLA,z1;保存ALz1
LDx1,A
SUBy1,A
STLA,z2
RSBXFRCT;准备整数乘法,FRCT=0
LDX1,T
MPYY1,A;x1*y1A
STHA,z3_h;乘法结果高16位在z3_h单元
STLA,z3_l;乘法结果低16位在z3_l单元
ST#v3,x2
ST#v4,y2
SSBXFRCT;准备小数乘法,FRCT=1
LDx2,16,A;将x2加载到AH
MPYAy2;x2*y2B,andy2T
STHB,z4;结果放到z4单元
11、对数组x[8]={0,1,2,3,4,5,6,7}进行初始化
.bssx,8
.data
Table:
.word0,1,2,3,4,5,6,7
.text
Start:
STM#x,AR5
RPT#7
MVPDtable,*AR5+
…
●将数组x[5]初始化为{1,2,3,4,5}。
.data;定义初始化数据段起始地址
TBL:
.word1,2,3,4,5;为标号地址TBL
;开始的5个单元赋初值
.sect“.vectors”;定义自定义段,并获得该段起始地址
BSTART;无条件转移到标号为START的地址
.bssx,5;为数组x分配5个存储单元
.text;定义代码段起始地址
START:
STM#x,AR5;将x的首地址存入AR5
RPT#4;设置重复执行5次下条指令
MVPDTBL,*AR5+
end:
Bend
.end
●实现对数组X[5]={1,2,3,4,5}的初始化,然后将数据存储器中的数组X[5]复制到数组Y[5]。
最后实现数组X和数组Y中对应元素相乘并累加,即z=1*1+2*2+3*3+4*4+5*5
.mmregs
.bssx,5
.bssy,5
.bssz,1
.defstart
table:
.word1,2,3,4,5
.text
start:
STM#x,AR1
RPT4
MVPDtable,*AR1+;从程序存储器传送到数据存储器数组X[5]
STM#x,AR2
STM#y,AR3
RPT4
MVDD*AR1,*AR3;从数据存储器数组X[5]传送到Y[5]
SSBXFRCT;准备整数乘法
STM#x,AR2
STM#y,AR3
STM#z,AR4
RPTZ4
MAC*AR2+,*AR3+,A
STLA,*AR4
End:
Bend
.end
12、对数据x[8]中的每个元素加1
.bssx,8
Begin:
LD#1,16,B
STM#7,BRC
STM#x,AR4
RPTBnext-1
ADD*AR4,16,B,A
STHA,*AR4+
next:
LD#0,B
…
12、求解.其中数据均为小数,且a1=a2=a3=a4=
13、x1=x2=x3=x4=
.bssa,4
.bssx,4
.data
table:
.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
.text
Start:
SSBXFRCT
STM#a,AR4
RPT#7
MVPDtable,*AR4+
STM#x,AR5
STM#a,AR6
RPTZA,#3
MAC*AR5+,*AR6+,A
14、计算y=
.bssx,4,1
a0.word012h
a1.word3211h
a2.wordfe11h
a3.wordff03h
.sect“program”
LD#X,AR1
LD#0,A,AR1
LD#a0,T
MAC*+,A
LD#a1,T
MAC*+,A
LD#a2,T
MAC*+,A
LD#a3,T
MAC*,A
15、在堆栈操作中,PC当前地址为4020H,SP当前地址为1013H,运行PSHMAR7后,PC和SP的值分别是多少解:
SP=1012H;PC=4021H
16、试编写×的程序代码。
.title""
.mmregs
.global_c_int00
.bssx,1
.bssy,1
.bssz,1
.data
AmpCoef:
.word25*32768/100
.word-1*32768/10
.text
_c_int00:
ssbxFRCT
stm#x,ar1
rpt#0x1
mvpd#AmpCoef,*ar1+
stm#x,ar2
stm#y,ar3
mpy*ar2,*ar3,A
sthA,*ar1
Wait:
bWait
.end
17、将定点数用浮点数表示。
解:
A=28H;T=19H
18、试写出以下两条指令的运行结果:
①EXPA
A=FFFD876624T=0000
则以上指令执行后,B、T的值各是多少解:
A=0xFFFD876624;T=5
②NORMB
B=420D0D0D0D,T=FFF9
则以上指令执行后,B、T的值各是多少解:
B=0x841A1A1A,T=FFF9
19a[20]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19},x[20]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]的初始化,并将数据存储器中的数组x[20]复制到数组y[20],将数据存储器中的a[20]写入到程序存储器PROM(2000H-2013H),再将程序存储器PROM中的20个数据存入数据存储器DATA(0200H-0213H)
.mmregs
.data
TBL:
.word
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
.word1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
PROM:
.usect“PROM”,20
.bssa,20
.bssx,20
.bssy,20
DATA.usect“DATA”,20
.text
Start:
STM#a,AR1
RPT#39
MVPDTBL,*AR1+
STM#x,AR2
STM#y,AR3
RPT#19
MVDD*AR2+,*AR3+
STM#a,AR1
LD#PROM,A
STM#19,AR3
LOOP:
WRITA*AR1+
ADD#1,A,A
BANZLOOP,*AR3-
LD#PROM-1,A
STM#DATA,AR1
ST#19,BRC
RPTBLOOP1
ADD#1,A,A
LOOP1:
READA*AR1+
WAIT:
NOP
BWAIT
20、建立链接命令文件
_o
_m
MEMORY
{PAGE0:
RAM:
origin=1000h,length=800h
RAM1:
origin=2000h,length=300h
PAGE1:
DARAM1:
origin=0100h,length=100h
DARAM2:
origin=0200h,length=100h
}
SECTIONS
{
.data:
>RAMPAGE0
.text:
>RAMPAGE0
PROM:
>RAM1PAGE0
.bss:
>DARAM1PAGE1
DATA:
>DARAM2PAGE1
}
21、●设计一存储空间为100个单元的堆栈。
将栈底地址指针送SP,对其初始化。
Size.set100;设置堆栈空间的大小为100
Stack.usect"STK",size;设置堆栈段的首地址和堆栈空间
STM#stack+size,SP
●利用SUBC完成整除法,41H/7H=9H,余数是2H。
LD#0041H,B
STM#0100H,AR2
STM#0110H,AR3
ST#0007H,*AR2
RPT#15
SUBC*AR2,B
STLB,*AR3+
STHB,*AR3
●编写求解加、减法的程序,计算z=x+y-w。
.title""
.mmregs
STACK.usect“STACK”,10H
.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 程序