2223.1Keil软件的使用(Keil软件演示) Keil实例教程uVision2入门教程(一)Keil工程文件的建立 、设置与目标文件的获得 1.Keil工程的建立---建立工程文件,源文件的建立 2.工程的详细设置 3.编译、连接(二) Keil的调试命令、在线汇编与断点设置 1.常用调试命令 2.在线汇编 3.断点设置1.检查源程序;2.测出源程序中的 语法错误,并给出出错信息;(1)expressiontypedoesnotmatchinstruct ion(2)syntaxerror3.产生目标文件(.OBJ),并可给出列表文件(同时列出汇编语言源程序和 机器语言目标程序的文件,称之为.LST文件)和交叉索引文件(列出程序中使用的符号、变量和标号以及引用情况,称之为.CRF文件)。 2.连接程序(了解,计算机工作机理)汇编之后生成的OBJ文件必须经过链接过程,才能成为扩展名.EXE的可执行文件。链接的过程就 是调用连接程序(LINK.EXE),对OBJ文件进行定位、链接,最后生成扩展名为EXE的可执行文件。如果需要,也可生成MAP文件 和LIB文件。3.2指令、指令系统的概念指令(Instruction)是使计算机内部执行的一种操作,提供给用户 编程使用的一种命令.由构成计算机的电子器件特性所决定,计算机只能识别二进制代码。以二进制代码来描述指令功能的语言,称 之为机器语言.由于机器语言不便被人们识别/记忆/理解和使用,因此给每条机器语言指令赋予助记符号来表示,这就形成了汇编语言(asse mbly).也就是说,汇编语言是便于人们识别/记忆/理解和使用的一种指令形式,它和机器语言指令一一对应,也是由计算机的硬件特性所决 定的。(了解)指令的描述形式有两种:机器语言形式和汇编语言形式。现在描述计算机指令系统及实际应用中主要采用汇编语言形 式.采用机器语言编写的程序称之为目标程序.采用汇编语言编写的程序称之为源程序.计算机能够直接识别并执行的只有机器语言.汇编语言程序 不能被计算机直接识别并执行,必须经过一个中间环节把它翻译成机器语言程序,这个中间过程叫做汇编。汇编有两种方式:机器汇 编和手工汇编。机器汇编是用专门的汇编程序,在计算机上进行翻译;手工汇编是编程员把汇编语言指令逐条翻译成机器语言指令.现在主要使用机 器汇编,但有时也用到手工汇编.指令一般有功能、时间和空间三种属性(了解)。功能属性是指每条指令都对应一个特定的 操作功能;时间属性是指一条指令执行所用的时间,一般用机器周期来表示空间属性是指一条指令在程序存储器中存储所占用的字 节数。这三种属性在使用中最重要的是功能,但时间、空间属性在有些场合也要用到.如一些实时控制应用程序中,有时需要计算一 个程序段的确切执行时间或编写软件延时程序,都要用到每条指令的时间属性;在程序存储器的空间设计,或相对转移指令的偏移量计算时就要用到 指令的空间属性.指令的字节数(1)单字节指令:指令只有一个字节,操作码和操作数同在一个字节中。INCDPTR (A3H)MOVA,RN(E8H—EFH)(2)双字节指令:一个字节为操作码,另一个字节是操作数。 MOVA,#data(74Hdata)(3)三字节指令:操作码占一个字节,操作数占二个字节。其中操作数既可能是数据, 也可能是地址。MOVDPTR,#4000H(90H40H00H) MOV30H,#80H(7 5H,30H,80H)CJNEA,#20H,rel(B5H,20H,rel)指令的一些符号的意义:bit 内部RAM或特殊功能寄存器中的直接寻址位C或Cy 进位标志位或位处理机中的累加器。addr11 11位目的地址 addr16 16位目的地址$ 当前指令的地址(sjmp$,JNBTI,$)(常用) thesamea ddressofthecurrentinstruction理解地址和内容的关系(自学)例如:MOVA,@R1指 令的源操作数是寄存器间接寻址。该指令的功能是将以工作寄存器R1中的内容为地址的片内RAM单元的数据传送到A中去。例如:若R1中的内 容为80H,片内RAM地址为80H的单元中的内容为2FH,则执行该指令后,片内RAM80H单元的内容2FH被送到A中。寄存器间接 寻址示意图如图所示。寻址范围:(1)访问内部RAM低128个单元,其通用形式为@Ri@R0,@R1; (√)@R2,@R7;(x)(2)对片外数据存储器的64K字节的间接寻址, MOVXA,@DPTR(3)片外数据存储器 的低256字节MOVXA,@Ri(4)堆栈区:堆栈操作指令PUSH(压栈)和POP(出栈)使用堆栈指针(SP)作间址寄 存器例:设A中已存有#A4H,DPTR中已存有#1234HMOVCA,@A+DPTR;(A)←((A)+(DPTR) )操作:将A4H+1234H=12D8H单元中的数放进累加器A寻址范围包括:(1)内部RAM中的位寻址区.位有两种表示方法, 例如,17H;另一种是单元地址加上位,例如,22H.6(常用),指的是22H单元中的第7位,它们是等价的。(2)特殊功能寄存器中 的可寻址位,在指令中有如下4种的表示方法:a.直接使用位地址,例如PSW.5的位地址为0D5H.b.位名称的表示方 法(常用),例如PSW.5是F0标志位,可使用F0表示该位。c.单元地址加位数的表示方法,例如(0D0H).5。d .特殊功能寄存器符号加位数的表示方法(常用),例如PSW.5。(1)立即寻址型传送指令例1:设内部RAM(30H)= 40H,(40H)=10H,(10H)=00H,(P1)=0CAH(11001010B),分析以下程序执行后各单元及寄存器、P2 口的内容。(keilI:peripherial)MOVR0,#30H ;(R0)←30HMOVA,@R0 ; (A)←((R0)),A=40HMOVR1,A ;(R1)←(A),R1=40HMOVB,@R1 ;(B)←(( R1)),B=10HMOV@R1,P1 ;((R1))←(P1),(40H)=0CAHMOVP2,P1 ;(P2 )←(P1),P2=0CAHMOV10H,#20H ;(10H)←20H,(10H)=20H执行上述指令后的结 果为:(R0)=30H,(R1)=(A)=40H,(B)=10H,(40H)=(P1)=(P2)=CAH,(10H)=20H。例 2:设外部RAM(0203H)=0CFH,分析以下指令执行后的结果。 (KEILX:)MOVDPTR,#0203H ;(DPTR)←0203HMOVX A,@DPTR ;(A)←((DPTR))a=0CFHMOV30H,A ;(30H)←(A),(30H)=0CFHMOVA,#0FH ;(A)←0FHMOVX@ DPTR,A ;((DPTR))←(A),(0203H)=0FH例6:若在外部程序存储器中2000H 单元开始依次存放0~9的平方值,数据指针(DPTR)=3A00H,用查表指令取得2003H单元的数据后,要求保持DPTR中的内容不 变。 完成上述功能的程序如下:MOVA,#03H ;(A)←03HPUSHDPH ;保护DPTR高8位入栈P USHDPL ;保护DPTR低8位入栈MOVDPTR,#2000H ;(DPTR)←2000HMOVCA,@A +DPTR ;(A)←(2000H+03H)POPDPL ;弹出DPTR低8位POP DPH ;弹出DPTR高8位这4条8位二进制数加法指令的一个加数总是来自累 加器A,而另一个加数可由寄存器寻址/直接寻址/寄存器间接寻址和立即寻址等不同的寻址方式得到.其相加的结果总是放在累加器A中。 使用加法指令时,要注意累加器A中的运算结果对各个标志位的影响:(1)如果位7有进位,则置“1”进位标志Cy,否则清“0” Cy(2)如果位3有进位,置“1”辅助进位标志Ac,否则清“0”Ac(Ac为PSW寄存器中的一位)(3)如果位6有进位,而位7 没有进位,或者位7有进位,而位6没有,则溢出标志位OV置“1”,否则清“0”OV。2.带进位加法指令(AddwithCar ry)进位标志位Cy参加运算,因此是三个数相加。共4条:例7:(A)=85H,(20H)=FFH,Cy=1,执 行指令ADDCA,20H结果为:(A)=85H,Cy=1,Ac=1,OV=0,P=1(A中1的位 数为奇数)带借位的减法指令(subtractwithborrow)4条指令:NOTE:没有SUB指令SUBA,# 20H(X)从累加器A中的内容减去指定的变量和进位标志Cy的值,结果存在累加器A中。如果位7需 借位则置“1”Cy,否则清“0”Cy;如果位3需借位则置“1”Ac,否则清“0”Ac;如果位6需借 位而位7不需要借位,或者位7需借位,位6不需借位,则置“1”溢出标志位OV,否则清“0”OV。例8:(A)=C9H,(R2) =54H,Cy=1,执行指令:SUBBA,R2结果:(A)=74H,Cy=0,Ac=0,OV=1(位 6向位7借位)例9:设(A)=49H,(R0)=6BH,分析执行指令ADDA,R0后的结果。结果为:( A)=B4H,OV=1,CY=0,AC=1,P=0。例10:设(A)=C3H,数据指针低位(DPL)=ABH,CY=1,分析 执行指令ADDCA,DPL后的结果。结果为:(A)=6FH,CY=1,AC=0,P=0。例11:设(A) =52H,(R0)=B4H,分析执行如下指令后的结果CLRC;是位操作指令,是进位位清零 SUBBA,R0结果为:(A)=9EH,CY=1,AC=1,OV=1,P=1。NOTE:无DECDP TR指令完成dptr-1功能的程序(自学)DEC_DPTR: XCHA,DPL DECA CJNEA,# 0FFH,DEC_DPTR DECDPHDEC_DPTR2: XCHA,DPL例12:(R0)=7EH,(7E H)=FFH,(7FH)=38H,(DPTR)=10FEH,分析逐条执行下列指令后各单元的内容。INC@R0 ;使7EH单元内容由FFH变为00HINCR0;使R0的内容由7EH变为7FHIN C@R0;使7FH单元内容由38H变为39HINCDPTR;使DPL为FFH ,DPH不变INCDPTR;使DPL为00H,DPH为11HINCDPTR;使 DPL为01H,DPH不变单字节乘/除运算:(MUL/DIV——2条)两个单字节数的乘/除法运算只在A与B之间进行。例15 :假定A=83H,(R0)=17H,(17H)=34H,执行以下指令: ANLA,#17H ORL17H,A XRLA,@R0 CPLA后,A的内容为(?)。ANLA,#17H100000 11BANL00010111B=00000011BORL17H,A 00110100BORL000 00011B=00110111BXRLA,@R000110111BXRL00110100B= 00000011BCPLA00000011BCPL 11111100BBCD码是指“用二进制表达的十进制数”。如:十进制数20可以用二进制数 00010100B表示;也可以用十六进制数14H表示;还可以 用BCD码00100000B或20H表示。4个二进制位就可以表示一位BCD码:0000~1001可表 示十进制数(BCD数)0~9;8个二进制位就可以表示两位压缩的BCD码: 00000000~10011001表示00~99。??十进制调整:(1条)DAA;Decimal-Adjust Accumulatorforaddition用于两个BCD码之间的相加,这条指令只能跟在ADD或ADDC加法指令后 面若(A)3~0?9或(AC)=1则(A)3~0?(A)3~0+6;若(A)7~4?9或(C Y)=1则(A)7~4?(A)7~4+6;例13:两个十进制数“65”与“58”相加,根据常识,显然其和应当为“123”。(KE IL演示)MOVA,#65HADDA,#58H ;a=bdhDAA ;a=23h,c=1?指令“ DAA”完成的操作:65011001015801011000 +13181926601100110若(A)3~0?9或(AC)=1则(A)3~0? (A)3~0+6;若(A)7~4?9或(CY)=1则(A)7~4?(A)7~4+6;例14:两个十进制数“39”与 “58”相加,根据常识,显然其和应当为“97”。(KEIL演示)MOVA,#39HADDA,#58H;a=91hD AA ;a=97h,c=0?39001110015801011000 +0723960110MULAB ;Multiply(A)与 (B)相乘,积为16位数,(B)?积的高8位(A)?积的低8位;如果积大于255,则置“1”溢出标志位 OVDIVAB ;Divide(A)除以(B),结果用2字节表示,(B)?余数(A)?商的整数 部分;如果B的内容为“0”(即除数为“0”),则存放结果的A、B中的内容不定,并置“1”溢出标志位OV。Note:M ULBA (X)DIVAB(X)DIVA,B(X)NOTE:Youmaymulti plyanytwo8-bitvaluesusingMULABandobtainaresultthatwi llfitinthe16-bitsavailablefortheresultinAandB.Thisi sbecausethelargestpossiblemultiplicationwouldbeFFhXFFh whichwouldresultinFE01hwhichcomfortablyfitsintothe16-bi tspace.Itisnotpossibletooverflowa16-bitresultspacewit htwo8-bitmultipliers.NOTE:WhiletheMULinstructiontakestw o8-bitvaluesandmultipliesthemintoa16-bitvalue,theDIVi nstructiontakestwo8-bitvaluesanddividesitintoan8-bitva lueandaremainder.The8052doesnotprovideaninstructiontha twilldividea16-bitnumber.3.5.3逻辑运算及移位类指令(5种/24条)逻辑与运算: (ANL——6条)逻辑或运算:(ORL——6条)逻辑异或运算: (XRL——6条)累加器清零/取反:(CLR,CPL——2条)累加器移位操作:(RL,RLC,RR,RRC—4条) 逻辑与(ANL)Logicandforbytevariables逻辑或(ORL)LogicO Rforbytevariables逻辑异或(XRL)Logicexclusive-ORforbyteva riablesNOTE:异或:相同为0,相异为111ANL(ORL,XRL)A, Rn11ANL(ORL,XRL)A,@Ri12ANL(ORL,XRL)A,di rect12ANL(ORL,XRL)A,#data23ANL(ORL,XRL)direct,#d ata12ANL(ORL,XRL)direct,ATmByte指令形式Note:ANL R0,#20H(x)Orla,b(v)XRLA,#04hJZNEXT ;判断A中是否是04H累加器清 零/取反操作(CLR,CPL——2条)CLRA ;ClearAccumulator对累加 器清零,1Byte1个TmCPLA ;ComplementAccumulator对累 加器按位取反1Byte1个TmNOTE:只能对a进行操作clrr0(X)clracc(X)DATA-ADDRESSEX PECTEDNOTE:Anadditionalinstruction,CLRA,existswhichisus edtoclearthecontentsoftheaccumulator.ThisistheonlyCLR instructionthatclearsanentireSFRratherthanjustasingle bit.TheCLRAinstructionistheequivalentofMOVA,#00h.Thea dvantageofusingCLRAisthatitrequiresonlyonebyteofprog rammemorywhereastheMOVA,#00hsolutionrequirestwobytes.An additionalinstruction,CPLA,alsoexists.Thisinstructionwil lflip(取反complement)eachbitintheAccumulator.ThusiftheAc cumulatorholds255(11111111binary),itwillhold0(00000000b inary)aftertheCPLAinstructionhasexecuted.逻辑运算指令的常见用法逻辑与A NL用于某些位清0而其余位保持不变例:ANLA,#0FH;则(A)=0AH(已知累加器A中已存有数:9AH) 逻辑或ORL用于某些位置1而其余位保持不变:例:ORLA,#0FH;则(A)=9FH逻辑异或XRL用于某些 位取反而其余位不变(后面经常跟JZ/JNZ):例:XRLA,#0FH;则(A)=95H(A) ?10011010#0FH?0000111195H?10010101累 加器移位操作:(RL,RLC,RR,RRC——4条)RLA左环移累加器A累加器ARRA右环移Rot ateaccumulatorLeft(左)1bitRotateaccumulatorRight(右)1bit 累加器ACy累加器ACyRRCA带进位位右环移RLCA带进位位左环移Rotateaccumula torLeftthroughtheCarryflagRotateaccumulatorRightthrough theCarryflagNOTE:只能对A进行操作RLP0(X)RLACC(x)3.5.4控制转移类指令(4种/ 17条)此类指令改变程序的执行顺序——改变当前PC值无条件转移:(LJMP,AJMP,SJMP,JMP— —4条)条件转移(判断跳转):(难点)(JZ,JNZ,CJNE,DJNZ——8条)子程序调用及返 回:(LCALL,ACALL,RET,RETI——4条)空操作: (NOP——1条)“耗时”一个机器周期。donothing!无条件转移:LJMP,AJMP,SJMP,JM P——4条LJMPaddr16(LongJump)长跳转指令——可在64K范围内跳转AJMP addr11(AbsoluteJump)绝对跳转指令——可在指令所在的2K范围内跳转SJMPrel (ShortJump)相对跳转指令——可在当前PC:-128与+127范围内跳转JMP@ A+DPTR间接长跳转指令——可在以DPTR为基址+A为偏移量之和所指向的64 K程序范围内跳转NOTE:SomeoptimizingassemblersallowyoutouseJMPin yourcode.Whilethereisn’taJMPinstructioninthe8052instr uctionset,theoptimizingassemblerwillautomaticallyreplacey ourJMPwiththemostmemory-efficientinstruction.Thatis,itw illtrytouseSJMPorAJMPifitispossible,butwillresortto LJMPifnecessary.ThisallowsyoutosimplyusetheJMPinstruc tionandlettheassemblerworryaboutsavingprogrammemorywhen everitispossible.片内RAM中有128个位可按位寻址的位,位地址:00H—7FH分布在:20H—2FH单元 ;另外,在SFR中还有92个位可按位寻址00H20H2FH7FH1FH30H80HFFH52子系列才有的RA M区普通RAM区位寻址区工作寄存器区27H22H21H20H26H24H25H23H28H0706 0504030201000F0E0D0C0B0A090817161514 131211101F1E1D1C1B1A1918272625242322 21202F2E2D2C2B2A29283736353433323130 3F3E3D3C3B3A393847464544434241402FH7F7 E7D7C7B7A7978位地址总共128个可按位寻址的位单元地址17D7D6D5D4D3D2 D1D0复习3.551单片机汇编指令集InstructionSet学习要点:1.多上机熟悉指令;2.了解 指令的操作,了解指令的寻址方式,了解指令对PSW的影响;3.合理使用指令,只用正确使用指令的权利,不可制造指令;4.养成良好的 编程习惯(首行缩进……参考:华为编程规范)MCS-51指令集(五大类功能)了解1.数据传送类指令(29条 )2.算术运算类指令(24条)3.逻辑运算及移位类指令(24条)4.控制转移类指令 (17条)5.位操作(布尔操作)类指令(17条)内部存储器间传送:(MOV——16条)外部数据存储器与累加 器间传送:(MOVX——4条)程序存储器向累加器传送: (MOVC——2条)数据交换:(XCH/XCHD/SWAP——5条)堆栈操作:(PUS H/POP——2条)3.5.1数据传送类指令(5种/29条)Acc累加器Direct直接寻址@Ri间接寻址Rn 寄存器#data立即数Rn: R0~R7@Ri: @R0,@R1#data: 8位立即数#data16:16位立即数 direct: 直接地址rel: 8位带符号偏移量内部存储器间传送指令(16条):MOV类指令的操作方向总是后面的操作 数,指向前面的操作数!例:MOVA,30H ;(A)?(30H)NOTE:MOVA,#0FFH (√)MOVA,#18H (√)MOVA,#12 (√)MOVA,#13D (√)MOVA,#001 01111B (√)MOVA,#FEH (X)MOVA,#0AF (X)MOVA,#00101111 (X ) MOVA,#data ;data→A MOVRn,#data ;data→Rn MOV@Ri,#data ;data→(Ri) MOVdirect,#data ;d ata→direct MOVDPTR,#DATA16 ;DATA16→DPTReg:movdptr, #4000h(2)直接寻址型传送指令 MOVA,direct ;(direct)→AMOVdire ct,A ;A→(direct)MOVRn,direct ;(direct)→Rn,n=0~7 MOVdirect2,direct1 ; MOV@Ri,direct ;(direct)→(Ri)例:M EQU40HNEQU50HMOVM,NMOVM,A(3)寄存器 寻址型传送指令MOVR2,R1(X)(4)以寄存器间接地址为目的 操作数的指令 MOVRn,A ;(A)→Rn,n=0~7MOVA,Rn ;(A)→Rn,n=0~7 MOVdirect,Rn ;(direct)→Rn,n=0~7 MOV A,@Ri ;(Ri)→A,i=0,1 MOV@Ri,A ;A→(Ri),i=0,1 MOVdirect,@Ri ;(Ri)→directie:MOVB,@R0MOVA,@Ri+1(X )MOVA,@R3(X)MOV@R0,@R1(X)ProgrammingHint:Whenyo ufindyourselfinasituationthatyouneedtoexecuteatypeof MOVinstructionthatdoesn’texist,itisgenerallyhelpfultou setheaccumulator.IfagivenMOVinstructiondoesn’texistitc anusuallybeaccomplishedbyusingtwoMOVinstructionsthatbot husetheaccumulatorasatransferortemporaryregister.外部数据存储 器RAM与累加器间传送(4条):MOVX类指令可在累加器与以@DPTR或@Ri所代表的外部RAM之间进行数据传送。MOVX (eXternal外部的)MOVXB,@DPTR (X)MOVXDIRECT,@DPTR (X)MOVXA,30 H (X)MOVX30H,@DPTR (X)MOVXA,@A+DPTR (X) MOVCA,@A+D PTR(√)MOVXA,@R7 (X)Rii=0or1MOVXA,@DPTR ;(A)?((DPTR))MOVXA,@Ri ;(A)?((Ri))MOVX@DPTR,A ;((D PTR))?(A)MOVX@Ri,A ;((Ri))?(A)执行结果为:(DPTR)=020 3H,(30H)=0CFH,(0203H)=(A)=0FH。程序存储器向累加器传送指令(2条)(Code代码)MOVC A,@A+DPTRMOVCA,@A+PC——也称为查表指令,寻址方式属:“基址寄存器+变址 寄存器间接寻址”@A+DPTR或@A+PC指向程序存储器中的某单元.拟传送给累加器ACC的数据就是程序中事先写进去的表格数据。这 些表格数据往往用伪指令DB,DW等定义在程序中。NOTE:MOVCA,@DPTR (X) MOVXA,@D PTR(√)MOVCA,@DPTR+A(X)数据交换指令(5条):XCHA,direct(字节互换) Exchange交换XCHA,@Ri(字节互换)XCHA,Rn(字节互换) (A)(direct)[或((Ri)),或(Rn)]XCHDA,@Riexchangethelow-or dernibbleoftheaccumulator(bit3-0)少用累加器Acc的低4位与((Ri))的低4位互 换,各自的高4位不变SWAPAswapnibbleswithintheaccumulator累加器Acc 的低4位与自身的高4位互换例4:设(R0)=30H,30H=4AH,(A)=28H,则执行XCHA,@R 0后,结果为(A)=4AH,(30H)=28H。执行XCHDA,@R0后,结果为(A)=2AH,(30H)= 48H。执行SWAPA后,结果为(A)=82H。NOTE:TheSWAPAinstructioniside ntical(相同的)toexecutingfourRLAinstructionsorfourRRAins tructions.堆栈操作指令(2条):pushdirect ;入栈sp?sp+1,(sp)?(direct)po pdirect ;出栈(direct)?sp,(sp)?sp-1Note:√注意PUSHPOP指令数据变 化的顺序(考试必考)√堆栈区由特殊功能寄存器堆栈指针SP管理√堆栈区可以安排在RAM区任意位置,一般不安排在工作寄存器区和可按 位寻址的RAM区,而是放在RAM区的靠后的位置(30-FFHMOVSP,#70H)√堆栈总是指向栈顶单元√通常PUSH与P OP两条指令成对使用PUSHDPTR (X字) PUSHDPL(√字节)Pushdph(√)EXPRESSI ONTYPEDOESNOTMATCHINSTRUCTIONPUSHA (X) PUSHACC(√)NOTE: ThestackoperatesonaLastIn-FirstOut(LIFO)basis.Thismea nsifyouPUSHthevalues4,5,and6(inthatorder),POPpingth emoneatatimewillreturn6,5,andthen4.Thevaluemostrec entlyaddedtothestackisthefirstvaluethatwillcomeoffwh enyouexecuteaPOPinstruction.NOTE:WhenPUSHingorPOPpingt heAccumulator,youmustrefertoitasACCsincethatisthemem orylocationoftheSFR.YoumaynotassembletheinstructionPUS HAnorPOPA---bothofthesewillresultinanassemble-timeerr orinmost,ifnotall,8052assemblers.例5:设(A)=7BH,(35H)=11H,并且 (SP)=60H PUSHACC;(61H)?#7BH PUSH35H; (62H)?(35H) 即:(62H)?#11H POPACC;(A)?(62H) 即:(A)?#11H POP5AH;(5AH)?(61H)即:(5AH) ?#7BH执行结果:(A)=09H,(DPTR)=3A00H。3.5.2算术运算类指令(6种/24条)加法运算 :(ADD——4条)带进位加法运算:(ADDC——4条)带借位减法运算: (SUBB——4条)加1/减1操作:(INC,DEC——9条)单字节乘/除法运算:(M UL,DIV——2条)十进制调整:(DAA——1条)加法运算:(ADD——4条) 带进位加法运算:(ADDC——4条)带借位减法运算:(SUBB——4条)1.所有的加法(ADD),带进位加法(ADD C),带借位减法(SUBB)运算都是以A为一个加数或被减数,最终结果也存进A。2.加法(ADD),带进位加法(ADDC)以及 带借位减法(SUBB)运算中,如果产生了进位或借位,将自动对PSW中的Cy标志位置“1”。3.带进位加法(ADDC):(A)? (A)+(Cy)+(第二操作数)带借位减法(SUBB):(A)?(A)-(Cy)-(第二操作数)1.加法指令共有4条加 法运算指令:NOTE:ADDSUM,A (X)ADDDIRECT,DIRECT (X)ADDM2 ,M1 (X)ADDA,@Ri+1 (X)ADDR1,DIRECT (X) ADD A,Rn ;(A )+(Rn)→A,n=0~7 ADDA,direct ;(A)+(direct)→A ADDA,@Ri ;(A)+((Ri))→A,i=0,1 ADDA,#data ;(A)+#data→AADDCA ,Rn ;(A)+(Rn)+C→A,n=0-7ADDCA,direct ;(A)+(direct)+C→AADDC A,@Ri ;(A)+(Ri)+C→A,i=0,1ADDCA,#data ;(A)+#data+C→ANOTE: Manyother(non-8052)architecturesonlyhaveasingletypeofA DDinstruction-onethatalwaysincludesthecarrybitintheaddi tion.Thereason8052assemblylanguagehastwodifferenttypeso fADDinstructionsistoavoidtheneedtostarteveryadditionc alculationwithaCLRCinstruction.UsingtheADDinstructionis thesameasusingtheCLRCinstructionfollowedbytheADDCins truction.SUBBA,Rn ;(A)-(Rn)-Cy→A,n=0~7SUBBA,direc t;(A)-(direct)-Cy→ASUBBA,@Ri ;(A)-((Ri))-Cy→A,i=0 ,1SUBBA,#data;(A)-#data-Cy→ANOTE:SinceSUBBalwa ysincludesthecarrybitinitsoperation,itisnecessarytoal waysclearthecarrybit(CLRC)beforeexecutingthefirstSUBB inasubtractionoperationsothattheprior(先前的)statusofthec arryflagdoesnotaffecttheinstruction.加1/减1操作:(INC,DEC——9 条)INC,DEC与用加/减法指令做加1/减1操作不同之处在于INC/DEC不影响标志位(记忆).不影响程序状 态字PSW中的任何标志.若变量原来为FFH,加1后将溢出为00H(指前4条指令),标志也不会受到影响。第5条指令INCD PTR,是16位数增1指令.指令首先对低8位指针DPL的内容执行加1的操作,当产生溢出时,就对DPH的内容进行加1操作,并不影响标 志Cy的状态。INCA ;IncreaseINCRn ;n=0~7INCdirect INC@Ri ;i=0,1INCDPTRDECA ;(A)-1→ADE CRn ;(Rn)-1→Rn,n=0~7DECdirect ;(direct)-1→directDEC@Ri ;((Ri))-1→(Ri),i=0,1 减1指令不影响标志位。减1指令decrease第3章:51单片机指令系统InstructionSet 1.Keil软件的使用;2.7种寻址方式;3.MCS-51指令集(难点、重点);熟练掌握、记住指令的英文全称,多上机调试, 不要杜撰指令;把8086汇编指令忘记,完全不同,容易混淆4.(复习)把所有指令英文全称过一遍3.1Keil软件的使用3 .2指令、指令系统的概念3.3汇编指令的格式3.4单片机指令的寻址方式 3.4.1寄存器寻址 3.4.2 立即寻址 3.4.3寄存器间接寻址 3.4.4直接寻址 3.4.5变址寻址 3.4.6相对寻址 3.4.7位寻址3.5单片机汇编指令集 3.5.1数据传送类指令 3.5.2算术运算类指令 3.5.3逻辑 运算及移位类指令 3.5.4控制转移类指令 3.5.5位操作类指令(三)Keil程序调试窗口 1.存储器窗口 2.工 程窗口寄存器页 3.观察窗口(四)Keil的辅助工具和部份高级技巧辅助工具 1、外围接口 2、性能分析 3、变量来 源浏览 4、代码作用范围分析部份高级调试技巧 1、串行窗口与实际硬件相连 2、从端口送入信号 3、直接更改内存值 [view]-[memorywindow]I:00H内部RAM(2560x00-0xff)X:00H外部RAM( 64k0x0000-0xffff)C:00HROM鼠标右键-modifymemory可以修改其中的数扩展(了解): HEX是intel的目标文件格式,hex是结果输出的目标文件格式,至少Intel和Franklin是采用“intelhe x格式”。hex格式不难辨认,它的格式是文件中的所有字节是可打印的ASCII字符.其它更紧凑格式“BIN”以单一字节表示每个程序代 码字节,这样文件中有许多非打印的ASCII字符代码。HEX文件中的冒号(:)标示一个新记录,接着的两个字符是以实际数据字节 数表示的记录块的长度.典型的1O代表一个16个数据字节的块.再下面的四个字符是十六进制数用于表示块中数据的起始地址.再下面的两个字 符是块的类型码:00表示是可重定位数据,01是文件的结束标志.接下去是实际数据,每个十六进制的数字对表示一个字节,16字节数据以3 2个字符表示.最后两位数字表示校验和,很容易与数据混淆.当所有的两字符十六进制值与校验和加起来以256取模,整个结果为0。51系 列单片机指令集含有111条指令(1)每条指令在程序存储器ROM中占据一定的空间,以字节为单位。按指令所占字节数分类: 单字 节(49条);双字节(46条);3字节(16条)(2)每条指令在执行时要花去一定的时间,以机器周期为单位.按指令执行时间分类: 单周期(64条);双周期(45条);4周期(2条)(3)按指令的功能分类,可分为5大类: 数据传送类(29条);算术运算类 (24条) 逻辑运算及移位类(24);控制转移类(17条) 位操作类(17条)3.3汇编指令的格式(1)方括符[]表 示可选项(2)标号代表指令所在地址,1-8个字母/数字,“:”结尾(3)操作码就是指令功能助记符,指令实体,操作码表示计算机执 行该指令将进行何种操作(4)目的操作数/源操作数操作数表示参加操作的数的本身或操作数所在的地址[标号:]操作码[目的操作 数][,源操作数][;注释]例1:loop:djnzr7,next;R7-1≠0跳转到next … …next:……(5)4个区段之间要用分隔符分开(6)标号与操作码之间用“:”(冒号)隔开(7)操作码与操 作数之间用空格隔开(8)操作数与注释之间用“;”(分号)隔开(9)如果操作数有两个以上,则在操作数之间要用逗号“,”隔开 (乘法指令和除法指令除外)(10)这些符号“:;,”必须是在英文状态下输入(11)大小写不敏感例2:LED1:M OVDPTR,#4000HRn 当前寄存器区的8个工作寄存器R0~R7(n=0~7)。Ri当前选中的寄存器区中可作间接寻 址寄存器的2个寄存器R0、R1(i=0,1)Direct直接地址,即8位的内部数据存储器单元或特殊功能寄存器的地址。#dat a包含在指令中的8位立即数。Mova,#60h#data16包含在指令中的16位立即数(对DPTR作用)。rel 相对转移指令中的偏移量,为8位的带符号补码数(选择标号)DPTR 数据指针,可用作16位的地址寄存器。3.4单片机指令的寻 址方式1.寄存器寻址2.立即寻址3.寄存器间接寻址4.直接寻址5.变址寻址(基址寄存器+变址寄存器间接寻址)6.相对寻 址7.位寻址寻址方式:指令按地址获得操作数的方式七种寻址方式,一条指令可能含多种寻址方式1.寄存器寻址Register Addressing——从寄存器中读取操作数或存放操作数进寄存器例3:MOVA,B ;(A)←(B)M OV30H,R0 ;(30H)←(R0)MOVA,R1 ;(A)←(R1)寻址范围包括:(1)4组 通用工作寄存区共32个工作寄存器(2)部分特殊功能寄存器,例如A、B以及数据指针寄存器DPTR等。2.立即寻址Immed iateAddressing——操作数直接就出现在指令中例4:MOVA,#64H;(A)←立即数64HAD DA,#0F5H;(A)←(A)+立即数F5H注意:符号“#”表明其后跟的是立即数,立即数——就是数字量本身 .例如:MOVA,#30H指令中30H就是立即数.这一条指令的功能是执行将立即数30H传送到累加器A中的操作.mova, #20h ;(√)十六进制数mova,#20 ;(√)=mova,#20D;十进制数mova,#1000 0101b ;(√)mova,#10000101 ;(X)3.寄存器间接寻址RegisterIndirect Addressing——寄存器中的内容是一个地址,由该地址单元寻址到所需的操作数NOTE:1)“间接”表示某寄存器中的“内容 ”只是一个“单元地址”,这个地址单元中存放的数据才是要找的“操作数”.(注意区分“内容、地址”的关系) dfdsf@sohu.com2)符号“@”表示“在…”,其含义与读音皆同“at”.
MOVR1,#30H ;(R1)←立即数30HMOV@R1,#0FH ;(30H)←立 即数0FHMOVA,@R1 ;(A)←((30H))=#0FH4.直接寻址DirectAddressin g——指令中直接直接给出存放数据的地址或名称例:MOVR1,1FH;(R1)←(1FH) MOV30H,4AH;(30H)←(4AH)NOTE:访问SFR只能采用直接寻址方式.例如:MOVA,SP ;(A)←(SP)MOVA,81H ;(A)←(SP)MOVP1,#5AH;(P1)←(#5AH)MOV90H,#5AH;(P1)←(#5AH)MOVB,30H ;(B)←(30H)相同相同在本单片机中访问特殊功能寄存器SFR只能采用直接寻址方式的原因:SFR分布在80H~0FFH范围内,而52系列单片机有256字节的片内RAM,其中的80H~0FFH的RAM与SFR所占地址重叠。?MOVA,90H等效于MOVA,P1属直接寻址?MOVA,@R0;[事先已知(R0)=#90H]执行的操作:A←(90H)属寄存器间接寻址,?MOVA,85H(X)!于是规定:80H~0FFH范围内的RAM只能用寄存器间接寻址方式,而SFR只能用直接寻址方式.从而解决了地址冲突的问题.复习:存储器配置(片内RAM)89C51片内RAM128字节(00H—7FH)89C52片内RAM256字节(00H—0FFH)00H20H2FH7FH1FH30H80HFFH52子系列才有的RAM区普通RAM区位寻址区工作寄存器区SFR分布在80H-FFH其中92个位可位寻址80HFFH89C51128字节89C52256字节只能直接寻址只能寄存器间接寻址5.变址寻址IndexAddressing——也称为:基址寄存器+变址寄存器以16位的地址指针寄存器DPTR或16位的PC寄存器为基址寄存器,以累加器A为变址寄存器,两者中的“内容”形成一个16位的“地址”,该“地址”所指的存储单元中的内容才是操作数.MOVCA,@A+DPTR;(A)←((A)+(DPTR))MOVCA,@A+PC;(A)←((A)+(PC))JMP@A+DPTR6.相对寻址ComparativelyAddressing——当前PC值加上指令中规定的偏移量rel,构成实际的操作数地址(跳到标号指向的地方)例:SJMPrel操作:跳转到的目的地址=当前16位PC值+rel(了解)NOTE:1)“当前PC值”指程序中下一条指令所在的首地址,是一个16位数;2)符号“rel”表示“偏移量”,是一个带符号的单字节数,范围是:-128—+127(80H—7FH),3)在实际编程中,“rel”通常用标号代替7.位寻址BitAddressing——指令中直接给出了操作数所在的位地址。例:CLRP1.0;(P1.0)←0SETBACC.7;(ACC.7)←1CPLC;(C)←NOT(C)NOTE:1)位地址里的数据只可能是0或12)有的位地址十分明确,如P1.0,ACC.7等,有的位地址则“不太明确”,比较:MOVA,17H ;(A)←(17H),17H是字节地址MOVACC.0,17H ;(ACC.0)←(17H),这里ACC.0是位地址所以该指令中的17H是22H单元的第7位 |
|