结果:A= ,(02H)= ,(40H)= , (01H)= , P2= ,PSW= 。 解:结果:A=94H,(02H)=98H,(40H)=6EH, (01H)=40H, P2=37H,PSW=6EH。
5.A=83H,R0=17H,(17H)=34H , 执行以下指令后A=?
ANL A,#17H ORL 17H,A XRL A,@R0 CPL A
;A=03H ;(17H)=37H ;A=34H ;A=0CBH
解:每一条指令执行后的结果如注释字段所标。所以执行以下指令后A=0CBH。
6.若要完成下列数据传送,应如何用MCS-51的指令来实现。
⑴ A的内容送到P1。
解: MOV A,P1 ⑵ R1的内容传送到R0。 解: MOV A,R1 MOV R0,A
⑶ 片内RAM 20H单元的内容送片内RAM 30H单元。
解: MOV 31H,20H
⑷ 片外RAM 20H单元的内容送片内RAM 30H单元。
解: MOV R0,#20H MOVX A,@R0 MOV 30H,A
⑸ 片外RAM 20H单元的内容送片外RAM 30H单元。
解: MOV MOVX MOV MOVX R0,#20H A,@R0 R1,#30H @R1,A
⑹ 用两种方法将程序存储器ROM 3040H中的常数送到A中,已知PC当前值为3000H。
解:①MOV A,#00H MOV DPTR,#3040H MOVC A,@A+DPTR ② MOV A,#40H MOVC A,@A+PC 3000H: ? ┇ 3040H: ?
⑺ ROM 2000H单元的内容送到片外RAM 1000H单元中。
解: CLR MOV
MOV MOV MOV 解: XCH 解: MOV
A
DPTR,#2000H A,@A+ DPTR DPTR,#1000H @ DPTR,A A,B R0,#40H
⑻ 将A中的内容与寄存器B中的内容交换。
⑼ 将片内RAM 30H单元内容与片外 40H单元的内容交换。
解:
MOVX A,@R0 XCH A,30H MOVX @R0,A MOV MOVX MOV MOV MOVX MOVX
MOV MOVX
⑽ 将片外RAM 30H单元内容与片外 40H单元的内容交换。
R0,#30H A,@R0 R7,A R1,#40H A,@R1 @R0,A
A,R7
;暂存外部RAM 30H单元的内容
;外部RAM 40H单元的内容送外部RAM 30H单元 ;外部RAM 30H单元的内容送外部RAM 40H单元
@R1,A
7.设位单元00H、01H中的内容为0,下列程序段执行后P1口的8条I/O线为何状态?位单元00H、01H的值。
START:CLR C
JC LP1 CPL C
;Cy=0
;A=56H=0101 0110B ;Cy=1 ;(01H)=1
;因ACC.2=1,转向LP2 ;该指令不执行 ;P1=A=0101 0111B
MOV A,#56H
SETB 01H JB ACC.2 ,
SETB 00H
LP2: MOV P1,A
RET
LP1: MOV ACC.0,C ; ACC.0=1
解:每一条指令执行后的结果如注释字段所标。P1=0101 0111B,即P1口的8条I/O线中P0.0、P0.1、P0.2、P0.4、P0.6为高电平状态,P0.3、 P0.5、 P0.7为低电平状态,
8.下列指令哪些是非法指令? (1) CPL B
(2) ADDC B,#20H (4)MOV R1,R2
(6) CJNE @R0,#64H,LABEL (8) DJNZ @R0,LABEL (10) POP @R1 (12)MOV R7, @R0 (14) MOV R1,#1234H
(16) ORL C,/ACC.5 (18) DEC DPTR (20) SWAP B
(22) MOVC A,@A+DPTR (24) SUB A,#12H (26) DIV AB (28) JMP LABEL (30) RETI (5)×;
(6)√;
(7)×;
(8)×;
(9)√;
(3) SETB 30H,0
(5) SUBB A,@R2 (7) MOVX @R0,20H (9) PUSH B (11) RL B (13) RLC A (15) ANL R0,A (17) XRL C,ACC.5 (19) XCHD A ,R1 (23) XCH A,R1 (25) MUL A,B (27)DA A
(29) LJMP LABEL 解:(1)×; (2)×;
(21) MOVX A,@A+DPTR
(3)×; (4)×;
(10)×; (11)×; (12)×; (13)√; (14)×; (15)×; (16)√; (17)×; (18)×;
(19)×; (20);× (21)×; (22)√; (23)√; (24) ×;(25)×; (28)×; (29)√; (30)√。 9.执行下列程序填结果。
MOV SP,#2FH MOV A,#50H MOV B,#51H PUSH ACC PUSH B POP ACC POP B
;SP=2FH ;A=50H ;B=51H
;SP=30H,(30H)=50H ;SP=31H,(31H)=51H ;A=51H,SP=30H ;B=50H.SP=2FH
(26)√; (27)√;
结果:SP= ,A= ,B= ,(30H)= ,(31H)= 。
解:结果:SP=2FH ,A=51H,B=50H,(30H)=50H,(31H)=51H。
10.SP=70H,MA=1000H,SUBPR=4060H。试问下列程序中哪些是正确的?为什么?哪些程序
最好,为什么?若SUBPR=1060H,则哪个程序最好,为什么?
(1)MA: ACALL SUBPR (2)MA: LCALL SUBPR (3)MA: LJMP 4000H
┋ 4000H: ACALL SUBPR
LJMP 1003H
解:因为ACALL指令转去子程序的入口地址与ACALL的下一条指令必须在同一个2k范围,而LCALL指令转去子程序的入口地址与LCALL的下一条指令范围为64k。所以当SUBPR=4060H时,程序(2)和(3)是正确的,(1)的程序是错误的,程序(2)较(3)快捷;当SUBPR=1060H时,程序(1)和(2)是正确的,程序(3)是错误的,程序(1)较程序(2)节省一个存储单元。
11.设A=53H,PSW=81H,转移指令所在地址为3090H,执行下列各条指令后,PC=? (1)JNZ 12H (2)JNC 34H (3)JNB P,56H (4)JBC AC,78H (5)CJNE A,#50H,9AH (6)DJNZ PSW,0BCH (7)SJMP 0B4H
解:(1)因A≠0,所以转移,故PC=(3090H+2)+12H=30A4H; (2)因Cy=1,所以不转移,故PC=3090H+2=3092H; (3)因P=1,所以不转移,故PC=3090H+3=3093H; (4)因AC=0,所以不转移,故PC=3090H+3=3093H;
(5)因A≠50H,所以转移,故PC=(3090H+3)+9AH=3093H-66H=302DH(注意:补码数9AH的
最高位为1属负数,故应先求得其真值为-66H)
(6)因PSW=PSW-1=80H≠0,所以转移,故PC=(3090H+3)+0BCH=3093H-44H=304FH (7)无条件转移,PC=(3090H+2)+0B4H=3092H-4CH=3046H。 12.阅读下列程序,说明其功能。
MOV R1,#40H MOV A,@R1 RL A
;设(40H)=x ;A= x ;A=2x
MOV R0,A RL A RL A
;R0=2x
ADD A,R0 MOV @R1,A
13.执行程序填结果 (1)MOV A,#19H
ADD A,#72H DA A 结果:A= 解:A=91H (2) CLR C
x
;A=4x*2=8x ;A=8x+2x=10x
;A=2x*2=4;(40H)=10x
解:各指令的注释如程序所标,程序的功能为40H单元的内容乘10。
;A=19H ;A=8BH ;A=91H
;Cy=0 ;A=9AH ;A=81H ;A=0F3H ;A=53H,Cy=1
MOV A,#9AH SUBB A,#19H ADD A,#72H DA A
解:A=53H
结果:A=
14.设(SP)=50H,MA=0123H,SUB=0345H。执行指令“MA: ACALL SUB”后PC=?,
SP=?,(51H)=?,(52H)=?。
解:PC=0345H,SP=52H,(51H)=25H,(52H)=01H
15.(SP)=4BH,(49H)=12H,(4AH)=5AH,(4BH)=68H。执行指令“RET”后PC=?,
SP=?。
解:PC=685AH,SP=48H
习题 4
1.按下面要求编程。
(51H)= 0 ;若(50H)为奇数 1 解: MOV
MOV DIV MOV JNZ MOV SJMP
;若(50H)为偶数 A,50H B,#2 AB A,B L1 NEXT
51H,#00H;为奇数,0送51H单元
;判余数是否为0
51H,#01H;为偶数,1送51H单元
;偶数除以2的余数为0
L1: MOV
NEXT:SJMP NEXT 2.按下面要求编程。
-1;若 (50H)≤20 (51H)= 0;若 20<(50H)<40 -1;若 (50H)≥40
解:
MOV CJNE SJMP
A, 50H L4 L4 L4 L4 NEXT
;设50H单元的内容为X
;X≠20时,转向L1 ;X=20时,转向L4 ;X<20时,转向L4
;X>20且X≠40时,转向L3 ;X=40时,转向L4 ;X>4 0时,转向L4
;20<X<40时,送0到51H单元 ;X≤20或X≥40时,送-1 到51H单元
A,#20,L1
L1: JC
L2: CJNE
SJMP MOV SJMP L3:JNC
A,#40,L3
51H,#00H 51H,#0FFH NEXT
L4: MOV
NEXT: SJMP 解:
方法一: MOV CLR INC MOV CJNE SJMP 方法二 MOV MOV CLR INC DJNZ SJMP MOV MOV MOV MOV CJNE MOV MOV
LOOP: MOVX
3.试编写程序,将片外8000H开始的16个连续单元清0。
DPTR,#8000H;数据块首址 A
@DPTR,A DPTR R7,DPL R7,#10H,LOOP $
DPTR,#8000H R7,#10H A
@DPTR ,A DPTR R7,LOOP $
R0,#50H R2,#8 R0 B,@R0 A,B,NEXT NEXT1
;两数比较,若A≥B时,A中放当前数 ;若A<B时,送大数到A中 ;数据块比较完否? ;最大值送入70H单元中
A,@R0 R2,LOOP 70H,A HERE
A,@R0
;数据块首址 ;长度计数器赋初值 ;取第一个数 ;取下一个数
;数据块长度16 ;单元清0
LOOP: MOVX
4.在片内50H开始的单元中存有8个无符号数,找出其中最大数存于70H单元中。 解:
LOOP: INC
NEXT: JNC NEXT1: DJNZ HERE: SJMP
5.试编写程序,求出片内RAM 30H单元中的数据含“1”的个数,将结果存入31H单元。 解:要统计一个8位二进制数中“1”的个数,可以把这个数一位一位地移到Cy中,然后加以判断和统计。程序设计如下:
MOV
R2,#8
;移位次数