文档库 最新最全的文档下载
当前位置:文档库 › DSP程序题

DSP程序题

DSP程序题
DSP程序题

1、已知(80H)=50H,AR2=84H,AR3=86H,AR4=88H。

MVKD 80H,*AR2

MVDD *AR2,*AR3

MVDM 86H, AR4

运行以上程序后,(80H)、(84H)、*AR3和AR4的值分别等于多少?

解:(80H)=50H,(84H)=50H,*AR3=50H,AR4=50H

2、已知,(80H)=20H、(81H)=30H。

LD #0,DP

LD 80H,16,B

ADD 81H,B

运行以上程序,B等于多少?

答:(B)=00 0000 0000H

3、阅读以下程序,分别写出运行结果。

.bss x,4

.data

table:.word 4,8,16,32

……

STM #x,AR1

RPT #2

MVPD table,*AR1+

①解:数据表table中的常量4传送到以变量x 的地址为地址的存储单元中;数据表table 中的常量8传送到以变量x+1 的地址为地址的存储单元中;数据表table中的常量16传送到以变量x+2 的地址为地址的存储单元中;

.bss x,4

.data

table: .word 4,8,16,32

……

STM #x,AR1

RPT #2

MVPD table,*+AR2

②解:数据表table中的常量4传送到以变量x+1 的地址为地址的存储单元中;数据表table 中的常量8传送到以变量x+2 的地址为地址的存储单元中;数据表table中的常量16传送到以变量x+3 的地址为地址的存储单元中;

4、指令

●ADD #4568H,8,A,B //将4568H左移8位与A相加,赋给B。

●ADD A,-8,B//将A右移8位加上B,保存于B。

●ADD *AR3+,14,A//将AR3左移4加上A→A。

●DST B,*AR1-//B存到长字单元→AR1中,且AR减1。

●LDM AR1,A //存储器映像寄存器寻址方式,将映像寄存器加载累加器AR1→A的低位,其余位置0。

●LD #10H,4,A//将10H左移4位加载到累加器A中。

●MAC *AR3+,*AR4+,A,B//AR3.AR44+A→B,AR3与AR3都加1。

●MVKD SAMPLE,*AR5//SAMPLE→AR5中。

●MVDD *AR3+,*AR5+ //数据存储器内部传送数据AR3→AR5,且指令结束后AR3与AR5

加1。

●MPYA TEMP2//B<=A.Temp2,T=Temp2。

●PPT #99NOP//重复NOP100次。

●STL A,@quot//将累加器A的低16位字存放在quot的存储单元中。

●STL B,*AR3+//将累加器的低位移位后加载到AR3所指地址。

●WRITA SMEM //将A的内容写入SMEM中。

●LD #0032H,4,A//立即数0032H先左移4位后,再加载累加器A.

●STM #1000H,*AR2//立即数1000H存储到AR2指向的地址单元

●MAC #345,A,B//立即数345与T寄存器内值相乘后与累加器A值相加,结果加载累加器

B.

●MVDD *AR3-,100H //AR3指向的地址单元的值传送给地址100H单元, AR3中地址减一。

●LDM *AR1,A//AR1指向的地址单元的值加载到累加器A.

●SYM1 .set 2 ;符号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

●MVKD sample,*AR5 ;sample所代表的就是一个dmad

●MVKD 1000h,*AR5 ;将数据存储器1000h单元的数据传送到由AR5所指的存储单元中。1000h代表的是一个dmad (数据存储器地址(dmad)寻址)

●MVPD table,*AR5 table 所代表的就是一个pmad(程序存储器地址(pmad)寻址)●PORTR PA, Smem ;从PA单元端口读入一个数据,传送到Smem所指的数据单元中去

●PORTW Smem, PA ;从Smem所指的数据单元取出一个数据,传送到PA单元端口

●PORTR FIFO, *AR5 ;把一个数从端口为FIFO的I/O口传送到AR5所指向的数据单元

●LD *(BUFFER),A ;把地址为BUFFER的数据单元中的数据装到AccA中

●LD #4,DP ;指向页4(0200h-027Fh)

●ADD 9h,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

●SFTA A,–5,B;SHIFT<0,指令执行算术右移;SXM=1,移出的高位用符号位填。

●BIT *AR5+,15-12;指令中的(15-12)表示测试第12位,TC=(*AR5)(15-12),AR5=AR5+1

●BITF 5,#00FFh;测试Smem中指定的某些位,lk常数在测试一位或多位时起屏蔽作用。假如指定的一位或多位为0,状态寄存器ST0的TC位清0,否则该位置1。

●CMPM *AR4+,0404h;比较16位单数据存储器操作数Smem和16位常数lk是否相等。若相等,ST0寄存器的TC位置1,否则该位清0。

●CMPR 2,AR4;测试AR4是否大于AR0

●BD 1000h;程序指针指向指定的程序存储器地址(pmad),该地址可以是符号或一个数字。如果是延迟转移(指令带有后缀D),紧接着该指令的两条单字指令或一条双字指令从程序存储器中取出先执行。

●BACC A;程序指针指向src的低16位所确定的地址。如果是延迟转移(指令带有后缀D),紧跟着该指令的两条单字或一条双字指令从程序存储器中取出先执行。

●CALA A;程序指针转移到src的低位所确定的地址单元,返回地址压入栈顶。如果是延迟调用,紧接着该指令的两条单字指令或一条双字指令从程序存储器中取出来先执行。●RPT DATA127;该指令实现对下一条指令的自动循环执行。在循环执行期间,所有外部的中断都不会响应,如果有较长时间的循环,一定保证循环期间没有中断产生。

●ST #99,BRC;执行循环块100次

●RPTB end_block–1;

循环执行一段指令块,循环的次数由存储器映射的块循环计数器(BRC)确定。BRC的值必须在指令执行之前设置。程序执行时,块循环起始地址寄存器(RSA)中装入程序指针PC+2(如果是采用了延迟就是PC+4);块循环尾地址寄存器(REA)中装入程序存储器地址(pmad)。

●RPTZ A,#1023;对目的累加器dst清0,并且循环执行下一条指令n+1次。

FRAME 10h;把一个短立即数K加到堆栈指针SP中。

●POPD 10;把由堆栈指针SP寻址的数据存储器单元的内容转移到由Smem确定的数据存储器单元中,然后堆栈指针SP执行加1操作。

●POPM AR5;把由堆栈指针SP寻址的数据存储器单元的内容转移到指定的存储器映射寄存器MMR中,然后堆栈指针SP执行加1操作。

●PSHD *AR3+;SP减1后将数据压入堆栈。

●PSHM BRC;BRC:存储器映射的块循环计数器。SP减1后,将MMR压入堆栈。

●MAR *AR3+;修改由Smem所确定的辅助寄存器的内容。在兼容方式下(CMPT=1),并且ARx≠AR0,指令会修改ARx的内容以及辅助寄存器指针(ARP)的值;在非兼容方式下(CMPT=0),指令只修改辅助寄存器的值,而不改变ARP。

●XC 1,ALEQ

MAR *AR1+该指令的运行情况由n和所选择的条件决定。如果n=1并且满足条件,就执行该指令的下一条单字指令;如果n=2并且满足条件,就执行该指令的下两条单字指令

或者一条双字指令;如果不满足条件,执行n次nop操作。

●DLD *AR3+,B;把一个32位的长操作数Lmem装入目的累加器dst中。

●LD *AR4,DP;把一个数据存储器的值或一个短立即数装入T寄存器或状态寄存器中的DP、ASM和ARP位。

●LDM AR4,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 位的状态如何都不进行符号扩展。

●DST B,*AR3+;把源累加器的内容存放在一个32位的长数据储存器单元中Lmem中。

●STH A,10;把源累加器src的高端(位31~16)存放到数据存储器单元Smem中.

●STH B,–8,*AR7–;把源累加器移位后位31~16存放到数据存储器单元(Smem 或Xmem)中。

●STLM A,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

LD 80h,A;把80H为地址的数据装如累加器A

LD #80h,16,A;把立即数80H左移16位后装如累加器A

5、MAC X0,Y0,A X:(R0)+,X0 Y:(R4)+N4,Y0

这条指令命令DSP56300

将寄存器X0和Y0中的数相乘,结果加到Acc A中,将寄存器R0所指的X存储器地址中的值装入寄存器X0,将寄存器R4所指的Y存储器地址中的值装入寄存器Y0,R0的值加1,寄存器N4的值加给R4。

6、定点加法temp3=temp1+temp2

ld temp1,a ;变量temp1装入累加器A

add temp2,a ;变量temp2与累加器A相加,结果放入A中

stl a,temp3 ;结果(低16位)存入变量temp3中。(没有特意考虑temp1和temp2是整数还是小数)

●编程实现小数乘法,要求将变量temp1装入累加器高16位与temp2相乘,结果存入temp3。SSBX FRCT ;置FRCT标志位,准备小数乘法

LD temp1,16,A ;将变量temp1装入累加器A的高16位

MPY A temp2 ;完成temp2与累加器A的高16位相乘,结果放入B累加器,并将temp2装入T寄存器

STH temp3 ;将乘积结果的高16位存入变量temp3

7、定点减法stm #temp1,ar3 ;变量temp1的地址装入ar3寄存器

stm #temp2,ar2 ;变量temp2的地址装入ar2寄存器

sub *ar2, *ar3,b ;变量temp2和temp1都左移16位,然后相减,结果放入

累加器B中(高16位)

sth b,temp3 ;相减的结果(累加器B的高16位)存入变量temp3。8、定点整数乘法

rsbx FRCT ;清FRCT标志,准备整数乘

ld temp1,T ;变量temp1装入T寄存器

mpy temp2,a ;temp2*temp1,结果放入累加器A(32位)

sth a,temp3 ;结果的高16位存入temp3

stl a,temp4 ;结果的低16位存入temp4

9、定点小数乘法

ssbx FRCT ;FRCT=1,准备小数乘法

ld temp1,16,a ;temp1装入A的高16位

mpya temp2 ;temp2乘A的高16位,结果在B中,同时将temp2装入T寄存器

sth b,temp3 ;将乘积的高16位存temp3

10、使用C54X汇编语言编程计算z1=x1+y1;z2=x1-y1;z3=x1*y1;z4=x2*y2。其中,x1=20,y1=54,x2=0.5,y2=-0.5837编写汇编源程序如下:

.title “suanshu.asm”

.mmregs

.bss x1,1

.bss x2,1

.bss y1,1

.bss y2,1

.bss z1,1

.bss z2,1

.bss z3_h,1

.bss z3_l,1

.bss z4,1

v1 .set 014h ;v1 =20

v2 .set 036h ;v2=54

v3 .set 04000h ;v3=0.5

v4 .set 0b548h ;v4=-0.5837

start:

LD #x1,DP

ST #v1,x1

ST #v2,y1

LD x1,A ;x1 A

ADD y1,A ;A+Y1 A

STL A,z1 ;保存AL z1

LD x1,A

SUB y1,A

STL A,z2

RSBX FRCT ;准备整数乘法,FRCT=0

LD X1,T

MPY Y1,A ;x1*y1 A

STH A,z3_h ;乘法结果高16位在z3_h 单元

STL A,z3_l ;乘法结果低16位在z3_l单元

ST #v3,x2

ST #v4,y2

SSBX FRCT ;准备小数乘法,FRCT=1

LD x2,16,A ; 将x2加载到AH

MPYA y2 ;x2*y2 B,and y2 T

STH B,z4 ;结果放到z4单元

11、对数组x[8]={0,1,2,3,4,5,6,7}进行初始化

.bss x,8

.data

Table: .word 0,1,2,3,4,5,6,7

.text

Start: STM #x,AR5

RPT #7

MVPD table,*AR5+

●将数组x[5] 初始化为{1,2,3,4,5}。

.data;定义初始化数据段起始地址

TBL:.word 1,2,3,4,5 ;为标号地址TBL

;开始的5个单元赋初值

.sect “.vectors”;定义自定义段,并获得该段起始地址

B START ;无条件转移到标号为START的地址

.bss x,5 ;为数组x分配5个存储单元

.text ;定义代码段起始地址

START:STM #x,AR5 ;将x的首地址存入AR5

RPT #4 ;设置重复执行5次下条指令

MVPD TBL,*AR5+

end: B end

.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

.bss x, 5

.bss y, 5

.bss z,1

.def start

table:.word 1,2,3,4,5

.text

start: STM #x, AR1

RPT 4

MVPD table,*AR1+ ;从程序存储器传送到数据存储器数组X[5]

STM # x, AR2

STM # y, AR3

RPT 4

MVDD *AR1,*AR3 ;从数据存储器数组X[5]传送到Y[5]

SSBX FRCT ;准备整数乘法

STM # x, AR2

STM # y, AR3

STM # z, AR4

RPTZ 4

MAC *AR2+,*AR3+,A

STL A,*AR4

End: B end

.end

12、对数据x[8]中的每个元素加1

.bss x,8

Begin: LD #1,16,B

STM #7,BRC

STM #x,AR4

RPTB next-1

ADD *AR4,16,B,A

STH A,*AR4+

next: LD #0,B

12、求解.其中数据均为小数,且a1=0.3 a2=0.2 a3= -0.4 a4=0.1

x1=0.6 x2=0.5 x3=-0.1 x4=-0.2

.bss a,4

.bss x,4

.data

table: .word 3*32768/10

.word 2*32768/10

.word -4*32768/10

.word 1*32768/10

.word 6*32768/10

.word 5*32768/10

.word -1*32768/10

.word -2*32768/10

.text

Start: SSBX FRCT

STM #a,AR4

RPT #7

MVPD table,*AR4+

STM #x,AR5

STM #a,AR6

RPTZ A,#3

MAC *AR5+,*AR6+,A

13、计算y =

.bss x, 4, 1

a0 .word 012h

a1 .word 3211h

a2 .word fe11h

a3 .word ff03h

.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

14、在堆栈操作中,PC当前地址为4020H,SP当前地址为1013H,运行PSHM AR7后,PC和SP的值分别是多少?解:SP=1012H;PC=4021H

16、试编写0.25×(-0.1)的程序代码。

.title "FracAmp.asm"

.mmregs

.global _c_int00

.bss x,1

.bss y,1

.bss z,1

.data

AmpCoef: .word 25*32768/100

.word -1*32768/10

.text

_c_int00: ssbx FRCT

stm #x,ar1

rpt #0x1

mvpd #AmpCoef,*ar1+

stm #x,ar2

stm #y,ar3

mpy *ar2,*ar3,A

sth A,*ar1

Wait: b Wait

.end

17、将定点数0.00125用浮点数表示。解:A=28H;T=19H

18、试写出以下两条指令的运行结果:

①EXP A

A=FFFD876624 T=0000

则以上指令执行后,B、T的值各是多少?解: A=0xFFFD876624;T=5

②NORM B

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

.word 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

PROM : .usect “PROM”,20

.bss a,20

.bss x,20

.bss y,20

DA TA .usect “DATA”,20

.text

Start: STM #a,AR1

RPT #39

MVPD TBL,*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

BANZ LOOP,*AR3-

LD #PROM-1,A

STM #DA TA,AR1

ST #19,BRC

RPTB LOOP1

ADD #1,A,A

LOOP1: READA *AR1+

WAIT: NOP

B WAIT

20、建立链接命令文件

_o mymove.out

_m mymove.map

MEMORY

{PAGE 0:

RAM: origin=1000h,length=800h

RAM1:origin=2000h,length=300h

PAGE 1:

DARAM1: origin=0100h,length=100h

DARAM2: origin=0200h,length=100h

}

SECTIONS

{

.data :>RAM PAGE 0

.text :>RAM PAGE 0

PROM:>RAM1 PAGE 0

.bss :>DARAM1 PAGE1

DA TA :>DARAM2 PAGE1

}

21、●设计一存储空间为100个单元的堆栈。将栈底地址指针送SP,对其初始化。Size .set 100;设置堆栈空间的大小为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

STL B,*AR3+

STH B,*AR3

●编写求解加、减法的程序,计算z=x+y-w。

.title "ex41.asm"

.mmregs

STACK .usect “STACK”,10H

.bss x,1

.bss y,1

.bss w,1

.bss z,1

.def start

Table: .word 6, 7,9

.text

Start: STM #0,SWWSR

STM #STACK+10H,SP

STM #x,AR1

RPT #2

MVPD table,*AR1+

LD @x,A

ADD @y,A

SUB @w,A

STL A,@z

End: B end

.end

●阅读下列汇编源程序,在每条语句后写出注释,并叙述程序的功能。.title "cjy4.asm"

.mmregs

STACK .usect "STACK",10H

.bss a,4 ;为a分配4个存储单元

.bss x,4 ;为x分配4个存储单元

.bss y,1 ;为结果y分配1个存储单元

.def start

.data ;定义数据代码段

table: .word 1*32768/10 ;在table开始的8个

.word 2*32768/10 ;地址放数据

.word -3*32768/10

.word 4*32768/10

.word 8*32768/10

.word 6*32768/10

.word -4*32768/10

.word -2*32768/10

.text ;定义可执行程序代码段

start:SSBX FRCT ;设置FRCT位,表示进行小数乘

STM #x,AR1 ;将x的首地址传给AR1

RPT #7 ;重复8次下条指令

MVPD table,*AR1+ ;将程序空间8个数传给数据存储器

STM #x,AR2 ;将数据存储器第一个数x1的地址传给AR2

STM #a,AR3 ;将数据存储器第五个数a1的地址传给AR3

RPTZ A,#3 ;将A清零,重复4次下条指令

MAC *AR2+,*AR3+,A ;执行乘法累加和,结果放在A中

STH A,@y ;将A的高端字存入结果y,低端字省去

end: B end ;原处循环等待

.end

●阅读下列汇编源程序,在每条语句后写出注释,并叙述程序的功能。

.title “cjy1.asm”;为汇编源程序取名

.mmregs ;定义存储器映象寄存器

STACK .usect “STACK”,30H;设置堆栈

.bss x,10 ;为数组x分配10个存储单元

.bss y,10 ;为数组y分配10个存储单元

.data

table:.word 1,2,3,4,5,6,7,8,9,10

.def start ;定义标号start

.text

start:STM #0,SWWSR ;复位SWWSR

STM #STACK+30H,SP;初始化堆指针

STM #x,AR1 ;将目的地首地址赋给AR1

RPT #19 ;设定重复传送的次数为20次

MVPD table,*AR1+ ;程序存储器传送到数据存储器

STM #x,AR2 ;将x的首地址存入AR2

STM #y,AR3 ;将y的首地址存入AR3

RPT #19 ;设置重复执行20次下条指令

MVDD *AR2+,*AR3+;将地址x开始的20个值复制到地址y开始的20个单元

end: B end

.end

程序功能:将数据存储器中的数组x[10]复制到数组y[10]。

●阅读下面的程序,回答问题。

.bss x, 8

LD #0001H,16,B

STM #7,BRC

STM #x,AR4

RPTB next-1

ADD *AR4,16,B,A

STH A,*AR4+

next: LD #0,B

问题:(1)寄存器“BRC”的功能是什么?寄存器“BRC”的功能是暂存块循环的次数(2)汇编语句“ADD *AR4,16,B,A”执行了多少次?)8次(3)执行语句“LD #0001H,16,B”后,累加器B的内容是多少?B=0x0100H;

●阅读下面的程序:

.mmregs

DAT0 .SET 60H

DAT1 .SET 61H

DAT2 .SET 62H

DAT3 .SET 63H

add3 .macro P1,P2,P3,ADDRP

LD P1,A

ADD P2,A

ADD P3,A

STL A,ADDRP

.endm

ST #0034h,DA T0

ST #0243h,DA T1

ST #1230h,DA T2

ADD3 DA T0,DA T1,DAT2,DA T3

问题:(1)语句“.mmregs”的含义。定义存储器映像寄存器的符号名称。(2)语句“ADD3 DA T0,DAT1,DAT2,DAT3”是一条什么类型的语句?作用是什么?宏调用。执行三个数相加。

(3)执行此段程序后,存储单元(DAT3)的运行结果多少?14a7H

●阅读下面的程序片断,写出运行结果

.mmregs

DA T0 .SET 60H

LD #004h,DP

ST #0345h,DA T0

STM #0002h,T

MPY DA T0,A

NOP

问题:(1)寄存器T的作用是什么?寄存器T的作用是暂存被乘数(2)执行“MPY DAT0,A”后,累加器A的内容是什么?累加器A的内容为0x68A或68Ah

●阅读程序,回答后面的问题

STM #6,AR4

begin: STM #9,BRC

RPTB next-1

nop

next: LD #0,B

banz begin,*AR4-

问题:(1) BRC寄存器是做什么用途?BRC保存着RPTB指令的循环次数(2)语句“banz begin,*AR4-”的作用是什么?判断AR4的内容是否为零,若不为零,跳转到标号begin。

(3)其中的“nop”语句被执行了多少次?70次

●阅读下面的程序片断,写出运行结果

.mmregs

bei_hua .set 18

LD # bei_hua,A

问题:(1)“.mmregs”的作用是什么?定义存储器映像寄存器的符号名称(2) 运行此段程序后,累加器A的结果是多少?A的结果是18

●阅读下面的程序,回答问题。

.sect ".vectors"

rst: B _c_int00 ;复位中断向量的入口

NOP

NOP

.space 18*4*16

tint: B timeout ;定时器0的中断向量的入口

NOP

NOP

问:(1) “.sect”伪指令的作用是什么?定义一个自定义段名的程序段

(2) 标号“rst”的地址为6000H,请问标号“tint”的地址是多少?604Ch

●阅读下面的命令连接文件(简称CMD文件)和程序文件:

CMD文件:

MEMORY

{ PAGE 0: PROG: origin = 0x1000, length = 0x1000

PAGE 1: DATA: origin = 0x2000, length = 0x1000

}

SECTIONS

{ .text: {} > PROG PAGE 0

.data: {} > DATA PAGE 1

}

.data

table: .word 1,2,3,4 ; 变量初始化

.text

start: STM # 0,SWWSR ; 插入0个等待状态

问:(1)MEMORY和SECTIONS的作用各是什么?MEMORY和SECTIONS链接伪指令,用来指定目标存储器结构和地址分配。(2)标号“table”和“start”的地址分别是什么,分别位于程序空间还是数据空间?标号table:1000h(程序空间);标号start:2000h(数据空间) ●阅读下面的程序片断,回答下面的问题

DAT0 .SET 60H

DAT1 .SET 61H

DAT2 .SET 62H

DAT3 .SET 63H

LD #004h,DP

ST #83h,DAT0

ST #0041h,DA T1

RSBX SXM

LD DAT0,A

RPT #15

SUBC DAT1,A

STL A,DA T2

STH A,DA T3

问:在CPL=0的情况下,(1) 语句“STL A,DAT2”,其中DA T2所指的地址是多少?0262h

(2) 存储单元(DAT2)和(DAT3)的内容是多少?(DAT2)=02H (DAT3)=01H

●阅读下面的程序,回答问题。

MEMORY

{ PAGE 0: PROG: origin = 0x2000, length = 0x1000

PAGE 1: DATA: origin = 0x3000, length = 0x1000

}

SECTIONS

{ .text: {} > PROG PAGE 0

.bss: {} > DATA PAGE 1

}

汇编程序:

.bss a,4

.bss x,4

.bss y,1

STM #a, AR3

STM #x, AR4

RPTZ A, #3

MAC *AR3+,*AR4+,A

STL A,*(y)

问题:(1)指令“STM #a, AR3”的作用是什么?执行此句指令后,寄存器AR3的内容是多少?将标号a 的地址赋给辅助工作寄存器AR3,AR3=3000h 。(2)指令“MAC *AR3+,*AR4+,A ”执行了几次?每执行一次寄存器AR3和AR4的内容如何变化?执行了4次,每执行一次辅助工作寄存器AR3和AR4的内容增一。(3)这段代码的功能是什么?

(3) ∑==41i i i

x a y

● 阅读下面的程序,回答问题。

MEMORY

{ PAGE 0: PROG: origin = 0x2000, length = 0x1000

PAGE 1: DATA: origin = 0x4000, length = 0x1000

}

SECTIONS

{ .text: {} > PROG PAGE 0

STACK: {} > DATA PAGE 1

}

汇编程序

size .set 0x0120

stack .usect “STACK ”,size

.text

STM # stack + size ,SP

问题:(1)指令“stack .usect “STACK ”,size ”的作用是什么?定义一个未初始化段,段名为”STACK ”,目的是为变量stack 保留size 个单元的存储空间。(2)标号“stack ”的存储器地址是多少?stack 的存储空间为0x4000;(3)执行这段代码之后,SP 寄存器的内容是多少? SP=0x4120;

● MEMORY

{PAGE 0: PROM: org=0E000h,len=100h

VECS: org=0FF80h,len=04h

PAGE 1: SPRAM: org=0060h,len=20h

DARAM: org=0080h,len=100h

}

SECTIONS

{ .text :>EPROM PAGE 0

.data :>EPROM PAGE 0

.bss :>SPRAM PAGE 1

STACK :>DARAM PAGE 1

vectors :>VECS PAGE 0

}

问题:(1)该文件是如何配置程序空间和数据空间的?该文件使用MEMORY伪指令将程序空间划分为两个小区间:名为PROM的区间其起始地址为0E000h,长度为100h字;名为VECS的区间其起始地址为0FF80h,长度为4字。将数据空间也分为了两个小区间: 名为SPRAM的区间其起始地址为0060h,长度为20h字;名为DARAM的区间其起始地址为0080h,长度为100h字。(2)该文件中出现了几个段?哪些是初始化段?哪些是未初始化段?各段是如何分配的?出现了5个段,.text,.data和vectors是初始化段,.bss和STACK段是未初始化段。.text和.data分配到程序空间的EPROM区间;.bss分配到数据空间SPRAM区间;STACK段分配到数据空间的DARAM区间;vectors段分配到程序空间的VECS区间。

●阅读下面的程序片段,写出运行结果

.mmregs

DA T0 .SET 60H

LD #004h,DP

ST #0345h,DA T0

STM #0002h,T

MPY DA T0,A

NOP

NOP

问题:(1)寄存器T的作用是什么?寄存器T的作用是暂存被乘数(2)执行“MPY DAT0,A”后,累加器A的内容是什么?累加器A的内容为0x68A或68Ah

●阅读下面的程序,回答问题。

MEMORY

{ PAGE 0: PROG: origin = 0x2000, length = 0x1000

PAGE 1: DA TA: origin = 0x3100, length = 0x1000

}

SECTIONS

{ .text: {} > PROG PAGE 0

.bss: {} > DATA PAGE 1

}

汇编程序:

.bss x,16

.bss y,16

.text

STM #x,AR2

STM #y,AR3

RPT #15

MVDD AR2+,*AR3+

问题:(1)变量“x”的存储器地址是多少?位于哪个存储空间(程序还是数据存储空间)。)变量“x”的存储器地址是0x3100;位于数据存储空间(2)语句“STM #x,AR2”的作用是

什么?执行此句指令后,寄存器AR2的内容是多少?将变量“x ”的地址赋给辅助工作寄存器AR2,AR2=3100h 。(3)语句“MVDD AR2+,*AR3+”的执行了多少次?每执行一次寄存器AR2和AR3的内容如何变化?执行了16次,每执行一次辅助工作寄存器AR2和AR3的内容增一。(4)此段代码的功能是多少?将数组变量“x ”的数据传送到数组变量“y ”中。

●阅读下面的程序,回答后面的问题

.bss x,10

.bss y,1

STM #x,AR1

STM #9,AR2

LD #0,A

loop: ADD *AR1+,A

BANZ loop,*AR2-

STL A, * (y)

问:(1) 解释语句“.bss x,10”的含义。 给x 保留10个空间(2) 解释语句“STL A, * (y)”的含义。将累加器A 的低16位数据存储到变量y 中。 (3)这一段程序实现什么功能∑==10

1i i x y ?

●阅读下面的程序片段,回答后面的问题

.sect ".vectors"

rst: B _c_int00

NOP

NOP

.space 18*4*16

tint: B timeout

NOP

NOP

问:(1) “.sect ”伪指令的作用是什么?定义存储器映像寄存器的符号名称 (2) 标号“rst ”的地址为6000H,请问标号“tint ”的地址是多少?A 的结果是18

●分析程序回答问题(共8分)

.def _c_int00

.mmregs

stack: .usect "stack",10h

.bss a,4

.bss x,4

.bss y,1

.data

table: .word 1,2,4,3

.word 8,6,4,2

.text

_c_int00: STM #stack+10h ,sp

STM #a ,AR1

RPT #7

MVPD table,*AR1+

CALL sum

end: B end

sum:STM #a,AR3

STM #x,AR4

RPTZ A,#3

MAC *AR3+,*AR4+,A

STL A,@y

ret

.end

(1)说明该程序的功能:答:a1*x1=a2*x2+a3*x3+a4*x4(2)说明以下各量的理论值A:2A ;a1的地址:81H ;AR1:88H ;AR3:84H

相关文档