第三章80C51单片机的指令系统3·180C51的指令系统具有哪些特点?答:80C51的指令系统由111条指令组成。如果按字节数分类,有49条单字节指令、46条双字节指令和16条三字节指令,以单字节指令为主;如果按指令执行时间分类,有664条单周期指令、45条双周期指令和2条(乘、除)四周期指令,以单周期指令为主。由此看来,80C51的指令系统具有存储效率高、执行速度快的特点。除此而外,指令系统还有如下特点:①可以进行直接地址到直接地址的数据传送,能把一个并行I/I口中的内容传送到内部RAM单元中而不必经过累加器A或工作寄存器Rn。这样可以大大提高传送速度和缓解累加器A的瓶颈效应。②用变址寻址方式访问程序存储器中的表格,将程序存储器单元中的固定常数或表格字节内容传送到累加器A中。这为编程翻译算法提供了方便。③在算术运算指令中设有乘法(MUL)和除法(DIV)指令。④指令系统中,一些对I/O口进行操作的指令具有读一修改一写的功能。读一修改一写指令是指:在执行读锁存器的指令时,CPU首先完成将锁存器的值通过缓冲器BUF2读人内部,进行修改、改变,然后重新写到锁存器中去。这一特点是由I/O口的准双向特性所决定的。这种类型的指令包含所有的口的逻辑操作(ANL、ORL、XRL)和位操作(JBC、CPL、MOV、SETB、CLR等)指令。⑤80C51单片机内部有一个布尔(位)处理器,对位地址空间具有丰富的位操作指令。布尔(位)操作类指令共有17条,其中包括布尔传送指令、布尔状态控制指令、布尔(位)逻辑操作指令及布尔(位)条件转移指令。3·2简述80C51的寻址方式和所涉及的寻址空间。答:①寻址方式有下列七种。●立即寻址:指在指令中直接给出操作数。●直接寻址:指在指令中直接给出操作数单元的地址。●寄存器寻址:指令中将指定寄存器的内容作为操作数。●寄存器间接寻址:指令中要到寄存器的内容所指的地址去取操作数。●相对寻址:指令中给出的操作数为程序转移的偏移量。●变址寻址:以DPTR及PC作基址寄存器,累加器A作变址寄存器,以两者内容相加形成的16位程序存储器地址作为操作数地址。●位寻址:对数据位进行操作。②各寻址方式所涉及的寻址空间如题表3-1所列。题表3-1寻址方式及寻址空间3·3访问特殊功能寄存器和外部数据存储器,应采用哪种寻址方式?答访问特殊功能寄存器,应采用直接寻址、位寻址;访问外部数据存储器,应采用寄存器间接寻址。在0~255B范围内,可用寄存器R0、Rl间接寻址:MOVXA,@R0或MOVXA,@R1MOVX@R0,A或MOVX@R1,A在0~64KB范围内,用16位寄存器DPTR间接寻址MOVXA,@DPTRMOVX@DPTR,A3·4为什么说80C51的传送指令极为丰富?为什么在某些传送中要旁路累加器A?答:(1)80C51的传送指令极为丰富80C51具有丰富的数据传送指令,能实现多种数据的传送操作。数据传送指令共有29条,占总指令数的25%还多。数据传送指令按功能可分为:一般传送指令15条,目的地址传送指令1条,累加器传送指令11条和栈操作指令2条。(2)传送中可以旁路累加器A可以进行直接地址到直接地址的数据传送,能把一个并行I/O口中的内容传送到内部RAM单元中而不必经过累加器A,这称为旁路累加器A。这样,不仅可以大大提高数据传送的速度,而且能缓解累加器A的瓶颈效应。3·5对80C51片内RAM的128~255字节区的地址空间寻址时应注意些什么?对特殊功能寄存器应采用何种寻址方式进行访问?答:①在片内RAM的128~255字节区的地址空间寻址时应注意:●只有80C52中有这部分地址空间;●在这部分地址空间,只有间接寻址方式有效,即MOV@Ri,A;i=0,1MOVA,@Rj;i=0,1②对特殊功能寄存器可有两种寻址方式:●直接寻址;●对其地址的末尾为0和8的寄存器可进行位寻址。3。6在80C51的片内RAM中,己知(30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H。分析下面各条指令,说明源操作数的寻址方式,按顺存执行各条指令后的结果。答:指令源操作数的寻址方式执行指令后的结果MOVA,40H直接寻址(A)=48HMOVR0,A寄存器寻址(R0)=48HMOVP1,#0F0H立即寻址(Pl)=0F0HMOV@R0,30H寄存器间接寻址因(R0)=48H.(30H)=Ft8H所以(48H)=38HMOVDPTR,#3848H立即寻址(DPTR)=3848HMOV40H,38H直接寻址(40H)=40HMOVR0,30H直接寻址(R0)=38HMOVD0H,R0直接寻址(D0H)=38HMOV18H,#30H立即寻址(18H)=30HMOVA,@R0寄存器间接寻址因(R0)=30H.(30H)=38H所以(A)=38HMOVP2,P1寄存器寻址(P2)=0F0H3·7设计一段程序,其功能是:将寄存器7的内容移到R6中。答:按题意程序设计如下:MOVA,R7MOVR6,A3·8现需将外部数据存储器200DH单元中的内容传送到280DH单元中,请设计程序。答:按题意程序设计如下:MOVDPTR,#200DHMOVXA,@DPTRMOVDPTR,#280DHMOVX@DPTR,A3·9已知当前PC(程存计数器)值10l0H,请用两种方法将程序存储器l0FFH中的常数送入累加器A。答:按题意有如下两种程序设计方法。方法一:MOVA,#0EFHMOVCA,@A+PC方法二:MOVDPTR,#l0FFHMOVA,#0MOVCA,@A+DPTR3.10在进行单字节减法运算时,应注意什么?答:在80C51指令系统中没有不带借位的减法,如果需要的话,应在SUBB指令前,用“CLR,C”指令将CY清零。3.11已知累加器A中存放两位BCD吗教,请编写程序其现十进制数减1。:按题意编写的程序如下:MOVB,A;保存AANLA,#0FH;屏蔽A的高4位CLRCYSUBBA,#1CJNEA,#0FH,LPMOVA,BANLA,#0F0HCLRCYSUBBA,#l0HADDA,#9HRETLP:ANLB,#0F0HORLA,BRET3·12试编写程序,将片外数据存储器中20H单元中的内容和21H单元的内容相乘,并将结果存放在22H和23H单元中,高位存放在高地址中。答:按题意编写的程序如下MOVR0,#20H;R0指向20HMOVXA,@R0;取来被乘数,MOVB,A;存入B寄存器MOVR0,#2lH;R0指向2lH(或用INCR0)MOVXA,@R0;取来乘数,人累加器AMULAB;得结果MOVR0,#22H;R0指向22H(或用INCR0)MOVX@R0,A;结果低位在22单元中MOVR0,#23H;R0指向23H(或用INCR0)MOVA,B;结果高位在23单元中MOVX@R0,A3.13已知延时程序为:DELAY:MOVR2,#0FAHLI:MOVR3,#0FAHL2:DJNZR3,L2DJNZR2,L1RET若系统的晶振频率为6MHz,求该延时子程存的延时。答:因为晶振频率为6MHz,所以机器周期为2us,DJNZ:4us;MOV:4us;RET:4us。指令周期数执行时间DELAY:MOVR2,#0FAH24usLI:MOVR3,#0FAH24usL2:DJNZR3,L224usDJNZR2.L124usRET24us其中,0FAH=250。所以,总时间=4us十(250×4us十4us)×250十4us=251.008ms。3·14请将片外数据存储器地址为40H~60H区域的数据块,全部搬移到片内RAM内RAM的地址区域,并将原数据区全都填为FFH。答:按题意编程如下:MOVR0,#40H;指向数据区首地址MOVE_PRO:MOVXA,@R0;取外部RAM中数据(用MOVX)MOV@R0,A;将数据存大片内RAM中(用MOV)INCR0;指针加1CJNER0,#61H,MOVE_PRO;到数据区末地址了吗?没有,循环MOVR0,#40H;到了,继续,重新指向数据区首地址MOVA,#0FFH;用#0FFH填充原来数据区MOVE一PRO:MOVX@R0,AINCR0CJNER0,#61H,MOVE__PRO1RET3·15试编写子程序,使间址寄存器R0所指的连续两个片外数据存储器RAM单元中的低4位二进制数,合并为一个字节,装入累加器A中。己知R0指向低地址,并要求该单元低4位放在A中的高4位。答:按题意编程如下:MOVXA,@R0;取来数据ANLA,#0FH;屏蔽高4位,保留低4位SWAPA;高4位与低4位对调MOVB,A;保存在B寄存器中INCR0;指向下一个地址MOVXA,@R0;取来数据ANLA,#0FH;屏蔽高4位,保留低4位ADDA,B;合为一个数3.16双字节与单字节无符号相乘,设被乘数存于41H、40H单元中,乘数存于R4中,乘积存于52H、51H、50H单元中(前者为高位字节,后者为低位字节,顺序排列)。请编写此乘法程序段。答:按题意编写的乘法程序段如下:(41H)(40H)(R4)×(40H)(50H)(51H)+(52H)(52H)(40H)+(51H)(51H)(50H)MOVB,40H;被乘数低位进B寄存器MOVA,R4;乘数进AMULAB;乘MOV50H,A;存积的低8位MOV40H,B;暂存积的高8位人(40H)MOVB,41H;被乘数高位进B寄存器MOVA,R4;乘数进AMULAB;乘MOV5lH,A;暂存积的低8位人(51H)MOV52H,B;存积的高8位MOVA,40H;(40H)+(51H)→(51H)CLRCADDA,5lHMOV5lH,AMOVA,52H;(52H)+(CY)→(52H)ADDCA,#0MOV52H,A3·17试计算片内RAM区40H~47H八个单元中数的算术平均值,结果存放在4AH中。答:按题意编程如下MOVR0,#40H;指向数据区首地址MOV4AH,#0;清和数4AH,4BH单元MOV4BH,#0LOOP:CLRC;清进位位MOVA,@R0;取数据ADDA,4AH;求和MOV4AH,A;存回和数单元MOVA,4BHADDCA,#0MOV4BH,AINCR0CJNZR0,#48H,LOOPMOVR2,#3;右移三次,相当于除8ACALLRR_LOOPRET;双字节(4BH,4AH)右移子程序;右移的次数在R2中;RR_LOOP:CLRC;清进位位MOVA,4BHRRCAMOV4BH,AMOVA,4AHRRCAMOV4AH,ADJNZR2,RR_LOOPRET3·18设有两个长度均为15的数组,分别存放在0200H和0500H为首地址的片外数据存储器区域中,试编写求其对应项之和的程序,结果存放在以0300H为首地址的片外数据存储器区城中。答:按题意编程如下MOVR0,#02H;设置片外RAM的首地址的高位;字节MOVRl,#05HMOVR2,#03HMOVR3,#00H;设置片外RAM的首地址的低位;字节MOVA,#0MOVB,#0COM_SUM:;求和程序MOVDPL,R3;取出地址为02XXH和05XXH中的;内容,相加MOVDPH,R0MOVXA,@DPTRMOVB,AMOVDPH,RlMOVXA,@DPTRADDA,BMOVDPH,R2;相加结果存于03XXH中MOVX@DPTR,AINCR3;片外RAM的低位地址加1CJNER3,#U5,COM_SUM;判断是否完成,否则继续RET3·19在起始地址为2100H,长度为64的数表中找出ASCII码F,将其送到1000H单元中去。答:按题意编程如下:MOVDPTR,#2100H;设置起始地址MOVR0,#0;设置当前所在地址SCH_PROO:MOVDPL,R0;设置当前地址MOVXA,@DPTR;取出当前地址的内容INCR0;地址指针加1CJNEA,#46H,SCH_PROl;判断当前地址内容是否为FMOVDPTR,#1000H;是,则存储到1000H单元中;并结束MOVX@DPTR,AR