MOV A, #30H MOV 51H, A
解:
结果为:(A)=30H (R0)=50H (50H)=00H (51H)=30H 15.设堆栈指针(SP)=60H,片内RAM中的(30H)=24H,(31H)=10H。执行下列程序段后,61H, 62H, 30H, 31H, DPTR及SP中的内容将有何变化?
PUSH 30H PUSH 31H POP DPL POP DPH MOV 30H, #00H MOV 31H, #0FFH
解:
结果为: 61H、62H单元为堆栈单元,其内容已被弹出栈。 (30H)=00H (31H)=0FFH (DPTR)=2410H (SP)=60H 16.在8051的片内RAM中,已知(20H)=30H,(30H)=40H,(40H)=50H,(50H)=55H。分析下面各条指令,说明源操作数的寻址方式,分析按顺序执行各条指令后的结果。
MOV MOV MOV MOV MOV MOV MOV
A, 40H R0, A
P1, #0F0H @R0, 20H 50H, R0 A, @R0 P2, P1
解:
指令 源操作数的寻址方式 执行指令后的结果
MOV A,40H 直接寻址 (A)=50H MOV R0,A 寄存器寻址 (R0)=50H MOV P1,#80H 立即寻址 (P1)=80H MOV @R0,20H 寄存器间接寻址 (50H)=30H MOV DPTR,#2000H 立即寻址 (DPTR)=2000H MOV 40H,30H 直接寻址 (40H)=40H MOV R0,30H 直接寻址 (R0)=40H MOV D0H,R0 直接寻址 (D0H)=40H MOV 10H,#10H 立即寻址 (10H)=10H MOV A,@R0 寄存器间接寻址 (A)=50H MOV P2,P1 直接寻址 (P2)=80H
17.完成以下的数据传送过程
(1)R1的内容传送到R0。
(2)片外RAM 20H单元的内容送R0。
(3)片外 RAM 20H单元的内容送片内RAM 20H单元。 (4)片外RAM 1000H单元的内容送片内 RAM 20H单元。 (5)ROM 2000H单元的内容送R0。
(6)ROM 2000H单元的内容送片内RAM 20H单元。 (7)ROM 2000H单元的内容送片外RAM 20H单元。 解:
(1)R1的内容传送到R0 ; MOV A, R1 MOV R0, A
(2)片外RAM 20H单元内容送R0 ; MOV R1, #20H MOVX A, @R1
9
MOV R0, A
(3)片外 RAM 20H单元的内容送片内RAM 20H单元; MOV R0, #20H MOVX A, @R0 MOV 20H, A
(4)片外RAM 1000H单元的内容送片内 RAM 20H 单元; MOV DPTR, #1000H MOVX A, @DPTR MOV 20H, A (5)ROM 2000H单元的内容送R0单元; CLR A
MOV DPTR, #2000H MOVC A,@A+DPTR MOV R0, A
(6)ROM 2000H 单元的内容送片内RAM 20H单元; CLR A
MOV DPTR, #2000H MOVC A,@A+DPTR
MOV 20H, A
(7)ROM 2000H单元的内容送片外RAM 20H单元。 CLR A
MOV DPTR, #2000H MOVC A,@A+DPTR MOV R0, #20H MOVX @R0, A
18.设有两个4位BCD码,分别存放在片内RAM的23H, 22H单元和33H, 32H单元中,求它们的和,并送入43H, 42H单元中去。(以上均为低位在低字节,高位在高字节)。 解: ORG 0000H
LJMP START ORG 0030H START: MOV A,22H ADD A,32H DA A MOV 42H,A MOV A,23H ADDC A,33H DA A MOV 43H,A SJMP $
END
19.编程将片内RAM的40H~60H单元中内容送到片外RAM以3000H开始的单元中。并将原片内RAM数据块区域全部清0。 解: ORG 0000H MOVX @DPTR,A
LJMP MAIN CLR A ORG 0030H MOV @R1,A
INC R1 MAIN: MOV SP, #60H
INC DPTR MOV R7,#21H
DJNZ R7,LOOP MOV R1,#40H
SJMP $ MOV DPTR,#3000H
END
LOOP: MOV A,@R1
20.编程计算片内RAM区30H~37H 的8个单元中数的算术平均值,结果存放在3AH单元中。
ORG 0030H 解: ORG 0000H
MAIN: MOV R0,#30H LJMP MAIN
10
CLR C MOV R1,#00H
LP3:MOV A,R1 MOV R2,#00H
RRC A MOV R3,#08H
MOV R1,A LP2: MOV A,@R0
MOV A,R2 ADD A,R2
RRC A MOV R2,A
MOV R2,A JNC LP1
DJNZ R3,LP3 INC R1
MOV 3AH,R2 LP1: INC R0
SJMP $ DJNZ R3,LP2
END MOV R3,#03H
21.编写计算下式的程序,设乘积的结果均小于255。A, B值分别存放在片外RAM的2001H和2002H单元中,结果存于2000H单元中。 (A+B)×(A+B)+10 若(A+B)×(A+B)<10
Y= (A+B)×(A+B) 若(A+B)×(A+B)=10
(A+B)×(A+B)-10 若(A+B)×(A+B)>10
解:
ORG 0000H SJMP NET3
LJMP START NET1: JNC NET2 ORG 0030H CLR C START: MOV DPTR,#2001H MOV A,R1 MOVX A,@DPTR SUBB A,#10 MOV 30H,A MOV DPTR,#2000H MOV DPTR,#2002H MOVX @DPTR,A MOVX A,@DPTR SJMP NET3 ADD A,30H NET2: MOV A,R1 MOV B,A ADD A,#10 MUL AB MOV DPTR,#2000H MOV R1,A MOVX @DPTR,A CJNE A,#10,NET1 NET3: SJMP $ MOV DPTR,#2000H END MOVX @DPTR,A
22.设有两个长度均为15的数组,分别存放在片外RAM以2000H和2100H开始的存储区中,试编程求其对应项之和,结果存放在以2200H为首地址的存储区中。
MOVX @DPTR,A 解: ORG 0000H
MOV DPTR,#2000H LJMP MAIN
MOV R1,#30H ORG 0030h
MOV R2,#15 MAIN: MOV DPTR,#2000H
LOOP: MOVX A,@DPTR MOV A,#OFFH
MOV @R1,A MOVX @DPTR,A
INC DPTR MOV DPTR,#2100H
INC R1 MOV A,#34H
DJNZ R2,LOOP MOVX @DPTR,A
MOV R1,#30H MOV DPTR,#2008H
MOV DPTR,#2100H MOV A,#33H
MOV R2,#15 MOVX @DPTR,A
MOV R0,#40H MOV DPTR,#2108H
LOOP1: MOV A,#44H
MOVX A,@DPTR MOVX @DPTR,A
CLR C MOV DPTR,#200EH
ADDC A,@R1 MOV A,#0EEH
MOV @R0,A MOVX @DPTR,A
INC DPTR MOV DPTR,#210EH
INC R1 MOV A,#32H
11
INC R0 MOVX @DPTR,A DJNZ R2,LOOP1 INC R0
MOV DPTR,#2200H INC DPTR
MOV R2,#15 DJNZ R2,LOOP2 MOV R0,#40H SJMP $ LOOP2: MOV A,@R0 END
23.设有100个有符号数,连续存放在片外RAM以2000H为首地址的存储区中,试编程统计其中正数、负数、零的个数。
SJMP NET3 解: ORG 0000H
NET1: JB ACC.7 NET2 LJMP MAIN
ORG 0030H INC R4
SJMP NET3 MAIN: MOV R2,#100
NET2: INC R5 MOV R3,#00H
NET3: INC DPTR MOV R4,#00H
DJNZ R2,LOOP MOV R5,#00H
SJMP $ MOV DPTR,#2000H
END LOOP: MOVX A,@DPTR
CJNE A,#00H,NET1 INC R3
24.试编一查表程序,从外部RAM首地址为2000H、长度为9FH的数据块中找出第一个ASCII码A,将其地址送到20A0H和20A1H单元中。
MOV A, R2 解: ORG 0000H
MOVX @DPTR,A LJMP MAIN
INC DPTR ORG 0030H
MOV A, R3 MAIN: MOV SP, #60H
MOVX @DPTR,A MOV DPTR,#2000H
SJMP LP2 MOV R7,#9FH
LP1: INC DPTR LP0: MOVX A,@DPTR
DJNZ R7, LP0 CJNE A, #41H, LP1
LP2: RET MOV R2,DPL
MOV R3,DPH END
MOV DPTR,#20A0H
25.编程把片外RAM中以2040H为首地址的连续50个单元中的无符号数按降序排列,存放到以3000H为首地址的存储区中。 解: ORG 0000H CJNE A,21H,LOOP
LJMP MAIN LOOP: JNC LOOP1 ORG 0100H MOV A,20H MAIN: MOV DPTR,#2040H MOVX @DPTR,A MOV R2,#50 DEC DPTR CLR 7FH MOV A,21H DEC R2 MOVX @DPTR,A LS: MOVX A,@DPTR INC DPTR MOV 20H,A SETB 7FH INC DPTR LOOP1: DJNZ R2,LS MOVX A,@DPTR JB 7FH,MAIN MOV 21H,A SJMP $ MOV A,20H END
26.在片外RAM以2000H为首地址的存储区中,存放着20个用ASCII码表示的0~9之间的数,试编程将它们转换成BCD码,并以压缩BCD码(即一个单元存放两位BCD码)的形式存放在以3000H开始的单元中。 解: ORG 0000H MOV R1,#30H
LJMP MAIN MOV DPTR,#2000H ORG 0030H TT: MOVX A,@DPTR MAIN: MOV R2,#0AH CLR C
12