(3)ADD A,R0
结果:(A)=AAH,CY=0,AC=0,OV=1,P=0 (4)ADD A,30H
结果:(A)=1FH,CY=1,AC=0,OV=0,P=1 (5)ADD A,#30H
结果:(A)=AAH,CY=0,AC=0,OV=1,P=0 (6)ADDC A,30H
结果:(A)=20H,CY=1,AC=1,OV=0,P=1 (7)SWAP A
结果:(A)=A7H,对标志位无影响 (8)XCHD A,@R0
结果:(A)=75H,(30H)=AAH,(R0)=AAH,P=1 (9)XCH A,30H
结果:(A)=0A5H,(30H)=7AH,P=0 (10)XCH A,R0
结果:(A)=30H,(R0)=7AH,P=0 (11)MOV A,@R0 结果:(A)=0A5H,P=0 (12)XCH A,@R0
结果:(A)=0A5H,(30H)=7AH,P=0 3-5 试分析以下程序段的执行结果: MOV SP,#3AH MOV A,#20H MOV B,#30H PUSH ACC PUSH B POP ACC POP B
结果:(SP)=3AH,(A)=30H,(B)=20H,(3BH)=20H,(3CH)=30H 3-6 指出下列指令的执行结果,并写出每条指令的机器码。 MOV 30H,#52H MOV A,#70H MOV A,30H MOV R0,#30H
;(30H)=52H ;(A)=70H ;(A)=52H ;(R0)=30H
01110101(753052H) 01110100(7470H) 11100101(E530H) 10101000(7830H)
MOV A,@R0 MOV A,#70H MOVX @DPTR,A MOV 30H,#40H MOV R0,#30H MOV A,@R0
;A=52H ;(A)=70H ;(2030H)=70H ;(30H)=40H ;(R0)=30H ;(A)=40H
11100010(E6H) 01110100(74H) 10010000(90H) 11110000(F0H) 01110101(75H) 01111000(78H) 11100110(E6H)
3-7 分析下列指令的执行结果,并写出每条指令的机器码。 MOV DPTR,#2030H ;(DPTR)=2030H
3-8 设R0的内容为32H,A的内容为48H,内部RAM的32H单元内容为80H,40单元内容为08H,指出在执行下列程序段后上述各单元内容的变化。
MOV A,@R0 MOV @R0,40H MOV 40H,A MOV R0,#35H
结果:(R0)=35H,(A)=80,(32H)=08H,(40H)=80H
3-9 已知:(A)=81H,(R0)=20H,(20H)=35H,指出执行完下列程序段后A的内容。
ANL A,#17H ORL 20H,A XRL A,@R0 CPL A 结果:(A)=CBH
3-10 用指令实现下述数据传送:
(1)内部RAM20H单元送内部RAM40H单元。 答:MOV 40H,20H
(2)外部RAM20H单元送R0寄存器。 答:MOV R1,#20H MOVX A,@R1 MOV R0,A (3)外部RAM20H单元送内部RAM20H单元 答:MOV R1,#20H MOVX A,@R1 MOV 20H,A (4)外部RAM1000H单元送内部RAM20H单元 答:MOV DPTR,#1000H MOVX A,@DPTR MOV 20H,A (5)外部ROM1000H单元送内部RAM20H单元。
答:MOV DPTR,#1000H MOV A,#00H MOVC A,@A+DPTR MOV 20H,A (6) 外部ROM1000H单元送外部RAM20H单元。
;(A)=00000001 ;(20H)=00110101 ;(A)=00110100 ;(A)=11001011
答:MOV DPTR,#1000H MOV A,#00H MOVC A,@A+DPTR MOV R1,#20H MOVX @R1,A
3-11 已知16位二进制数的高8位和低8位分别存放在20H和21H单元,请编写将其右移一们的程序。
CLR C MOV A,20H RRC A MOV 20H,A MOV A,21H RRC A MOV 21H,A
3-12 编程实现内部RAM R0~R7的内容传递到20H~27H单元。
3-13 试编程进行两个16位数的减法,6F5DH-13B4H,结果存入内部RAM的30H和31H单元,30H存放差的低8位。
CLR C MOV A,#5DH SUBB A,#B4H MOV 30H,A MOV A,#6FH SUBB A,13H MOV 31H,A
3-14 编写程序,若累加器A的内容分别满足下列条件时,程序则至LABEL存储单元,设A中存放的是无符号数。
①A>=10 CJNE A,#10H,LAB LAB:JNC LABEL ...... LABEL:
②A>0 JNZ LABEL ...... LABEL:
③(A)<=10 MOV R0,A MOV A,#10 CJNE A,R0,LAB LAB:JNC LABEL ...... LABEL:
3-15 已知(SP)=25H,(PC)=2345H,(24H)=12H,(25H)=34H,(26H)=56H.问此时执行“RET”指令后,(SP)=?,(PC)=?
答:(SP)=23H,(PC)=3412H
执行RET时,PCH←(SP),SP←SP-1,PCL←(SP),SP←SP-1
3-16 若(sp)=25H,(PC)=2345H,标号LABEL所在的地址为3456H,问执行调用指令“LCALL LABEL”后,堆栈指针和堆栈内容发生什么变化?(PC)的值等于什么?
答:最后堆栈指针SP=27H。堆栈指针SP=26H处SP内容为45H,指针SP=27H处内容为23H。最后程序计数器指针PC=3456H。
执行LCALL后,PC←PC+3,SP←SP+1,(SP) ←PCL,SP←SP+1,(SP)←PCH,PC←addr16。
3-17 试编写程序,查找在内部RAM的20H~50H单元中是否有0AAH这一数据。若有,则将51H单元置01H,若未找到,则将51H单元置00H。
MOV 51H,#00H MOV R0,#20H CJNE A,#0AAH,NEXT INC 51H
SJMP EEE CJNE R0,#51H,LOOP
;先设没找到 ;起始地址 ;取出数字 ;不相等就跳转 ;相等将51单元置1 ;找到转去结束 ;下一个地址 ;地址没找完就继续 ;暂停
LOOP: MOV A,@R0
NEXT: INC R0 EEE: SJMP $
3-18 试编写程序,统计在外部RAM 2000H~205FH单元中出现00H的次数,并将统计结果丰收入内部RAM 50H单元。
MOV R0,#00H MOV DPTR,#2000H MOV R1,#60H JNZ NEXT INC R0
;RO设为计数器,初始为0 ;置片外RAM起始地址 ;置传送数据个数 ;外部RAM单元内容送A ;传送数据不为0 跳转 ;传送数据为0,计数器加1 ;下一个地址 ;地址没找完就继续 ;统计结果存入50H单元 ;暂停
LOOP: MOVX A,@DPTR
NEXT: INC DPTR
DJNZ R1,LOOP MOV 50H,R0 SJMP $
3-19 已知R3和R4中存有一个16位的二进制数,高位在R3中代位在R4中。请编程将其求补,并存回原处。
答:首先假设R3、R4中是原码,根据原码求补的方法当最高位(R3的D7位)为0时表示为正数,那么补码与原码相同,当最高位为1时,表明是负数,
负数的补码是最高位不变,其余位取反加1.
MOV A,R3 JB ACC.7,NEG SJMP $ CPL A CLR C ADD A,#01H
MOV R4,A MOV A,R3 CPL A ADDC A,#00H SETB ACC.7 MOV R3,A SJMP $
NEG: MOV A,R4
3-20 编写一个程序,把片外RAM从2000H开始存放的10个数传送到片内RAM 30H开始单元。
START: MOV R0,#30H
MOV R1,#10H MOV DPTR,#2000H MOV @R0,A
INC R0 INC DPTR DJNZ R1,LOOP SJMP $
LOOP: MOVX A,@DPTR
3-21 试编程将内部RAM的30H至4FH单元的内容分别传送到外部RAM的2040H~205FH单元。
START: MOV R0,#30H
MOV R1,#20H MOV DPTR,#2040H MOVX @DPTR,A
INC DPTR INC R0 DJNZ R1,LOOP SJMP $
LOOP: MOV A,@R0
3-22 若外部RAM的(2000H)=X,(2001H)=Y,编程实现Z=3X+2Y,结果存入内部RAM的20H单元,设Z<=255。
START: MOV DPTR,#2000H
MOVX A,@DPTR MOV B,#03H MUL AB MOV R0,A
INC DPTR MOVX A,@DPTR ADD A,A ADD A,R0 MOV 20H,A
3-23 试对内部RAM 20H单元的内容进行判断,若为正数,转向2100H若为负数,转向2200H;若为0,转向2300H。
START: MOV A,20H
JB ACC.7,NEG JNB ACC.7, POSI
;为负数 ;为0