您好,欢迎访问三七文档
当前位置:首页 > 医学/心理学 > 药学 > 第二章指令系统和汇编语言.
第二章MCS-51系列单片机指令系统和汇编语言程序设计第一节汇编语言与指令系统程序:完成某项特定任务的指令的集合,设计程序用程序设计语言程序设计语言:机器语言、汇编语言、高级语言机器语言:是机器唯一能懂的语言。用汇编语言和高级语言编写的程序(源程序)必须翻译成机器语言的程序(目标程序),计算机才能执行。汇编语言:汇编语言的指令格式分为操作码和操作数,操作码告诉计算机做什么,操作数表明所处理的数据是什么。适用于编制程序工作量不大,规模较小的程序,高级语言:高级语言面向过程。指令系统:所有指令的集合。51系列单片机的指令系统共有111条指令。指令按字节来分有单字节指令、双字节指令、三字节指令。指令字节数越少,指令执行的速度越快,所占的存储单元也越少。指令按功能可分为五类:(1)数据传送指令用于单片机片内RAM和特殊功能寄存器SFR之间传送数据或用于片内和片外存储单元之间传送数据。(2)算术运算指令用于对两个数进行加、减、乖、除等算术运算,影响程序状态字PSW。(3)逻辑操作指令用于对两个操作数进行逻辑乖、逻辑或、逻辑异或、逻辑取反等操作。(4)控制转移指令用来改变程序执行的流向,执行后改变程序计数器PC中的值。5)位操作指令位操作指令又称布尔变量操作指令,分为位传送、位置位、位运算和位控制转移指令。指令系统中所用符号的说明:(1)Rn:工作寄存器,可以是R0—R7中的一个(2)#DATA:8位立即数,实际使用时DATA应是00H—FFH中的一个(3)direct:8位直接地址:实际使用时direct应00H—FFH中的一个,也可以是采用物理地址表示的特殊功能寄存器SFR中的一个(4)@Ri:表示寄存器间接寻址,Ri只能是R0或R1(5)#data:16位立即数(6)@DPTR:表示以DPTR为数据指针的间接寻址,用于对外部64KRAM/ROM寻址(7)bit:位地址(8)addr11:11位目标地址(9)addr16:16位目标地址(10)rel:8位带符号地址偏移量(11)$:当前指令的地址第二节寻址方式寻找操作数的方法称为指令的寻址方式。在执行指令是时,CPU要根据地址寻找参加运算的操作数,然后才能对操作数进行操作,操作结果还要根据地址存入相应存储单元或寄存器中,计算机执行程序实际上是不断寻找操作数并进行操作的过程。一、立即寻址立即寻址是在指令码中直接含有所需的立即数,可以是二进制8位或16位立即数,立即数用#data或#data16表示,例如指令MOVA,#30H,表示把立即数30H送入累加器A;二、寄存器寻址这类指令所需操作数在某个工作寄存器R0—R7、A、B或DPTR等中。例如指令ADDA,R2,它的操作功能是取出工作寄存器R2中的内容(操作数)与累加器A中的内容相加,结果送回累加器A。如:ADDA,R2它的操作功能是(A)(A)+(R2)指令ADDA,Ri以Ri中i的不同,指定是哪个寄存器。三、寄存器间接寻址执行这类指令时,根据指令中寄存器号找到所需的操作数地址,再由操作数地址找到操作数。实际上是一种二次寻找操作数的寻址方式。间址寄存器采用@Ri或@DPTR来表示,其中Ri是R0或R1,@是区别寄存器寻址的标记。并且规定MOV指令用来访问片内RAM;MOVX指令用来访问片外RAM。例如:MOVA,@R0;A←(RO)寄存器间接寻址注意:MOVA,R0:A←R0,寄存器寻址要访问片外RAM某一单元,还可以用16位的DPTR间接寻址。MOVDPTR,7000HMOVXA,@DPTR四、直接寻址直接给出操作数所在的存储器地址,就称为直接寻址。可用于直接寻址的存储空间主要有片内RAM的128字节和特殊功能寄存器SFR,直接地址采用direct表示,在汇编成机器码时,direct必须用实际操作数的物理地址。如:MOVA,3AH;A←(3A)如:MOVA,B;同MOVA,F0。51单片机有很强位操作功能,片内RAM有16个单元(20H~2FH)和12个SFR的各位被赋予了地址。五、基址寄存器加变址寄存器间接寻址用于访问程序存储器,主要用于查表性质的访问。以程序计数器(PC)或数据指针DPTR作为基址寄存器,以累加器A作为变址寄存器,把它们的地址和作为程序存储器地址,再读取数据。有如下两条指令:MOVCA,@A+PC;A←(A+PC)MOVCA,@A+DPTR;A←(A+DPTR)例:已知片外ROM单元的20E0H单元有一常数47H,要把它取到累加器A,请编出相应程序。解:根据变址寻址的特点,基地址取2000H,变址为E0H,相应程序为:MOVDPTR,#2000H;DPTR←0300HMOVA,#E0H;A←02MOVCA,@A+DPTR;;A←47HE0A程序存储区2040H9320E0H472041H………DPH20DPL00ALUMOVCA,@A+DPTR设DPTR=2000H,A=E0H20E0H47指令代码E0A程序存储区ALU如:MOVCA,@A+PC设A=E0H2121H452040H832121H452041H………2120H47当前PC指令代码六、相对寻址用于访问程序存储器,在相对转移指令中使用,凡写有rel的指令都属于相对寻址。这些指令如满足程序转移条件,PC中地址值将更换为当前地址与相对地址rel的代数和,PC)(PC)+rel,程序将从新的PC处开始执行程序。例如CJNEA,#FFH,rel当中的A内容不等于FFH时,满足转移条件,程序将转移到PC+rel的地址去继续执行程序学习指令要点:1、了解指令的操作2、了解指令的寻址方式3、了解指令对程序状态字的影响4、合理使用指令第三节数据传送指令这类指令的源和目的操作数地址都在单片机内部,可以片内RAM地址,也可以是特殊功能寄存器的地址。指令通式:MOVDEST,SRC。1、以累加器A为一方的传送指令(寄存器寻址型传送指令和寄存器间址型传送指令)MOVA,RiMOVRi,AMOVA,@Rj;j=0、1MOV@Rj,AMOVA,directMOVdirect,A例:已知:(40H)=11H,(41H)=22H,R0=40H,R1=41H,如下指令执行后累加器A,40H,41H和42H单元中内容是什么MOVA,@R0MOV@R1,AMOV42H,@R1上述指令执行后操作结果为:A=11H,(40H)=11H,(41H)=11H,(42H)=11H。2、不以累加器A为一方的传送指令MOVdirect,RiMOVRi,directMOVdirect,@RjMOV#Rj,directMOVdirect,direct3、用立即数置数的指令MOVA,#dataMOVRi,#dataMOV@Rj,#dataMOVdirect,#dataMOVDPTR,#data164、访问片外RAM的传送指令访问片内RAM用MOV指令,访问片外RAM用MOVX指令。(1)片外RAM单元(8位地址)内容送累加器AMOVXA,@Rj(2)累加器内容送片外RAM单元(8位地址)指令MOVX@Rj,A(3)片外RAM单元(16位地址)内容送累加器AMOVXA,@DPTR(4)累加器内容送片外RAM单元(16位地址)MOVX@DPTR,A例:将片外RAM120H单元内容送到片外RAM120单元程序:MOVDPTR,#0120MOVR0,#78HMOVXA,@R0MOVX@DPTR,A五、基址寄存器加变址寄存器间址指令MOVCA,@A+DPTR;(A)((A)+(DPTR))MOVCA,@A+PC((PC)(PC)+1(A)((A))+(PC))主要用于查表程序E0A程序存储区2040H9320E0H472041H………DPH20DPL00ALUMOVCA,@A+DPTR设DPTR=2000H,A=E0H20E0H47指令代码(1)采用DPTR作为基址寄存器(2)采用PC作为基址寄存器E0A程序存储区ALU如:MOVCA,@A+PC设A=E0H2121H452040H832121H452041H………2120H47当前PC指令代码六、交换指令交换指令数据作双向传送,指令执行后源和目的操作数都修改为另一方的操作数。XCHA,RiXCHA,@RjXCHA,directXCHDA,@RjSWAPA如:R0的内容为20H,片内RAM20H单元内容为75H,累加器内容为36H,则执行XCHA,@R0指令后,片内RAM20H单元内容为36H,累加器内容为75H。执行XCHDA,@R0后,片内RAM20H单元内容为76H,累加器内容为35H七、进出堆栈指令分别用于保存和恢复现场,进堆栈用于保存片内RAM单元或专用寄存器内容,出堆栈用于恢复片内RAM或专用寄存器内容。1、进栈指令PUSHdirect指令执行操作为:(SP)←(SP)+1((SP))←(direct)2、出栈指令POPdirect指令执行操作为:(direct)←((SP))(SP)←(SP)-1例:SP内容为32H,片内RAM32H、31H单元的内容分别为12H、34H,则执行:POPDPHPOPDPL指令后,SP的内容变为30H,数据指针DPTR变为1234H。第四节算术操作类指令算术操作指令主要用来进行加、减、乖、除等操作。用累加器A来存放一个源操作数,另一个源操作数可以存放在任何一个工作寄存器或片内RAM单元中,运算结果保留在累加器A中。一、加法指令ADDA,RiADDA,@RjADDA,directADDA,#dataADDCA,RiADDCA,@RjADDCA,directADDCA,#data加法指令执行后将影响程序状态字PSW中的标志位:相加后整个字节有溢出C将置位,否则C为零,低半字节有溢出,AC将为1,否则为0,最高位和次高位不同时进位,OV将为1,否则来0。例:已知A=85H,R0=30H,(30H)=11H,(31H)=0FFH和C=1,执行如下指令后累加器A和C中的值是多少①ADDCA,R0②ADDCA,31H③ADDCA,@R0④ADDCA,#85H解:①A=B6H,C=0②A=85H,C=1③A=97H,C=0④A=0BH,C=1二、减法指令SUBBA,RiSUBBA,@RjSUBBA,directSUBBA,#data三、加1指令INCAINCRiINC@RjINCdirectINCDPTR;地址加1例:已知A=8FH、R0=55H、(56H)=0BBH、DPTR=2001H,试问执行如下程序后累加器A、R0、56H、和DPTR中内容是什么INCAINCR0INC56HINC@R0INCDPTR解:根据加1指令含义,执行后操作结果为:A=90H、R0=56H、(56H)=0BCH、DPTR=2001H四、减1指令DECADECRiDEC@RjDECdirect五、其它算术操作指令1、累加器A内容十进制调整指令,用于实现BCD加法或减法运算。DAA;若AC=1或A3-09,则A←A+06H;若C=1或A7-49,则A←A+60H2、乖法指令和除法指令MULAB;AⅹB=BA,DIVAB;A÷B=A…B第五节逻辑操作指令逻辑操作对两个8位二进制数进行与、或、非、异或等逻辑操作一、与指令ANLA,RiANLA,@RjANLA,directANLdirect,AANLA,#dataANLdirect,#data与指令用于修改工作寄存器,片内RAM单元,直接寻址字节(比如P0、P1、P2、P3)或累加器本身的内容。二、或指令ORLA,RiORLA,@RjORLA,directORLdirect,AORLA,#dataORLdirect,#data或指令用于修改工作寄存器,片内RAM单元,直接寻址字节(比如P0、P1、P2、P3)或累加器本身的内容。三、异或指令XRLA,RXRLA,@RjXRLA,directXRLdirect,AXRLA,#dataXRLdirect,#data异或指令用于修改工作寄存器,片内RAM单元,直接寻址字节(比如P0、P1、P2、P3)或累加器本身的内容。四、A操作指
本文标题:第二章指令系统和汇编语言.
链接地址:https://www.777doc.com/doc-2126893 .html