6.分析下面指令是否正确,并说明理由。 MOV R3,R7 错,两个操作数不能同时为工作寄存器 MOV B,@R2 对 DEC DPTR 错,不存在 MOV 20H.8,F0 错,位传送指令必须用C PUSH DPTR CPL 36H 错,不存在 MOV PC,#0800H 错,PC不能访问
7.分析下面各组指令,区分它们的不同之处。 MOV A,30H 与 MOV A,#30H 前者表示:(30H)→A 后者表示:30H→A MOV A,R0 与 MOV A,@R0 前者表示:(R0)→A 后者表示:((R0))→A MOV A,@R1 与 MOVX A,@R1 前者表示:在片内数据存储器((R1))→A 后者表示:在片外数据存储器((R1))→A MOVX A,@R0 与 MOVX A,@DPTR 前者R0表示8位地址 后者DPTR表示16位地址 MOVX A,@DPTR 与 MOVC A,@A+DPTR 前者表示:((DPTR))→A 后者表示:((DPTR)+(A))→A
8.在MCS-51单片机的片内RAM中,已知(30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H。请说明下面各是什么指令和寻址方式,以及每条指令执行后目的操作数的结果。 MOV A,40H ;数据传送,直接寻址,(A)=48H MOV R0,A ;数据传送,寄存器寻址,(R0)=48H MOV P1,#0FH ;数据传送,立即数寻址,(P1)=0FH MOV @R0,30H ;数据传送,直接寻址,(48H)=38H MOV DPTR,#1234H ;数据传送,立即数寻址,(DPTR)=1234H MOV 40H,30H ;数据传送,直接寻址,(40H)=38H MOV R0,38H ;数据传送,直接寻址,(R0)=40H MOV P0,R0 ;数据传送,直接寻址,(P0)=40H MOV 28H,#30H ;数据传送,立即数寻址,(28H)=30H MOV A,@R0 ;数据传送,寄存器间接寻址,(A)=38H
9.已知(A)=23H,(R1)=65H,(DPTR)=1FECH,片内RAM(65H)=70H, ROM(205CH)=64H。试分析下列各条指令执行后目标操作数的内容。 MOV A,@R1 ;(A)=70H MOVX @DPTR,A ;(1FECH)=70H MOVC A,@A+DPTR ;(A)=64H XCHD A,@R1 ;(A)=65H
6
10.已知(A)=76H,(R1)=76H,(B)=4,CY=1,片内RAM(76H)=0D0H,(80H)=6CH。试分析下列各条指令执行后目标操作数的内容和相应标志位的值。 ADD A,@R1 ;(A)=46H,CY=1 SUBB A,#75H ;(A)=0D0H,CY=1 MUL AB ;(A)=40H,(B)=03H DIV AB ;(A)=15H,(B)=01H ANL 76H,#76H ;(76H)=50H ORL A,#0FH ;(A)=1FH XRL 80H,A ;(80H)=73H
11.已知(A)=83H,(R0)=17H,(17H)=34H,试分析当执行完下面程序段后累加器A、R0、17H单元的内容。 ANL A,#17H ;(A)=03H ORL 17H,A ;(17H)=37H XRL A,@R0 ;(A)=34H CPL A ;(A)=0CBH
12.阅读下面程序段,说明该段程序的功能。 MOV R0,#40H MOV R7,#10 CLR A LOOP: MOV @R0,A INC A INC R0
DJNZ R7,LOOP SJMP $
答:把0,1,2,3??数列送到40H开始的10个单元中。
13.阅读下面程序段,说明该段程序的功能。 MOV R0,#40H MOV A,R0 INC R0 ADD A,@R0 MOV 43H,A CLR A
ADDC A,#0 MOV 42H,A SJMP $
答:40H加41H单元的数,结果送42H:43H
14.阅读下面程序段,说明该段程序的功能。 MOV A,30H MOV B,#5
7
MUL AB ADD A,31H MOV 33H,A CLR A ADDC A,B MOV 32H,A SJMP $
答:(30H)×5+(31H)→(32H:33H)
15.编写程序,用位处理指令实现“P1.4=P1.0∨(P1.1∧P1.2)∨P1.3”的逻辑功能。 MOV C,P1.1 ANL C,P1.2 ORL C,P1.0 ORL C,P1.3 MOV P1.3,C
16.编写程序,若累加器A的内容分别满足下列条件,则程序转到LABLE存储单元。设A中存放的的无符号数。
(1)A≥10; (2)A>10; (3)A≤10。 (1)
CJNE A,#10,NEXT LJMP LABLE NEXT:
JNC LABLE (2)
CJNE A,#10,NEXT LJMP NEXT2 NEXT:
JNC LABLE NEXT2: (3)
CJNE A,#10,NEXT LJMP LABLE NEXT: JC LABLE
17.编写程序,查找片内RAM的30H~50H单元中是否有55H这一数据,若有,则51H单元置为FFH;若未找到,则将51H单元清0。 MOV R0,29H NEXT: INC R0
CJNE R0,#51H,NEXT2 MOV 51H,#0FFH
8
AJMP OVER NEXT2:
CJNE @R0,#55H,NEXT MOV 51H,#0 OVER:
18.编写程序,查找片内RAM的30H~50H单元中出现0的次数,并将查找的结果存入51H单元。 MOV R0,30H MOV 51H,#0 NEXT:
CJNE @R0,#00H,NEXT2 INC 51H NEXT2: INC R0
CJNE R0,#51H,NEXT
19.在片外RAM中有一个数据块,存有若干字符、数字,首地址为SOURCE要求将该数据块传送到片内RAM以DIST开始的区域,直到遇到字符“$”时结束($也要传送,它的ASCII码为24H)。 MOV DPTR,#SOURCE MOV R0,#DIST NEXT:
MOVX A,@DPTR MOV @R0,A INC DPTR INC R0
CINE A,#24H,NEXT
20.片内RAM的30H和31H单元中存放着一个16位的二进制数,高位在前,低位在后。编写程序对其求补,并存回原处。 CLR C MOV A,#0 SUBB A,31H MOV 31H,A MOV A,#0 SUBB A,30H MOV 30H,A
21.片内RAM中有两个4字节压缩的BCD码形式存放的十进制数,一个存放在30H~33H单元中,另一个存放在40H~43H单元中。编写程序将它们相加,结果的BCD码存放在30H~33H中。 CLR C
MOV R0,#30H
9
MOV R1,#40H MOV R2,#4 NEXT:
MOV A,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1
DJNZ R2,NEXT 22.编写程序,把片外RAM从2000H开始存放的16字节数据,传送到片内从30H开始的单元中。 MOV DPTR,#2000H MOV R0,#30H MOV R1,#0 NEXT:
MOVX A,@DPTR MOV @R0,A INC DPTR INC R0 INC R1
CINE R1,#16H,NEXT
第4章 习题答案
1.用C51编程较汇编语言有哪些优势? 答:(1)编程容易
(2)容易实现复杂的数值计算 (3)容易阅读、调试、维护程序 (4)容易实现模块化开发 (5)程序可移植性好 2.C51字节数据、整型数据以及长整型数据在存储器中的存储方式各是怎样的? 答:字符变量(char)无论是unsigned char数据还是signed char数据,均为1个字节,即8位,因此被直接存储在RAM中,可能存储在0~0x7f区域(包括位寻址区域),也可能存储在0x80~0xff区域,与变量的定义有关。
整型变量(int)不管是unsigned int数据还是signed int数据,均为2个字节,即16位,其存储方法是高位字节保存在低地址(在前面),低位字节保存在高地址(在后面)。
长整型变量(long)为4个字节,即32位,其存储方法与整型数据一样,是最高位字节保存的地址最低(在最前面),最低位字节保存的地址最高(在最后面)。
3.C51定义变量的一般格式是什么?变量的4种属性是什么?特别要注意存储区属性。
答:[存储类型] 数据类型 [存储区] 变量名1[=初值] [,变量名2[=初值]]
10