第3章 指令系统_第1页
第3章 指令系统_第2页
第3章 指令系统_第3页
第3章 指令系统_第4页
第3章 指令系统_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2020/5/8,1,3.2指令格式和寻址方式,3.3指令分类介绍,3.1MCS-51程序设计语言介绍,第3章指令系统,单片机原理及接口技术,2020/5/8,2,3.1MCS-51程序设计语言介绍,机器语言:用二进制代码表示的指令,也是CPU唯一能够接受的指令形式.如:MOVA,R0;机器语言(机器码)为:1110_1000bMOVR1,A;机器码为:1111_1001b汇编语言:汇编语言就是用助字符表示的指令,与机器语言指令一一对应。如:两个寄存器相加汇编语言指令:ADDA,R0C51语言:语法同标准C语言。开发效率高,可读性强,是目前使用最为广泛的单片机开发语言。一条C语言通常需要由多条机器语言组成。,机器语言(MachineLanguage)有三类汇编语言(Assemble)高级语言(HighLevelLanguage),2020/5/8,3,2020/5/8,4,一、汇编语言指令格式:标号:操作码操作数1,操作数2;注释换行表示一条指令结束。例如:LOOP:MOVA,#40H;取参数,1.标号:指令的符号地址。2.操作码:指明指令功能。3.操作数:指令操作对象。数据、地址、寄存器名及约定符号。操作数1:目的操作数;操作数2:源操作数.4.注释行:说明指令在程序中的作用。操作码和操作数是指令主体。,MOVmove传送XCHexchange交换ANLandlogic与逻辑运算XRLexclusiveor异或运算MULmultiply乘法RRrotateright右循环SJMPshortjump短跳转RETreturn子程序返回,3.2指令格式和寻址方式,2020/5/8,6,二、机器语言指令格式:,操作码操作数1操作数2有单字节、双字节和三字节指令。,举例:汇编语言:机器语言:MOVA,R0E8HMOVR6,#32H7E32HMOV40H,#64H754064H,11101000,要求能够熟练手工翻译机器码!,三、指令寻址方式,(一)操作数类型:位(bit)位寻址区中的一位二进制数据字节(Byte)8位二进制数据字(Word)16位双字节数据,(二)寻址方式:1.立即寻址方式:指令中给出实际操作数据(立即数),一般用于为寄存器或存储器赋常数初值。举例:8位立即数:MOVA,#40H;A#40H16位立即数:MOVDPTR,#2100H;DPTR#2100H,2020/5/8,8,2.直接寻址方式:,操作数是存储器单元地址,数据放在存储器单元中。MOVA,40H;A(40H),注意小括弧的含义,直接寻址方式对数据操作时,地址是固定值,而地址所指定的单元内容为变量形式。,例:设存储器两个单元的内容如图所示,执行指令MOVA,40H后A=?,思考题:直接寻址方式指令和立即寻址方式指令的形式有什么不同?,56H,3.寄存器寻址方式:,4.寄存器间接寻址方式:操作数为寄存器名,寄存器中存放的是数据地址。存放地址的寄存器称为间址寄存器或数据指针。例:MOVA,R0;A(R0)设指令执行前A=20H,R0=40H,地址为40H存储器单元内容如图所示。执行指令后,A=?,R0=?,(40H)=?,34H,40H,34H,01000000,A,R0,00100000,A,20H,R0,40H,例:MOVA,R0;A(R0)设指令执行前A=20H,R0=40H,执行指令后,A=?,R0=?,操作数为寄存器名,数据存放在寄存器中。,40H,40H,5.变址间接寻址方式:,例:MOVCA,A+DPTR;A(A+DPTR)设指令执行前A=09H,DPTR=2000H,存储器单元内容如图所示。执行指令后,A=?DPTR=?,12H,2000H,数据在存储器中,指令给出的寄存器中为数据的基地址和偏移量。数据地址=基地址+偏移量。说明:1、只对程序存储器;2、指令形式:MOVCA,A+DPTRMOVCA,A+PC,2020/5/8,11,指令给出位地址。一位数据在存储器位寻址区。(1)内部RAM中的位寻址区:字节地址为20H2FH;(2)专用寄存器的可寻址位:11个(83位)表示方法:1)直接使用位地址;如:PSW的位6可表示为0D6H2)位名称表示;或AC3)字节地址加位数表示;或0D0H.64)专用寄存器符号加位数表示。或PSW.6例:MOVC,40H;Cy(位地址40H)设指令执行前Cy=1,位地址40H存储器单元如图,执行指令后,Cy=?,0,6.位寻址方式:,7.相对寻址方式:,目的地址=转移指令地址+转移指令字节数+rel(rel为偏移量),当前PC值加上指令中规定的偏移量rel,构成实际的操作数地址例:SJMPrel操作:跳转到的目的地址=当前16位PC值+rel,注意:1)“当前PC值”指程序中下一条指令所在的首地址,是一个16位数;2)符号“rel”表示“偏移量”,是一个带符号的单字节数,范围是:-128+127(80H7FH)。,在实际编程中,“rel”通常用标号代替。,2020/5/8,13,指令功能分类:数据传送、算术运算、逻辑运算、布尔处理、程序控制。,3.3.1数据传送指令实现寄存器、存储器之间的数据传送。一、内部传送指令:片内数据存储器数据传送。二、外部传送指令:片外数据存储器数据传送。三、交换指令:片内数据存储器数据传送。四、堆栈操作指令:片内数据存储器数据传送。五、查表指令:程序存储器数据传送。,3.3指令分类介绍,(一)内部传送指令:,习题:找出配对指令,实现反向传送。,指令机器码:11101rrrE8EF11100101nE5n1110011iE6、E701110100d74d10101rrrn1010011in85n1n290d1d2,MOVA,Rn;A(Rn),Rn=R0R7MOVA,direct;A(direct)MOVA,Ri;A(Ri),Ri=R0、R1MOVA,#data;AdataMOVRn,direct;Rn(direct)MOVRi,direct;(Ri)(direct)MOVdirect1,direct2;(direct1)(direct2)MOVDPTR,#d1d2;DPTRd1d2,实现片内数据存储器中数据传送。指令格式:MOV目的操作数,源操作数寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间址。,例:,MOVA,#30HMOV4FH,AMOVR0,#20HMOVR0,4FHMOV21H,20H,习题:用两种寻址方式实现,将片内RAM60H单元的数据传送给累加器A。,解:MOVA,#60H(),MOVR0,#60H()MOVA,R0,;A=30H;(4FH)=30H;R0=20H;(20H)=30H;(21H)=30H,MOVR0,60HMOVA,R0(),解:MOVA,60H()结果A=32H,顺序执行下列指令序列,求每一步执行结果。,2020/5/8,16,说明:,只有指令表中的指令才有对应指令代码,计算机才能执行。编程时,不能随意创造发明指令。,1.一条指令中不能同时出现两个工作寄存器:非法指令:MOVR1,R2MOVR2,R0,2.间址寄存器只能使用R0、R1。非法指令:MOVA,R2,3.SFR区只能直接寻址,不能用寄存器间接寻址。非法指令:MOVR0,#80HMOVA,R0,4.指令表中的两个参数:指令字节数和机器周期数,2020/5/8,17,(二)外部RAM传送指令:(MOVX),指令格式:MOVX目的操作数,源操作数寻址方式:片外数据存储器用寄存器间址方式。DPTR作16位数据指针,寻址64KB片外RAM空间:MOVXA,DPTR;A(DPTR)(读)MOVXDPTR,A;(DPTR)A(写)2.Ri作8位数据指针,寻址256B片外RAM空间(页内寻址):MOVXA,Ri;A(P2Ri)(读)MOVXRi,A;(P2Ri)A(写),实现外部数据存储器和累加器A之间的数据传送。,例:实现片外数据存储器数据传送(2000H)(2100H)。,MOVDPTR,#2000HMOVXA,DPTRMOVDPTR,#2100HMOVXDPTR,A,习题:将片外RAM0000H单元的数据传送到片内RAM的60H单元。,;DPTR=2000H;A=X;DPTR=2100H;(2100H)=X,片外数据存储器不能直接寻址。下列为非法指令:MOVXA,2000HMOVX2100H,2000H,思考题:为什么对DPTR的数据传送使用内部传送指令?,2020/5/8,19,(三)ROM传送指令(查表指令):(MOVC),1DPTR为基址寄存器:MOVCA,A+DPTR;A(A+DPTR)(读)查表范围为64KB程序存储器任意空间,称为远程查表指令。2PC为基址寄存器:MOVCA,A+PC;A(A+PC)(读)常数表只能在查表指令后256B范围内,称为近程查表指令。,实现从程序存储器读取数据到累加器A,只能使用变址间接寻址方式。多用于查常数表程序,可直接求取常数表中的函数值。,例1:以查表方法把累加器中的十六进制数转换为ASCII码,并送回累加器中。,程序如下:指令地址源程序ORG2000H2000HBA:INCA2001MOVCA,A+PC2002RET2003DB30H2004DB31H2005DB32H2011DB45H2012DB46H,习题:改用DPTR指针实现上述功能,例2:,程序:ORG1000HSQU:MOVDPTR,#3000H;确定表首地址(基地址)MOVA,20H;取X(变量:偏移量)MOVCA,A+DPTR;查表求Y=X2MOV21H,A;保存Y(结果)RET;子程序结束;其它程序段ORG3000H;常数表格首地址TAB:DB00,01,04,09,225;平方表END,方法1:,查表法求Y=X2。设X(0X15)在片内RAM的20H单元中,要求查表求Y,存入片内RAM21H单元。,指令地址源程序ORG1000H;程序起始地址1000HSQU:MOVA,20H;取X1002HADDA,#3;修正偏移量1004HMOVCA,A+PC;查表求Y=X2(PC=1005H)1005HMOV21H,A;存结果1007HRET;子程序结束1008HTAB:DB00,01,04;平方表100BHDB09,225,思考题:当0X255时,如何用查表法编程求Y=X2。,方法2:,查表法求Y=X2。设X(0X15)在片内RAM的20H单元中,要求查表求Y,存入片内RAM21H单元。,例2:,2020/5/8,23,(四)交换指令:,1.字节交换指令XCHA,Rn;A(Rn)XCHA,Ri;A(Ri)XCHA,direct;A(direct),习题:将片内RAM60H单元与61H单元的数据交换。,例:设A=29H,执行指令XCHA,2AH后,A=?,(2AH)=?,38H,29H,XCH60H,61H;对吗?,29H,不对!,实现片内RAM区的数据双向传送。,2.半字节交换指令:,XCHDA,Ri;A03(Ri)03SWAPA;A47A03,例:将片内RAM2AH和2BH单元中的低半字节拼成新字节,其中2BH单元的低半字节作为新字节的高半字节。,58H,习题:交换片内RAM40H单元和41H单元的低半字节。,2020/5/8,25,(五)堆栈操作指令:,什么是堆栈?,堆栈是一种数据结构,是只允许在其一端进行数据插入和数据删除操作的线性表;数据写入堆栈称为压入,或叫进栈(PUSH);数据从堆栈中读出称为弹出,或叫出栈(POP);堆栈操作遵循先进后出的规则.,堆栈的功用,为子程序调用和中断操作而设立,用于保护断点和现场;堆栈也可用于数据的临时存放.,2020/5/8,26,堆栈指针及操作,进栈和出栈操作实际就是对栈顶单元的写和读操作;堆栈指针SP就是用来指示当前栈顶位置的;进栈操作:先SP自动加1,后写入数据;出栈操作:先读出数据,后SP自动减1;,堆栈区域的开辟,堆栈指针SP的复位初始状态指向内部数据存储器的07H单元;实际工作中通常将堆栈区域设在30H到7FH单元中。,2020/5/8,27,例:设A=02H,B=56H,执行下列指令后,SP=?,A=?,B=?,SBR:MOVSP,#30H;设栈底PUSHAPUSHBMOVA,#00HMOVB,#01HPOPBPOPA,02H,56H,30H,进栈指令:PUSHdirect;SPSP+1,(SP)(direct)出栈指令:POPdirect;(direct)(SP),SPSP-1“先加后压”“先弹后减”,2020/5/8,28,练习:,说明程序执行过程中,SP的内容及堆栈中内容的改变过程。程序如下:MOVSP,#30HMOVA,#20HMOVB,#30HPUSHAPUSHBPOPAPOPB,;SP=30H;A=20H;B=30H;SP=31H(31H)=20H;SP=32H(32H)=30H;A=30HSP=31H;B=20HSP=30H,习题:找出指令错误并改正:,1MOVA,#1000H;A1000H(A装1个字节数)2MOVXA,1000H;A(1000H)片外RAM(DPTR、Ri)3MOVCA,1000H;A(1000H)片外ROM(DPTR、PC)4MOVX60H,A;片外RAM(60H)A(应为MOV)5MOVR0,60H;片内RAM:(61H)(60H)MOV61H,R0(片内RAM可直接寻址)6.XCHR1,R2;R1R2(必须有A参加)7.MOVXDPTR,#2000H;DPTR2000H(应为MOV)8.MOVX60H,DPTR;片内RAM片外RAM(必须有A参加),2020/5/8,30,3.3.2算术运算指令,多数算术运算指令的执行结果会自动影响状态寄存器PSW中的标志位。,状态寄存器PSW:字节地址为D0H,思考题:能否根据PSW的字节地址,推出PSW中各位的位地址?,2020/5/8,31,1)Cy:进位标志位保存运算后最高位的进位/借位状态,当有进位/借位,Cy=1,否则Cy=0。2)AC:辅助进位标志位保存低半字节的进位/借位状态,当D3产生进位/借位,AC=1,否则AC=0。用于十进制调整。3)OV:溢出标志位运算结果按补码运算理解。有溢出OV=1,否则OV=0。4)P:奇偶标志位反映累加器A中数据的奇偶性。当1的个数为奇数,P=1,否则P=0。,2020/5/8,32,1)F0:用户自定义标志位。2)RS1、RS0:工作寄存器区选择位。复位时,PSW=00H,例:复位后,设置使用工作寄存器3区,其余标志位不变。,解:MOVPSW,#,18H,2020/5/8,33,算术运算指令:,加减指令(读-修改-写):1.加法指令:,76H0011,1)不带进位加法:ADDA,源操作数如:ADDA,R2;AA+R2,影响Cy、OV、AC、P例1:已知A=3BH,PSW=0,执行指令ADDA,#3BH后求:A=?Cy=?OV=?AC=?P=?PSW=?,01000001=41H,完成片内RAM和A中数据的加减乘除运算。,2020/5/8,34,10011010=9AH11100011=E3H+0101111101=7DH,2)带进位加法:ADDCA,源操作数如:ADDCA,R2;AA+R2+Cy,影响Cy、OV、AC、P,7DH1100,例:A=9AH,R2=E3H,PSW=0,执行指令ADDCA,R2后求:A=?Cy=?OV=?AC=?P=?PSW=?,10000100=84H,带进位加法指令ADDC用于多字节运算:,例:设双字节数X存在片内RAM41H、40H单元,Y存在42H、43H单元,编程求Z=X+Y,并存入片内RAM单元44H、45H、46H。,MOVA,40HADDA,42HMOV44H,AMOVA,41HADDCA,43HMOV45H,AMOVA,#00HADDCA,#00HMOV46H,ARET,;取被加数低字节;加上加数低字节;保存和的低字节;取被加数高字节;加上加数高字节;保存和的高字节;求高字节进位;子程序结束,;低字节相加;高字节相加;计算高字节进位;子程序结束,2020/5/8,36,十进制加法指令:仅对加法结果进行调整ADDA,源操作数DAA带进位十进制加1法指令:ADDCA,源操作数DAA,作业:BCD码加法编程。设X、Y为4位压缩BCD码,求Z=X+Y。,BCD调整指令:BCD:Binary-Coded-Decimal(二进制编码的十进制)DAA;把A中按二进制相加后的结果调整成按BCD数相加的结果调整原因:1、相加结果大于9,进入无效编码区;2、相加结果有进位,跳过无效编码区。调整方法:进行加“6”修正。,2020/5/8,37,2减法指令:,如:SUBBA,R2;AA-R2-Cy,;影响Cy、OV、AC、P,000000,习题:编程求双字节减法。设X、Y存在片内RAM60H起始单元,计算Z=X-Y。,例:A=5AH,R2=5AH,Cy=0,执行下列指令SUBBA,R2求:A=?Cy=?OV=?P=?AC=?,思考:有不带借位的减法指令吗?,01011010=5AH01011010=5AH-000000000=00H,SUBBA,源操作数;带借位减法指令,2020/5/8,38,3.增量、减量指令:,INC单操作数如:INCR2;R2R2+1DEC单操作数如:DECR2;R2R2-1INCDPTR;DPTRDPTR+1,注意:加1、减1指令不影响标志位状态。没有指令DECDPTR,2020/5/8,39,4.乘除指令:,MULAB;BAAB,Cy0,;当积高字节B=0,OV0;B0,则OV1,例:A=96(60H),B=192(C0H),执行指令MULAB后,求:A=?B=?Cy=?OV=?P=?解:96192=18432(4800H),00H48H010,12H0CH000,例:A=156(F6H),B=13(0DH),执行指令DIVAB后求:A=?B=?Cy=?OV=?P=?解:15613=18(12H),余数=12(0CH)。,思考题:如何实现多字节数据的乘除运算。,DIVAB;AB,A商,B余数,Cy0,;当除数B=0,OV1;B0,则OV0,2020/5/8,40,3.3.3逻辑运算指令,一、单操作数指令(累加器A为操作数):1.A清0指令:CLRA;A02.A取反指令:CPLA;AA,3、循环移位指令:1)8位循环指令:RLA;A循环左移一位RRA;A循环右移一位,2)9位循环指令:RLCA;带Cy循环左移一位RRCA;带Cy循环右移一位,例:设A=11000101B,Cy=0,分别执行下列单条指令:CPLA求:A=?Cy=?RLA求:A=?Cy=?RLCA求:A=?Cy=?,001110100,100010110,100010101,CLRCMOVA,R5RLCAMOVR5,AMOVA,R6RLCAMOVR6,A,;Cy=0,设R6=55H,R5=AAH,;R6=01010101B,R5=10101010B,Cy=0,;R6=01010101B,R5=01010100B,Cy=1,;R6=10101011B,R5=01010100B,Cy=0,思考题:如何将寄存器R6R5中的双字节数X右移一位。,用9位循环指令实现多字节移位:例:编程将寄存器R6R5中的双字节数X左移一位。,2020/5/8,42,二、双操作数逻辑运算指令(对位逻辑运算):ANL、ORL、XRL,习题1:如何将累加器A中的数据高4位清0,低位不变?习题2:如何将寄存器R2中的数据奇数位取反,偶数位不变?,例:A=01B,表示随机状态,为1或0,下述一组指令执行后,A的值如何?XRLA,#0C0H;将累加器A的内容D7、D6取反ORLA,#03H;将累加器A的内容D1、D0置1ANLA,#0E7H;将累加器A的内容D4、D3清0解:执行上述指令后,A=100011B。,2020/5/8,43,3.3.4布尔变量操作指令,一位传送:MOVC,bit;Cy(bit)MOVbit,C;(bit)Cy,例:将位地址20H的一位数传送到位地址30H中:MOVC,20HMOV30H,C,二位清0、置1、取反(CLR、SETB、CPL):CLRC;Cy0CLR40H;(位地址40H)0,对片内RAM中位寻址区操作。位累加器Cy和位地址bit。,2020/5/8,44,三逻辑运算(ANL、ORL):,例:设Cy=1,(位地址40H)=1,执行指令ANLC,40H后,Cy=?,(位地址40H)=?,位地址表示法:位地址D4H,位寄存器RS1,字节加位PSW.4,0,习题:设累加器A中数据为29H=00101001B,Cy=0,执行指令ORLC,0E3H后,Cy=?,1,1,ANLC,40H;CC指针首地址MOVDPTR,#2003H;指针首地址MOVR1,#06H;字节个数LOOP:MOVA,R0;取数据MOVXDPTR,A;保存数据INCR0;指针加1INCDPTR;指针加1DJNZR1,LOOP;判断是否传送完SJMP$,2020/5/8,56,3.3.6子程序调用和返回指令,子程序调用和返回指令也使程序发生转移。,一、长调用指令:LCALLaddr16;PCPC+3,;SPSP+1,(SP)PC07;SPSP+1,(SP)PC815;PCaddr16addr16为子程序起始地址,编程时可用标号代替。指令机器码:12addr815addr07指令调用范围:64KB,子程序调用过程:,与转移指令不同:转移时,先用堆栈保存当前PC地址。,2020/5/8,57,三、绝对调用指令:ACALLaddr11;PCPC+2;SPSP+1,(SP)PC07,SPSP+1,(SP)PC815;PC100addr11PC1511不变addr11为子程序首地址指令机器码:addr11910001addr81指令调用范围2KB。,二、子程序返回指令:RET;PC158(SP),SPSP-1,PC70(SP),SPSP-1指令机器码:22HRET指令从堆栈弹出保存的PC地址,实现子程序返回。,20H92H,21H53H,SP,2000H,208FH,2092H,2100H,2150H,2153H,2200H,2250H,2251H,2153H,2092H,21FFH,2200H,SP,MAIN:MOVSP,#30H;设置栈底LCALLSUB;调用子程序SUB:;子程序段RET;返回主程序,例:子程序嵌套:,SP,SP,SP,SP,SP,2020/5/8,59,注意:,常用格式:MAIN:;主程序LCALLSUBR;调用SUBRSUBR:;子程序首地址RET;子程序返回,1、子程序起始指令要使用标号,用作子程序名。2、执行返回指令RET之前,保证栈顶内容为主程序返回地址,以便正确返回主程序。,2020/5/8,60,1、可以按口寻址,进行字节操作;如:MOVPm,A可以按口线寻址,进行位操作。如:MOVPm.n,C2、没有专门的输入/输出指令,均使用MOV传送指令来完成:输入:用MOV指令把各口线的引脚状态读入;输出:用MOV指令把输出数据写入各口线电路的锁存器。3、在进行引脚数据输入操作之前,必须先向电路中的锁存器写入“1”,使F

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论