51汇编第三章第四章部分题目的参考答案

2019-04-09 14:41

第三部分 MCS-51汇编语言程序设计

3-1 对下述程序进行人工汇编。

ORG 2000H

CLR C MOV R2,#3 LOOP: MOV A,@RO ADDC A,@R1 MOV @R0,A INC R0 INC R1

DJNZ R2,LOOP JNC NEXT MOV @RO,#01H SJMP $ NEXT: DEC R0

SJMP $

解:首先可查出各指令的机器码,确定每条指令的起始地址。然后,再计算出相对转移指令的偏移量。结果如下:

2000H:C3 CLR C 2001H:7A 03 MOV R2,#3 2003H:E6 LOOP: MOV A,@RO 2004H:37 ADDC A,@R1 2005H:F6 MOV @R0,A 2006H:08 INC R0 2007H:09 INC R1 2008H:DA F9 DJNZ R2,LOOP 200AH:50 04 JNC NEXT 200CH:76 01 MOV @RO,#01H 200EH:80 FE SJMP $ 2010H:18 NEXT: DEC R0 2011H:80 FE SJMP $

(1)设R0=20H,R1=25H。若(20H)=80H,(21H)=90H,(22H)=A0H,(25H)=A0H,(26H)=6FH,(27H)=30H,则程序执行后,结果如何?

解:此程序执行三次加法,被加数存在以20H为首地址的单元,加数则存在以25H为首地址的单元。每次相加的结果如下:

(20H)=(20H)+(25H)+Cy=80H+A0H+0 =20H,Cy=1 (21H)=(21H)+(26H)+Cy=90H+6FH+1 =00H,Cy=1 (22H)=(22H)+(27H)+Cy=A0H+30H+1=D1H,Cy=0

程序将两个三字节相加,执行结果存在22H, 21H和20H中,结果为D1 00 20H。 (2)若27H单元内容改为6FH,则结果有何不同? 解:此时,第三次相加的结果有变化:

(22H)=A0H+6FH+01H=0IH,Cy=1。

由于最后相加后Cy=1,所以还使得(23H) =01,R0指向23H。表示两个3字节数相加后,和为4字

节数。结果等于01010020H。

3-2 试用除法指令编程,将两个存于20H单元内的BCD数变成ASCII码后存入21H和22H单元。并计算程序所占用的内存字节数和所需的机器周期数。

解:将20H内两个BCD数送到A,再将A的内容除以16,就相当于把A的内容右移4位,结果使A中保留一个BCD数,B中存入另一个BCD数,并且都是在低4位。然后使高4位分别变为3,就可变成ASCII码。程序如下:

字节数 机器周期数 MOV A,20H 2 1 MOV B,#10H 3 2 DIV AB 1 4 ORL A,#30H 2 1 MOV 21H,A 2 1 ORL B,#30H 3 2 MOV 22H,B 3 2 SJMP $ END

所以,程序所占内存为16字节,执行程序需13个机器周期。最后一条短转移指令只用来表示程序结束,真正执行时又是一条无限循环语句。所以,一般不计算这条指令的字节数和机器周期数。

3-3 将20H单元内两个BCD数相乘,要求积亦应为BCD数,并把积存入21H单元。 解:MCS-51系统中有乘法指令,但所完成的是两个8位二进制数的相乘,也就是积不是BCD数。因此相乘以后还要进行二进制数—BCD数的转换。由于两个BCD数相乘,积不会超过100。因此只须将乘积除以10,其商就是积的十位数,余数就是积的个位数。程序如下: MOV A,20H ; 两个BCD数送A

MOV B,#16 ; 准备A内容右移4位 DIV AB ;两个BCD数分别存入A,B MUL AB ;两个BCD数相乘,积为二进制数 MOV B,#10 ;准备除以10

DIV AB ;A中为十位数,B中为个位数 SWAP A ;十位数移至高4位 ORL A,B ;并入个位数 MOV 21H,A ;存结果 SJMP $ END

此题也可以不用乘法指令,而通过加法来完成。这也是完成BCD数乘法的一般方法。每次相加以后,通过十进制调整指令把和变为BCD数。这样经过多次循环,就可以得到所求的积,并且已经变成为BCD数了。程序如下:

MOV A,20H ; 两个BCD数送A MOV B,#16 ; 准备将两个BCD数分开 DIV AB ;两个BCD数分别存入A,B JZ NEXT ;若A=0,积为0 MOV R0,0 ;R0中存乘数 MOV R1,B ;R1中存被乘数 CLR A

LOOP:ADD A,R1 ;做循环加法

DA A ;对部分积作十进制调整 DJNZ R0,LOOP

NEXT:MOV 21H,A ;存结果

SJMP $ END

若仅从这个题目而言,当然是第一种解法效率高,执行时间短。但第二种解法提供了完成BCD数乘法的一般思路。

3-4 求16位带符号二进制补码的绝对值。16位数放在NUM和NUM + 1单元。求出的绝对值亦放在原数的单元内,低位先存。

解:只需先取出16位补码数的高8位,判别其符号位以确定正负。若为正数,则绝对值就是原数。若为负数,则求补以后可得绝对值。当然,这里应该是对16位数求补。有关程序如下:

NUM DATA 21H

MOV R0,#NUM+1 ;取高8位地址 MOV A,@R0 ;取高8位到A

JNB ACC.7,NEXT ;若为正数,绝对值即原数 CPL A ;若为负数,高8位求反 MOV @R0, A ;存入原单元 DEC R0 ;地址指向NUM单元 MOV A,@R0 ;取出低8位数 CPL A ;低8位求反 ADD A,#01H ;加1 MOV @R0, A ;存入原单元

JNC NEXT ;低8位加1无进位,则结束 INC R0 ;指向高8位地址 INC @R0 ;高8位加1 END

NEXT: SJMP $

3-5 求16位补码数所对应的原码。16位补码存放在COMP和COMP + 1单元。转换后的原码亦存于这两个单元。低8位先存。

解:此题的解法与上一题相似。只是对负数补码求原码时,符号位应仍保持为1,而将其余各位求反加一。具体做法当然有很多种,以下程序中是用异或指令来实现的。另外,求反加1的实现方法也用了与上题略有不同的方法。程序如下:

COMP DATA 21H

MOV R0,#COMP+1 ;指向高8位地址 MOV A,@R0 ;取出高8位数

JNB ACC.7,NEXT ;正数不用变换

XRL A,#7FH ;符号位不变,其余各位求反 MOV @R0, A ;送回COMP+1单元 DEC R0 ;指向COMP单元 MOV A,@R0 ;取出低8位数 CPL A ;求反 ADD A,#01H ;加1

MOV @R0, A ;送回COMP单元

INC R0 ;指向高8位地址 CLR A

ADDC A,@R0 ;高8位加进位 MOV @R0,A ;送回COMP+1单元

NEXT: SJMP $

END

3 -6从20H单元开始存放一组带符号数,其数目已存在1FH单元。要求统计出其中大于0、等于0和小于0的数的数目,并将结果分别存入ONE,TWO,THREE三个单元。

解:这是一个多分支程序。利用累加器判零条件转移指令以及位地址内容判1条件转移指令,就可以完成>0,=0或<0的判别。再编程时要注意不同分支之间不要发生交叉。程序如下:

ONE DATA 1CH TWO DATA 1DH THREE DATA 1EH

MOV R0,#20H ;数据块首地址 MOV R1,1FH ;取数据块长度到R1 MOV A,R1

JZ FINISH ;长度为0则结束 CLR A

MOV ONE,A ;计数单元清0 MOV TWO,A MOV THREE,A

LOOP: MOV A,@R0 ;取数 INC R0 ;修改地址指针 JZ NEXT2 ;A=0,转向NEXT2 JB ACC.7,NEXT3 ; A<0,转向NEXT3 INC ONE ;A>0,ONE单元加1 SJMP NEXT1

NEXT3: INC THREE ; A<0,THREE单元加1 SJMP NEXT1

NEXT2: INC TWO ;A=0,TWO单元加1 NEXT1: DJNZ R1,LOOP ;长度减1不为0则返回 FINISH:SJMP $ END

也可以用三个工作寄存器(如用R2,R3,R4)作为计数单元存放并统计A>O,A=0,A<0的数目。最后待循环结束统计完成后,把结果送入ONE,TWO, THREE单元即可。这样虽然多用一些寄存器,但一般而言,执行程序的速度可加快。

3-7 在内部数据存贮器中的X和Y单元各有一个带符号数,要求按照以下条件来进行运算,结果送入Z单元。(注:0算正偶数。)

解:一个8位带符号数的正负和奇偶都可以通过位检测指令来实现:正负可通过检测符号位

D7来决定:0为正数,1为负数;奇偶可通过检测最低位D0来决定:0为偶数,1为奇数。程序如下:

X DATA 20H Y DATA 21H Z DATA 22H MOV A,X

JNB ACC.0,EVEN ;偶数转EVEN JB ACC.7,NEG1 ;负奇数转NEG1 ADD A,Y ;正奇数则X+Y SJMP NEXT

NEG1: ORL A,Y ;负奇数则X∨Y SJMP NEXT

EVEN: JB ACC.7,NEG2 ;负偶数转NEG2 ANL A,Y ;正偶数则X∧Y SJMP NEXT

NEG2: XRL A,Y ;负偶数则X⊕Y NEXT: MOV Z,A

SJMP $

END

上述程序中,判断的顺序(奇偶、正负)可以有多种,因此程序的操作顺序(加、与、或等)也要变化。

3-8 在128分支程序中是用AJMP指令实现分支转移的。若用长转移指令LJMP来代替AJMP指令,以便子程序入口地址可在64KB范围内安排。试修改原来的程序,使之能适应新的要求。修改后的程序最多能有几个分支?

解:由于LJMP指令是3字节指令,所以在转移到分支表之前要对分支号(存于R3中)做一次乘3的操作。而用AJMP指令时是先执行一次乘2的操作。修改后的程序如下: MOV A,R3

RL A ;A←A×2 ADD A,R3 ; A←3×R3 MOV DPTR,#BRTAB ;分支表首地址送DPTR JMP @A+DPTR ;第一次转移

BRTAB: LJMP ROUT00 ;转移到第一个分支入口 LJMP ROUT01 ;转移到第二个分支入口 ┆

这样修改以后,分支的数目将有所变化。由千A中是8位无符号数,最大值为255,除以3以后的整数值为:255/3 = 85。所以最多只能有85个分支。而分支入口可以在64 kB范围内安排。 3-9 如果在上题的情况下,85个分支入口不够用,仍要求有128个分支,则应如何修改程序?

解:为了实现128个分支,R3中存放的分支号为0-127。R3的值乘以3以后可以分为两种情况,当R3≤85时,乘以3以后不产生进位,而当R3>85时,乘以3以后就会产生进位。因此可以安排两个分支转移表,即分支0到分支85为一个分支表,分支86到分支127为一个表。分别有各自的入口地址BRTAB1和BRTAB2。按照R3×3以后是否有进位来转移到不同的分支表。还应该注意的是当R3>85以后,乘以3以后的值(不计进位)不是0,3,6,?,而是2,5,8,?,因此,还要做一些调整。修改以后的程序如下:

MOV A,R3


51汇编第三章第四章部分题目的参考答案.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:七年级下册重点知识点 答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: