第四章汇编语言程序设计基础4.1单片机指令速记:英文还原法汇编指令是采用助记符的形式构成的指令系统,很多指令的均是对应功能的英文单词的缩写,下面还原了一些指令的英文单词来源,便于加深对于指令的记忆和功能的理解。DEC(Decrement):减1INC(Increment):加1ADD:加SUBB(Subtract):减DIV(Divide):除MUL(Multiply):乘CLR(Clear):清零ANL(AndLogic):逻辑与RL(RecursionLeft)循环左移RR(RecursionRight)循环右移XCH(Exchange):字节交换SWAP:高低四位互换JMP(Jump):跳LJMP(LongJump):长跳转SJMP(ShortJump):短跳转AJMP(AbsoluteJump):绝对跳转CALL:调用ACALL(absolutecall):绝对调用LCALL(longcall):长调用JZ(JumpZero):累加器A为0跳转JNZ(JumpNotZero):累加器A不为0跳转CJNE(CompareJumpNotEqual):比较不相等跳转DJNZ(DecJumpNotZero):减1不为0跳转4.2MCS-51单片机汇编指令速查表MCS51汇编指令速查表类别指令格式功能简述字节数周期数据传送类指令期MOVA,Rn寄存器送累加器11MOVRn,A累加器送寄存器11MOVA,@Ri内部RAM单元送累加器11MOV@Ri,A累加器送内部RAM单元11MOVA,#data立即数送累加器21MOVA,direct直接寻址单元送累加器21MOVdirect,A累加器送直接寻址单元21MOVRn,#data立即数送寄存器21MOVdirect,#data立即数送直接寻址单元32MOV@Ri,#data立即数送内部RAM单元21MOVdirect,Rn寄存器送直接寻址单元22MOVRn,direct直接寻址单元送寄存器22MOVdirect,@Ri内部RAM单元送直接寻址单元22MOV@Ri,direct直接寻址单元送内部RAM单元22MOVdirect2,direct1直接寻址单元送直接寻址单元32MOVDPTR,#data1616位立即数送数据指针32MOVXA,@Ri外部RAM单元送累加器(8位地址)12MOVX@Ri,A累加器送外部RAM单元(8位地址)12MOVXA,@DPTR外部RAM单元送累加器(16位地址)12MOVX@DPTR,A累加器送外部RAM单元(16位地址)12MOVCA,@A+DPTR查表数据送累加器(DPTR为基址)12MOVCA,@A+PC查表数据送累加器(PC为基址)12算术运算类指令XCHA,Rn累加器与寄存器交换11XCHA,@Ri累加器与内部RAM单元交换11XCHDA,direct累加器与直接寻址单元交换21XCHDA,@Ri累加器与内部RAM单元低4位交换11SWAPA累加器高4位与低4位交换11POPdirect栈顶弹出指令直接寻址单元22PUSHdirect直接寻址单元压入栈顶22ADDA,Rn累加器加寄存器11ADDA,@Ri累加器加内部RAM单元11ADDA,direct累加器加直接寻址单元21ADDA,#data累加器加立即数21ADDCA,Rn累加器加寄存器和进位标志11ADDCA,@Ri累加器加内部RAM单元和进位标志11ADDCA,#data累加器加立即数和进位标志21ADDCA,direct累加器加直接寻址单元和进位标志21INCA累加器加111INCRn寄存器加111INCdirect直接寻址单元加121INC@Ri内部RAM单元加111INCDPTR数据指针加112DAA十进制调整11SUBBA,Rn累加器减寄存器和进位标志11SUBBA,@Ri累加器减内部RAM单元和进位标志11SUBBA,#data累加器减立即数和进位标志21SUBBA,direct累加器减直接寻址单元和进位标志21DECA累加器减111DECRn寄存器减111DEC@Ri内部RAM单元减111DECdirect直接寻址单元减121MULAB累加器乘寄存器B14DIVAB累加器除以寄存器B14逻辑运算类指令ANLA,Rn累加器与寄存器11ANLA,@Ri累加器与内部RAM单元11ANLA,#data累加器与立即数21ANLA,direct累加器与直接寻址单元21ANLdirect,A直接寻址单元与累加器21ANLdirect,#data直接寻址单元与立即数31ORLA,Rn累加器或寄存器11ORLA,@Ri累加器或内部RAM单元11ORLA,#data累加器或立即数21ORLA,direct累加器或直接寻址单元21ORLdirect,A直接寻址单元或累加器21ORLdirect,#data直接寻址单元或立即数31XRLA,Rn累加器异或寄存器11XRLA,@Ri累加器异或内部RAM单元11XRLA,#data累加器异或立即数21XRLA,direct累加器异或直接寻址单元21XRLdirect,A直接寻址单元异或累加器21XRLdirect,#data直接寻址单元异或立即数32RLA累加器左循环移位11RLCA累加器连进位标志左循环移位11RRA累加器右循环移位11RRCA累加器连进位标志右循环移位11CPLA累加器取反11CLRA累加器清零11控制转移ACCALLaddr112KB范围内绝对调用22AJMPaddr112KB范围内绝对转移22LCALLaddr162KB范围内长调用32LJMPaddr162KB范围内长转移32类指令SJMPrel相对短转移22JMP@A+DPTR相对长转移12RET子程序返回12RET1中断返回12JZrel累加器为零转移22JNZrel累加器非零转移22CJNEA,#data,rel累加器与立即数不等转移32CJNEA,direct,rel累加器与直接寻址单元不等转移32CJNERn,#data,rel寄存器与立即数不等转移32CJNE@Ri,#data,relRAM单元与立即数不等转移32DJNZRn,rel寄存器减1不为零转移22DJNZdirect,rel直接寻址单元减1不为零转移32布尔操作类指令NOP空操作11MOVC,bit直接寻址位送C21MOVbit,CC送直接寻址位21CLRCC清零11CLRbit直接寻址位清零21CPLCC取反11CPLbit直接寻址位取反21SETBCC置位11SETBbit直接寻址位置位21ANLC,bitC逻辑与直接寻址位22ANLC,/bitC逻辑与直接寻址位的反22ORLC,bitC逻辑或直接寻址位22ORLC,/bitC逻辑或直接寻址位的反22JCrelC为1转移22JNCrelC为零转移22JBbit,rel直接寻址位为1转移32JNBbit,rel直接寻址为0转移32JBCbit,rel直接寻址位为1转移并清该位324.3单片机的寻址方式1、立即寻址操作数以立即数的形式出现在指令中,操作数前要加“#”MOVA,#3AHMOVDPTR,#0DFFFH2、直接寻址指令中的操作数地址直接给出,可以寻址的空间有三种:(1)内部数据存储器的低128个字节单元(00H~7FH)(2)特殊功能寄存器(只能用直接寻址方式访问)(3)位地址空间MOVA,30H;MOVIE,#82H;SETB07H3、寄存器寻址操作数存放在寄存器中;寄存器包括:R0~R7、A、B、DPTR、CINCR1MOVA,R04、寄存器间接寻址寄存器中的内容是操作数的地址。间址寄存器只能是R0、R1、DPTR;访问内部RAM时,用R0、R1;访问外部RAM时,三个都可以使用;在使用时,间址寄存器前要加@。MOVA,@R0MOVXA,@DPTR5、基址寄存器加变址寄存器寻址操作数的地址是两种寄存器内容的和;这种寻址方式用于访问程序存储器中的数据表格。基址寄存器:PC、DPTR变址寄存器:AMOVCA,@DPTR+AMOVCA,@PC+AJMP@A+DPTR6、相对寻址在相对转移指令中,以PC中的内容为基本地址,加上指令中给出的偏移量,作为操作数的转移地址。JZLOOP;DJNZSTART7、位寻址操作数在内部RAM中的某一位中,位寻址时必须用位指令。MOVbit,CCLRC;CLR00H4.4指令系统单片机的指令系统包括数据传送指令,算术运算指令,逻辑运算指令,位操作指令,控制转移指令4.4.1数据传送类指令数据传送类指令共有29条,8个助记符:MOV、MOVX、MOVC、XCH、XCHD、PUSH、POP、SWAP;源操作数可以是立即、寄存器、直接、寄存器间接、基址加变址5种寻址方式;目的操作数可以用寄存器、寄存器间接、直接3种寻址方式。除了堆栈操作可以影响标志位外,其他的指令都不能改变标志位。指令执行后源操作数不变,目的操作数修改为源操作数。1、数据传送到累加器A的指令MOVA,R0MOVA,directMOVA,@RiMOVA,#data2、数据传送到工作寄存器Rn的指令MOVRn,AMOVRn,directMOVRn,#data3、数据传送到内部RAM或SFR的指令MOVdirect,AMOVdirect,RnMOVdirect,directMOVdirect,@RiMOVdirect,#dataMOV@Ri,AMOV@Ri,#dataMOVDPTR,#data片内RAM数据传送指令实例补例分析下列程序运行后R0,R1,40H,41H单元中为何值?MOV30H,#40HMOV41H,#11HMOVA,30HMOVR1,AMOVA,#00HMOV@R1,AMOVR0,41HMOV50H,#22HMOV41H,50H答案(R0)=11H,(R1)=40H(40)=00H,(41H)=22H4.累加器A与外部数据存储器的传送指令MOVXA,@DPTRMOVXA,@RIMOVX@DPTR,AMOVX@RI,A注:片外8位地址使用Ri,16位地址采用DPTR;必须通过累加器进行数据传输;只能用寄存器间接寻址方式。片外RAM数据传递举例(1)例4-1有一输入设备,其端口地址位2040H,该端口数据为41H,将其存入到片内RAM的20H单元。MOVDPTR,#2040HMOVXA,@DPTRMOV20H,A例4-2有一输出设备,其端口地址为2041H,将片内RAM的20H单元的数据传送至该输出设备MOVDPTR,#2041HMOVA,20HMOVX@DPTR,A片外RAM数据传递举例(2)例4-3将片外RAM的2000H单元的数61H取出,送至片外RAM的3FFFH断源中。MOVDPTR,#2000HMOVXA,@DPTRMOVDPTR,#3FFFHMOVX@DPTR,A5、累加器A与程序存储器之间的传送指令①MOVCA,@A+PCA←((A)+(PC+1))②MOVCA,@A+DPTRA←((A)+(DPTR))说明:这两条指令用于查找存放在程序存储器中的常数表格。第①条指令是以PC为基地址寄存器,A中的内容是无符号数,二者之和作为物理地址进行寻址。在实际应用时,通常要计算偏移量(即A中的值),计算方法如下:偏移量=表首地址-(PC+1)注意:由于A的值为无符号数,而且PC的值不能人为的改变,所以表格只能放在当前指令的下面。第②条指令是以DPTR作为基地址寄存器,由于DPTR的值可以改变,所以用这种指令指令时,表格可以随便放。但有一点要注意的是由于DPTR使用的频率比较高,所以每次使用前最好入栈保护ROM数据传送举例1例4-4从LED代码表中查询3的代码送至片外RAM的1200H单元。源程序MOVA,#0AHMOVCA,@A+PCMOVDPTR,#1200H;3字节MOVX@DPTR,A;1字节NOP;1字节NOP;1字节RET;1字节TAB:DB0C0HDB0F9HDB0A4HDB0B0H;”3”代码DB99HROM数据传送举例2例4-54000HROM单元的内容送到片内RAM60H单元MOVDPTR,#4000HMO