3-6 下列各指令或指令组执行前有关寄存器和存储器的状态如下表,要求分析各指令或指令组执行后有关寄存器、存储器和标志位的状态。 内部数据存储器和特殊功能寄存外部数据存储器 程序存储器 器 寄存器内容 单元地内容 单元地内容 单元地内容 程序计数器内容 名 址 址 址 B 64H 73H 10H 900BH 12H 1206H 35H (PC)=1200H ACC 03H 72H 11H 900AH 83H 1205H 34H PSW 80H 71H 00H 9009H D1H 1204H 33H 标号及标号值 DPL 05H 70H 80H 9008H 79H 1203H 32H NEXT1=0800H DPH 90H 9007H 0CH 1201H 31H NEXT2=0900H SP 71H 36H F8H 9006H 23H 1200H 30H NEXT3=1280H R0 00H 35H 2BH 9005H 13H LOOP=1148H R1 36H 34H 36H 9004H 4DH R2 35H 33H 74H 9003H 2EH R3 B7H 32H 59H 9002H 7FH R4 03H 9001H 54H R5 F6H 26H 66H 9000H 38H R6 E4H 25H 55H R7 21H 24H 44H P0 7CH P2 90H
提示:在上表中需注意几点:(PSW)=80H,即Cy=1, AC=0, RS1=RS0=0(故当前工作寄存器区为0区)。工作寄存器区为0区时,R0~R7指向内部数据存储器的00H~07H,所以当指令中出现直接地址00H~07H中的某个时,其初始条件即为R0~R7中某个对应的寄存器的值。另,因为(DPH)=90H, (DPL)=05H, 所以(DPTR)=9005H。标号值实质上是代表标号所在处的指令在程序存储器中的地址,标号往往出现在程序转移指令中,指出转移指令的目标地址。
1) MOV R0,#32; (R0)=32=20H 2) MOV 25H,@R1; (25H)= 0F8H 3) MOVX A,@DPTR; (A)= 13H P=1 4) MOVX A,@R0; (A)= 38H P=1 5) MOVC A,@A+PC; (A)= 33H P=0 6) MOV A,04H; (A)= 03H P=0 7) XCH A,34H; (A)= 36H (34H)= 03H 8) XCHD A,@R1; (A)= 08H (36H)=0F3H 9) PUSH DPL; (SP)=72H (72H)=05H 10) POP DPH; (DPH)=00H (SP)=70H 11) SUBB A,R1; (A)= 0CCH Cy=1 P=0 AC=1 OV=0 12) ADD A,R6; (A)= 0E7H Cy=0 P=0 AC=0 OV=0 13) ADDC A,36H; (A)= 0FCH Cy=0 P=0 AC=0 OV=0 14) MUL AB; (A)= 2CH (B)=01H 15) INC R0; (R0)= 01H 16) DEC A; (A)= 02H P=1 17) ADD A,#49H;
DA A; (A)=52H Cy=0 P=1 18) ANL A, R1; (A)= 02H (R1)=36H P=1 19) ORL A,32H; (A)= 5BH P=1
20) ORL 26H,#35H; (26H)=77H P=0 21) XRL A,@R0; (A)= 03H P=0 22) XRL A, ACC; (A)=0 P=0 23) XRL A,#0FFH; (A)= 0FCH P=0 24) CPL A; (A)=0FCH P=0 25) RL A; (A)=06H Cy=1 26) RRC A; (A)=81H Cy=1 27) MOV C,(25H).2; Cy=1 28) MOV F0,C; (PSW)=0A0H 29) SETB RS0; (PSW)=88H 30) CLR C; (PSW)=0 31) ANL C,(24H).0 Cy=0 32) JZ NEXT1; (PC)=1202H 33) JC NEXT2; (PC)= 0900H 34) CJNE A, 25H, NEXT3; (PC)= 1280H Cy=1 35) DJNZ R7,LOOP; (PC)= 1148H (R7)=20H 36) LCALL 1800H; (PC)=1800H (SP)=73H (72H)=03H (73H)=12H 37) RET; (PC)=0080H (SP)=6FH 38) ANL C, /32H; Cy=0 (32H)=1 ,提示此处32H为位存储器 39) STOP: JBC P0.3, STOP; (PC)=1200H (P0)=74H 40) JNB P0.4, NEXT1; (PC)=1203H
3-7 分析下列程序段的功能。
1) MOV A, R3
MOV R4, A
功能:将R3中的内容送入R4,即(R3)→R4 2) MOV A, R5
CPL A
MOV R5, A
功能:R5中的数据按位取反后送回R5 3) MOV A, R4
MOV B, R5 DIV AB MOV R4, B MOV R5, A
功能:R4中的数除以R5中的数,结果商送入R5,余数送入R4 4) MOV C, P1.1
ANL C, P1.2 ANL C, /P1.3 MOV P1.6, C
功能:P1.1P1.2
→P1.6
5) MOV C, 0
ORL C, 1 MOV F0, C MOV C, 2 ORL C, 3 ANL C, F0 MOV P1.7, C
功能:((20H).0∨(20H).1) ∧ ((20H).2∨(20H).3) →P1.7
6) CLR C
MOV A, R4 RLC A
MOV R4, A MOV A, R3 RLC A
MOV R3, A
功能:R3、R4中的内容左移一位,R4最低位移入0,R4最高位移入R3最低位,R3最高位移出至Cy。
7) CLR C
MOV A, R5 RLC A ADD A, R5 MOV R5, A
功能:
8) CLR A
MOV R0, A MOV R7, A
LOOP: MOV @R0, A INC R0
DJNZ R7, LOOP STOP: SJMP STOP
功能:将内部数据存储器00H~0FFH 256个单元全部清零。 9) PUSH ACC
PUSH B POP ACC POP B
功能:利用堆栈将ACC与B中的内容互换,即(ACC)(B)
10) MOV R0, #30H
XCHD A, @R0 SWAP A INC R0
XCHD A, @R0 SWAP A
MOV 40H , A
功能:将ACC的低四位送入30H单元低四位,ACC的高四位送入31H的低四位,而原先30H单元的低四位送入40H单元的低四位,原31H单元的低四位送入40H单元的高四位。
举例说明如下,设程序段运行前有(ACC)=12H,(30H)=34H,(31H)=56H; 则程序段运行后有(30H)=32H,(31H)=51H, (ACC)= (40H)=64H;该程序段可用来将单字节BCD转压缩BCD. 3-8 指出下列指令中哪些是合法指令,哪些是非法指令。
MOV P1, R4 ;合法 MOV R2,R4 ;非法 CLR R3 ;非法 RLC R5 ;非法 MOV 30H, 31H ;合法 MOV 00H, P ;非法 ORL 40H, R7 ;非法 PUSH R6 ;非法 POP R0 ;非法
INC DPTR ;合法
注:常见的错误还有类似:MOV R0, C; ADD 30H,31H; MOV A, @R5; DEC DPTR等,编程时切记勿错! 3-9 按要求编制下列各程序段。
将内部数据存储器30H和31H单元的内容互换。
法一: MOV A, 30H XCH A ,31H MOV 30H, A 法二: XCH A, 30H XCH A ,31H XCH A, 30H
比较法一、法二的优缺点,你认为哪个方法更好?
将寄存器R7的内容向右循环移位一次。 XCH A, R7 RR A
XCH A, R7
将寄存器R3的内容乘以4(结果不超出8为二进制数的范围)。 法一: MOV A, R3 MOV B, #4 MUL AB MOV R3, A 将寄存器DPTR的内容减1。 法一:判断DPL=0否?如是, DPL减1后,DPH也减1;否则,DPH不变。 XCH A, DPL JNZ NOB DEC DPH NBO: XCH A, DPL DEC DPL 法二: XCH A, R3 RL A RL A XCH A, R3 法三: (DPH)(DPL)+0FFFFH→DPTR XCH A, DPL ADD A, #0FFH XCH A, DPL XCH A, DPH ADDC A, #0FFH XCH A, DPH 法二: (DPH)(DPL) -1→DPH,DPL(即DPTR) CLR C XCH A, DPL SUBB A, #1 XCH A, DPL XCH A, DPH SUBB A, #0 XCH A, DPH 比较以上各方法,其中法三利用了-1的补码是0FFFFH的原理,将减法改为了加法。
将寄存器R6的内容压入堆栈(设寄存器工作在3区) PUSH 1EH
将R4, R5寄存器连接起来循环右移一位。(设R4为高8位,R5为低8位;执行完后R4R5中的内容右移一位,R4的最低位移入R5的最高位,同时R5的最低位移入R4的最高位) XCH A, R4 ;将R4中的内容送入ACC,同时将ACC的内容放入R4中暂存。 RRC A ;ACC中原先R4的内容右移一位,同时Cy移入最高位,而原先R4的最低位移入Cy位 XCH A, R5 ;R5中的内容送入ACC,上一步中产生的ACC的内容送入R5暂存 RRC A ;ACC中原先R5的内容右移一位,Cy(即原R4的最低位)移入最高位,而原R5的最低位移入Cy位
XCH A, R5 ;将结果送入R5(R5移位已完成),同时将第三步暂存在R5中的内容取出。 MOV ACC.7, C ;将Cy位中存放的原R5的最低位送入ACC的最高位(即送入R4的最高位) XCH A, R4 ; 将结果送入R4,同时取出ACC原来的值
相关推荐: