1、练习题 3 答案1. 简述下列基本概念:指令,指令系统,机器语言,汇编语言。答:指令是单片机 CPU 执行某种操作的命令。指令系统是一台计算机所能执行的指令集合。机器语言即二进制代码语言,是计算机可以直接识别。汇编语言是用助记符、字符串和数字等来表示指令的程序语。2. 简述 AT89S51 单片机的指令格式答:该单片机的指令由两部分组成,即操作码和操作数。操作码用来规定指令进行什么操作,而操作数则是指令操作的对象,操作数可能是一个具体的数据,也可能是指出到哪里取得数据的地址或符号。指令格式一般为: 标号: 操作码 操作数 1,操作数 2,操作数 3 ;注释3. 简述 AT89S51 的寻址方式
2、和所能涉及的寻址空间 答:共有 7 种寻址方式,见表 3-2。分别是:(1)寄存器寻址:寻址范围为通用寄存器组,共 4 组 32 个,但只能使用当前寄存器组,因此使用前需要通过对 PSW 种的 RS1、RS0 位的状态进行设置;(2)直接寻址:寻址范围为内部 RAM,包括低 128 位用户 RAM 区和高 128 位专用寄存器;(3)寄存器间接寻址:寻址范围为内部 RAM 低 128 位,外部 RAM 64KB(低 256 单元可以使用 DPTR 和R0、R1 作为间接寻址寄存器,而其他单元只能用 DPTR 作为间接寻址寄存器) ;(4) 立即寻址:直接给出立即数,不涉及寻址空间;(5)变址寻
3、址:只对程序寄存器进行寻址; (6)相对寻址:以 PC 的内容为基值,加上指令机器代码中相对地址 形成新的 PC 值转移;(7)位寻址:寻址空间包括内部 RAM 位寻址区(202FH)和专用寄存器的可寻址位。4. 要访问片外程序存储器和片外数据存储器,应采用哪些寻址方式?答:访问片外程序存储器采用变址寻址方式,片外数据存储器采用寄存器间接寻址方式,且用 DPTR 可以访问 64KB,而用 R0 或者 R1 只可访问低 256 字节。5. 在 AT89S51 片内 RAM 中,已知 (30H)=38H,(38H)=40H,(40H)=48H ,(48H)=90H。请分析下面各是什么指令,说明源操
4、作数的寻址方式及按顺序执行每条指令后的结果。答:指令 指令说明 源操作数寻址方式 结果表 3-2 寻址方式及相应的寻址存储器范围寻 址 方 式 寻 址 存 储 器 范 围立即寻址 程序存储器 ROM直接寻址 片内 RAM 低 128B,特殊功能寄存器寄存器寻址 工作寄存器 R0R7,A, C, DPTR,AB 寄存器间接寻址 片内 RAM 低 128B,片外 RAM 变址寻址 程序存储器 ROM(A+DPTR,A+PC)相对寻址 程序存储器 ROM (相对寻址指令的下一指令 PC 值加128127)位寻址 片内 RAM 的 20H2FH 字节地址中所有的位,可位寻址的特殊功能寄存器MOV A,
5、 40H 将内部 RAM 中 40H 内容传送到累加器 A 中(A) (40H)直接寻址 (A)48HMOV R0, A 再将 A 中内容传送给 R0(R0) (A)寄存器寻址 (R0)=48HMOV P1, #0F0H将立即数 0F0H 送到 P1口,即 P1.4P1.7 位 1,其余为 0(P1) 0F0H立即数寻址 (P1)=0F0HMOV R0, 30H将 30H 中的内容,传放到以 R0 单元内容为地址的单元中(R0) (30H)直接寻址 (R0)=(48H)=38HMOV DPTR, #3848H将立即数 3848 传送给DPTR 数据指针(dptr) 3848H立即数寻址 (DP
6、TR)=3848HMOV 40H, 38H将内部 RAM 中 38H 内容传送到 40H 单元中(40H) (38H)直接寻址 (40H)=40HMOV R0, 30H将 30H 中的内容给 R0 寄存器(R0) (30H)直接寻址 (R0)=38HMOV P0, R0 将 R0 的内容传送到 P0(P0) (R0)寄存器寻址 (P0)=38HMOV A, R0将 R0 内容为地址的该单元内容传送给 A(A)(R0)寄存器间接寻址 (A)=40HMOV P2, P1 将 P1 的内容传送给 P2(P2) (P1)直接寻址 (P2)=0F0H6. 指出下列指令的源操作数的寻址方式MOV A, 6
7、5H 直接寻址MOV A, #65H 立即数寻址MOV A, R0 寄存器间接寻址MOV A, R2 寄存器寻址MOVC A, A+PC 变址寻址7. 内部 RAM 和特殊功能寄存器各用什么寻址方式?答:内部 RAM 有寄存器寻址方式、直接寻址方式和间接寻址方式;特殊功能寄存器除 A 外只能进行直接寻址。8. 已知:(A)=5BH, (R1 )=30H , (30H )=0CEH, ( P1)=71H, (PSW)=80H, (PC)=2000H, (205CH )=46H , (SP)=30H, (B)=78H。分别求各条指令执行后的结果(要求进行二进制运算验证)及标志位 Cy、P 的影响。
8、(1)MOV A, R1 (A)=0CEH P=1, C 不变(2)MOV 40H, 30H (40H)=0CEH P 和 C 不变(3)MOV P1, R1 (P1)=30H P 和 C 不变(4)MOVC A, A+PC (A)=46H P=1, C 不变(5)PUSH B (31H)=78H,(SP)=31H P 和 C 不变(6)POP DPH (DPH)=0CEH,(SP)=29H P 和 C 不变(7)XCHD A, R1 (A)=05EH,(30H)=CBH P=1, C 不变(8)ADD A, 30H (A)=29H P=1, C=1(9)ADDC A, P1 (A)=CDH
9、P=1, C=0(10)SUBB A, P1 (A)=E9H P=1, C=1(11)ANL P1, #0FH (P1)=01H P 和 C 不变(12)CLR PSW.7 C=0(13)RLC A (A)=B7H P=0, C=0(14)ORL C, 90H C=1, P 不变9. 对下面一段程序加上机器码和注释,并说明程序运行后寄存器 A、R0 和内部 RAM 50H、51H、52H 单元的内容。MOV 50H,#50H 75 50 50 ;(50H)50HMOV A,50H E5 50 ;(A)(50H )MOV R0,A F8 ;( R0)(A)MOV A,#30H 74 30 ;(A
10、)30HMOV R0,A F6 ;( R0) )(A )MOV A,#50H 74 50 ;(A)50HMOV 51H,A F5 51 ;(51H)(A)MOV 52H,#00H 75 52 00 ;(52H)00H答:运行后寄存器(A)=50H,(R0)=50H,(50H)=30H,(51)=50H,(52H)=00H10. 区别下列各指令中 20H 的含义,在每条指令后加上注释。MOV A , 20H 将 20H 立即数传送给 AMOV 45H, 20H 将内部 RAM 中 20H 单元的内容传送到 45H 中MOV C, 20H.0 将内部 RAM 中 20H 单元内容的第 0 位(最低
11、位)传送给 CMOV C, 20H 将内部 RAM 中 20H 位地址内容传送给 C11. 写出完成以下功能的指令(1) 将立即数 30H 送到 R1;(2) 将内 RAM30H 中的数据送到内 RAM78H 单元;(3) 将立即数 30H 送到 以 R0 中内容为地址的存储器中;(4) 将 R2 中的内容送到 P1;(5) 将内 RAM60H 单元的数据送到 外 RAM60H 单元;(6) 将内 RAM60H 单元的数据送到外 RAM1060H 单元;(7) 将 ROM1000H 单元的内容送到内 RAM30H 单元;(8) 使 ACC.7 置位;(9) 使累加器的低 4 位清零;(10)
12、使 P1.2 与 CY 相与,结果送 CY;(11) 立即数 45H、93H 进行逻辑与、或、异或操作;(12) 两立即数求和:1C0H45H,结果按高低 8 位存在 30H、31H 中。答案:(1)MOV R1,30H (2) MOV 78H, 30H(3)MOV R0, #30H (4)MOV P1, R2(5) MOV A,60H;MOV P2,#0; MOV R0,#60H;MOVX R0,A(6) MOV A,60H; MOV DPTR,#1060; MOVX DPTR,A(7) MOV A, #00HMOV DPTR,#1000HMOVC A, A+DPTRMOV 30H,A (8
13、)SETB ACC.7(9) ANL A, #0F0H(10) ANL C, p1.2(11) 与: MOV A,#45H ANL A,#59H或: MOV A,#45H ORL A,#59H异或:PMOV A,#45H XRL A,#59H(12) CLR CMOV R2,#1MOV A,#0C0H ADD A,#45HMOV 31H,AMOV A,R2ADDC A,#0MOV 30H,A12. 写出下列指令执行过程中堆栈的变化设堆栈初值为 X: MOV R6, #11H (SP)=X(堆栈不变)MOV R7, #23H (SP)=X(堆栈不变)ACALL 200H (SP)=X+2 ;(X
14、+1 )= 第 4 条指令的首址 PC 低 8 位 (X+2)=第 4 条指令的首址 PC 高 8 位POP 50H (SP)=X-1POP 51H (SP)=X-2SJMP $ORG 200HRET答:执行过程中,前面两条为立即寻址指令,堆栈不变;执行第三条 ACALL 指令时,首先将程序寄存器 PC 的当前值加 2,接着先后将 PC 的低八位和高八位分别进栈,(SP)= (SP)+2;然后再将 PC 内容中的低 11 位用 200H 来替代,同时程序跳到第七条 ORG200H 中,接着 RET 表示子程序返回,将原先压入堆栈的 PC 值弹出,(SP) =(SP)-2;最后两条 POP指令执
15、行后将 SP 所指地址中的内容赋给 50H,SP 减 1 后再将 SP 所指地址中的内容赋给51H,SP 内容再减 1 给 SP,最后程序结束。13. 请写出能实现下列功能的程序段:(1)一个 16 位数据,高低字节分别放在 20H 和 21H 中,试将该数乘以 2MOV A, 21HCLR CRRC AMOV 21H, AMOV A, 20HRRC AMOV 20H, A(2)16 位二进制数由高位到低位放在 30H 和 31H 单元, 将其内容加 1;MOV A, 31HADD A, #01HMOV 31H, AMOV A, 30HADDC A, #00HMOV 30H, A(3)将 DP
16、TR 中的数据减 5;CLR CMOV A, DPLSUBB A, #05HMOV DPL, AMOV A, DPHSUBB A, #00HMOV DPh, A(4)有 3 个位变量 X,Y,Z,请编写程序实现 Y=X+YZ 的逻辑关系式。X BIT 30HY BIT 31HZ BIT 32HMOV C,YANL C,ZMOV 20H,CMOV C,XORL C,20HMOV Y, C14. 将一个按高低字节存放在 21H、20H 中的一个双字节乘以 2 后,再按高低次序将结果存放到 22H、21H、20H 单元ORG 0STAR: CLR CMOV 20H,#0E2H ;设低字节的数据 是
17、E2HMOV 21H,#0F3H ;设高字节的数据是 F3HMOV A, 20HMOV B,#2HMUL ABMOV 20H,AMOV 23H,BMOV A,21HMOV B,#2HMUL ABADDC A,23HMOV 21H,AMOV 22H,BSJMP $END15.试编程,将片外 RAM 1000H1050H 单元的内容置为 55H。MOV P2,#10HMOV R0,#00HMOV A,#55HMOVX R0,AMOV R0,#50HL0: MOVX R0,ADJNZ R0,L0 SJMP $END16. 试编程统计数据区长度的程序,设数据区从片内 RAM 30H 单元开始,该数据区
18、以 0 结束,统计结果放入 2FH 中。MOV R0,#30HL0: MOV A,R0JZ L1INC R1INC R0SJMP L0L1:MOV 2FH, R117. 试编写程序,将片外 RAM 2000H200FH 数据区中的数据由大到小排列起来。ORG 0L0: MOV P2,#20HMOV R0,#00HMOV R7,#0FHCLR F0LOOP: MOVX A,R0MOV 31H,AINC R0MOVX A,R0CLR CCJNE A,31H,L1L1: JC L2DEC R0MOVX R0,AMOV A,31HINC R0MOVX R0,ASETB F0L2: DJNZ R7,LO
19、OPJB F0,L0SJMP $END18. 若晶振频率位 6MHZ,试计算下面延时子程序的延时时间DELAY: MOV R7, #0F6H ;1 个机器周期LP: MOV R6, #0FAH ;1 个机器周期DJNZ R6, $ ;2 个机器周期DJNZ R7, LP ;2 个机器周期RET ;2 个机器周期答: 机器周期为 2us,则有:1+(1+2250+2 )246+22 us =247482 us19. 试分别编写延时 20ms 和 1s 的程序设晶振频率为 12M20ms:ORG 0MOV R1,#102L1: MOV R0,#48L2: NOPNOPDJNZ R0,L2NOP D
20、JNZ R1,L1NOPNOPNOPNOPNOPNOPNOPEND1s:-ORG 0MOV R2,#50L0: MOV R1,#100L1: MOV R0,#49L2: NOPNOPDJNZ R0,L2NOP DJNZ R1,L1DJNZ R2,L0SJMP $END20. 试编写利用调用子程序的方法延时 1min 的程序。ORG 0HMOV R2,#60A0: LCALL DLYDJNZ R2,A0SJMP $DLY: MOV R2,#50L0: MOV R1,#100L1: MOV R0,#49L2: NOPNOPDJNZ R0,L2NOP DJNZ R1,L1DJNZ R2,L0RETE
21、ND21. 用查表程序求 06 之间的整数的立方。已知整数存在 A 中,查表结果存入片内 RAM 31H 中。ORG 0MOV A, #DATAMOV DPTR,#TABMOVC A, A+DPTRMOV 30H,A SJMP $TAB: DB 0,1,8,27,64,125,216END若立方数超过一个字节,在两个字节以内,由以下程序实现。ORG 0000HMOV A,#5RL AMOV R0,AMOV DPTR,#TABMOVC A, A+DPTRMOV 31H,A ;高位MOV A,R0INC AMOVC A,A+DPTRMOV 30H,A ;低位SJMP $TAB: DW 0,1,8,
22、27,64,125,216END22. 编写程序,查找在内部 RAM 的 30H50H 单元中出现 FFH 的次数,并将查找结果存入51H 单元。MOV R1,#00HMOV R0,#30HMOV R2,#21HL0: MOV A,R0CJNE A,#0FFH,L1INC R1L1: INC R0DJNZ R2,L0MOV 51H,R1SJMP $END23. 试用子程序求多项式:Y=(A+B) 2+(B+C)2 (要求:两数之和不能超过 16)X EQU 30H ;X 代表 AY EQU 31H ;Y 代表 BZ EQU 32H ; Z 代表 CF EQU 33H ;F 中存放计算结果 YM
23、OV R1,XMOV R2,YLCALL L0MOV R3,AMOV R1,YMOV R2,ZLCALL L0ADD A,R3MOV F,ASjmp $L0: MOV A,R1ADD A,R2MOV B,AMUL ABRETend24. 已知(60H)=33H,(61H)=43H,试写出程序的功能和运行结果。ORG 0000hSS: MOV R0,#61HMOV R1,#70HACALL CRRSWAP AMOV R1,ADEC R0ACALL CRRXCHD A,R1SJMP $CRR: MOV A,R0CLR CSUBB A,#30hCJNE A,#0AH,NEQAJMP BIGNEQ: JC CENBIG: SUBB A,#07HCEN: RET该程序的运行结果是:(60H)=33H, (61H)=43H, (70H)=C3H25. 内部 RAM 的 30H 单元开始存放着一组无符号数,其数目存放在 21H 单元中。试编写程序,求出这组无符号数中的最小的数,并将其存入 20H 单元中。MOV R0,#30HMOV A,R0MOV 20H,ADEC 21HLOOP: INC R0MOV A,R0CJNE A,20H,L1