当前位置:首页 > mcs-51单片机
MOV 22H,#0FFH MOV A,20H SUBB A,21H JB OV,NEXT
JNB ACC.7,NEXT1 ;差为正则转移
CPL A ;差为负,求补为绝对值 ING A
NEXT1:MOV 22H.,#00H NEXT: SJMP $
2-14 试编写程序,求20H,21H,22H单元的三个补码数差得绝对值,即
。结果保留在A中。若运算出现溢出,则置23H单元为0FFH;否则,
置23H单元为00H。
解:此题的解法与上题相似。只是每次减法以后都要判断是否出现溢出,而不是做完两次减法以后才判断溢出。因为有可能第一次减法以后已经溢出,再作一次减法以后反倒没有溢出,而这时的结果实际上已经不正确了。例如,64-(-64)-(-1)=129。结果已经溢出,但分两步运算时,先由
64-(-64)=01000000-11000000=10000000
这时已经出现溢出,OV=1。若再作第二次减法,则结果为: 10000000-11111111=10000001
溢出标志反而被清零(因为负数减负数不可能溢出),但实际的结果并不正确。所以,需要每作完一次减法运算就检查溢出标志。程序如下:
CLR C
MOV 23H,#0FFH ;先置溢出标志 MOV A,20H
SUBB A,21H ;第一次相减 JB OV,NEXT ;溢出则结束
CLR C ;准备第二次相减 SUBB A,22H ;第二次相减 JB OV,NEXT ;溢出则结束
JNB ACC.7,NEXT1 ;差为正则转移 CPL A ;求反加一 ING A NEXT1:MOV 23H.,#00H NEXT: SJMP $
2-15 有一个16位二进制数,高8位存于21H单元,低8位存于20H单元。试问:(1)执行以下程序段,完成什么逻辑功能?(2)能否用MOV指令替代其中的XCH指令而不改变程序的逻辑功能?写出相应的程序段。(3)这两个程序段的执行结果是否完全相同?差别在那里?
CLR C XCH A,21H RRC A XCH A,21H XCH A,20H RRC A XCH A,20H
解:(1)程序完成的逻辑功能是使21H和20H中的16位二进制数右移一位,并使最高位为0,一般称为逻辑右移一位。
(2)可以用MOV指令,修改后程序段如下: CLR C MOV A,21H RRC A MOV 21H,A MOV A,20H RRC A MOV 20H,A
(3)有所差别。虽然从16位右移功能来说两者的功能是相同的,但第一个程序段执行后,累加器A的内容仍维持原值,而第二个程序段执行后将改变A中的数值。
2-16 分析以下程序段的逻辑功能。若要用MOV指令代替其中的交换指令而不改变程序的逻辑功能,应如何进行修改?设20H中存放的是两个四位二进制数。
MOV R1,#20H
XCHD A,@R1 ADD A,#01H XCHD A,@R1 XCH A,@R1 ADD A,#01H XCH A,@R1
解:程序的功能是将20H单元中的两个四位二进制数分别加1,并且舍弃可能产生的进位。如(20H)=6AH,程序执行后位(20H)=7BH。又如(20H)=9FH,执行后(20H)=A0H。
不采用交换指令而要完成同样的功能,可以有多种修改方法。以下仅为一例: MOV R1,#20H XCHD A,@R1
ADD A,#01H ;低4位加1 JB AC,NEXT ;判断低四位有无进位 ADD A,#01H ;高4位加1 NEXT: MOV @R1,A ;送回20H单元
2-17 分析以下程序段的运行结果。若是将其中的DA A指令取消,则结果会有什么不同? CLR C
MOV 20H,#99H MOV A,20H ADD A,#01H DA A MOV 20H,A
解:程序运行结果是A=00H,Cy=1,(20H)=00H。
取消DAA指令后,运行结果为A=9AH,Cy=0,(20H)=9AH。
2-18 以下的两个程序段中,R2内所存入的都是两位16进制数。试问这两个程序段各进行多少次循环?
MOV R2,#60H LOOP:??
??
DJNZ R2,LOOP
SJMP $ MOV R2,#60H LOOP:??
?? MOV A,R2 ADD A,#99H DA A MOV R2,A JNZ LOOP SJMP $
解:第一个程序段循环96次,第二个程序段循环60次。
第一个程序段中,R2的值就当作一般二进数处理。而第二个程序段中,R2的值是按两位十进数处理的,所以两者的循环次不同。
2-19 指出以下哪些指令是不存在的,并改用其它指令(或若干条指令)来实现预期的指令功能。
(1) MOV 20H,30H (2) MOV R1,R2 (3) MOV @R3,20H (4) MOV DPH,30H (5) MOV C,PSW.1 (6) MOV SMOD,C (7) MOVX R2,@DPTR (8) PUSH 20H (9) POP R0 (10) XCH R1,R2
解:其中第(1),(4),(5),(8)条指令是正确的,其余都不正确,修改结果如下: (2) MOV A,R2 MOV R1,A (3) MOV A,R3
MOV R1,A
共分享92篇相关文档