第3章MCS-51单片机的汇编语言指令本章定位基础知识3.1指令及指令系统概念3.2MCS-51指令系统的寻址方式3.2.1寄存器寻址3.2.2直接寻址3.2.3寄存器间接寻址3.2.4立即寻址3.2.5基址寄存器加变址寄存器间接寻址3.3MCS-51单片机指令系统3.3.1数据传送类指令3.3.2算术操作类指令3.3.3逻辑运算类指令3.3.4控制转移类指令3.3.5位操作类指令3.4伪指令第3章MCS-51单片机的汇编语言指令3.1指令及指令系统概念1指令CPU执行某种特定功能的操作的命令。以指令代码形式表示。ROM字节数少,速度则快。MCS-51的基本指令共111条,按指令所占的字节来分:(1)单字节指令49条;(2)双字节指令45条;(3)三字节指令17条。按指令的执行时间来分:(1)1个机器周期(12个时钟振荡周期)指令64条(2)2个机器周期(24个时钟振荡周期)指令45条(3)只有乘、除两条指令的执行时间为4个机器周期(48个时钟振荡周期)。12MHz晶振:机器周期为1s。2指令表示形式二进制机器码,目标吗||十六进制辅助||助记符形式汇编,C语言MCS-51单片机汇编语言指令格式一般包含4个区段:[标号:][操作码助记符][目的操作数],[源操作数][;注释]标号是一条指令的标志,是可选字段,与操作码之间用“:”隔开;主要方便调用或转移。操作码规定指令的功能,是一条指令的必选字段,如果没有操作码,就不能成为指令。它与操作数之间用“空格”隔开。操作数是指令操作的对象。分为目的操作数和源操作数两类,它们之间用“,”分隔。操作数是可选字段。一条指令可以有0、1、2、3个操作数。注释是对指令功能的说明解释。以“;”开始。例如:AA:ADDA,﹟10H;将累加器A的内容与10H相加,结果存入累加器A。AA为标号,是这条指令的标志,其值是该条指令的首地址;ADD为操作码,说明要进行加法运算;目的操作数为累加器A,源操作数为﹟10H;“;”后面为注释部分。3指令系统一套控制计算机执行操作的编码,通常是二进制,称为机器语言。汇编需要翻译成机器语言。4指令中的数据形式二进制0110B八进制23O十进制23十六进制23H都要以数字开头:12H,0F7H。3.2指令系统的寻址方式寻址方式就是在指令中说明操作数所在地址的方法。共5种寻址方式。1.寄存器寻址方式2.直接寻址方式3.寄存器间接寻址方式4.立即寻址方式5.基址寄存器加变址寄存器间址寻址方式下面,首先看看指令学习时的符号意义。指令中符号的意义:---在课本3.3的P29Rn当前寄存器区的8个工作寄存器R0~R7(n=0~7)。如:MOVA,RnRi当前寄存器区中可作间接寻址寄存器的2个寄存器R0、R1(i=0,1)。Direct直接地址,即8位的内部RAM或特殊功能寄存器的地址。如:MOVA,10H#data包含在指令中的8位立即数。MOVA,#12H#data16包含在指令中的16位立即数。rel相对转移指令中的偏移量,为8位的带符号补码数。DPTR数据指针,可用作16位的数据地址寄存器。bit内部RAM或特殊功能寄存器中的直接寻址位。C(或Cy)进位标志位或位处理机中的累加器。addr1111位目的地址addr1616位目的地址@间接寻址寄存器前缀,如@Ri,@A+DPTR(X)X中的内容。((X))由X寻址的单元中的内容。→箭头右边的内容被箭头左边的内容所取代。5种寻址方式。1.寄存器寻址方式操作数在寄存器中MOVA,Rn;(Rn)→A,n=0~7表示把寄存器Rn的内容传送给累加器A寻址范围:(1)4组通用工作寄存区共32个工作寄存器。(2)部分特殊功能寄存器,例如A、B以及数据指针寄存器DPTR等。2.直接寻址方式操作数直接以单元地址的形式给出:MOVA,40H寻址范围:(1)内部RAM的128个单元(2)特殊功能寄存器。除了以单元地址的形式外,还可用寄存器符号的形式给出。例如:MOVA,80H与MOVA,P0是等价的。3.寄存器间接寻址方式寄存器中存放的是操作数的地址,在寄存器前加前缀标志“@”。访问内部RAM或外部RAM的低256个字节时,只能采用R0或R1作为间址寄存器。例如:MOVA,@Ri;i=0或1其中Ri中的内容为40H,把内部RAM40H单元内容送A。寻址范围:(1)访问内部RAM低128个单元,其通用形式为@Ri(2)对外部内部RAM的64K字节的间接寻址,例如:MOVXA,@DPTR(3)片外数据存储器的低256字节例如:MOVXA,@Ri(4)堆栈区堆栈操作指令PUSH(压栈)和POP(出栈)使用堆栈指针(SP)作间址寄存器4.立即寻址方式操作数在指令中直接给出,需在操作数前面加前缀“#”。例如:MOVA,#40H5.基址寄存器加变址寄存器间址寻址方式本寻址方式是以DPTR或PC作基址寄存器,以累加器A作为变址寄存器。例如:指令MOVCA,@A+DPTR其中A的原有内容为05H,DPTR的内容为0400H,该指令执行的结果是把程序存储器0405H单元的内容传送给A。说明:(1)本寻址方式是专门针对程序存储器的寻址方式,寻址范围可达到64KB。(2)本寻址方式的指令只有3条:MOVCA,@A+DPTRMOVCA,@A+PCJMP@A+DPTR3.3MCS-51指令系统分类介绍111条指令,按功能分类,可分为下面5大类:(1)数据传送类(28条)(2)算术操作类(24条(3)逻辑运算类(25条)(4)控制转移类(17条)(5)位操作类(17条)3.4.1数据传送类指令使用最频繁的一类指令,通用格式:MOV目的操作数,源操作数属“复制”性质,而不是“搬家”数据传送类指令不影响标志位:Cy、Ac和OV,影响奇偶标志位P。1.以累加器为目的操作数的指令MOVA,Rn;(Rn)→A,n=0~7MOVA,@Ri;((Ri))→A,i=0,1MOVA,direct;(direct)→AMOVA,#data;#data→A例如:MOVA,R6;(R6)→A,寄存器寻址MOVA,70H;(70H)→A,直接寻址MOVA,@R0;((R0))→A,间接寻址MOVA,#78H;78H→A,立即寻址2.以Rn为目的操作数的指令MOVRn,A;(A)→Rn,n=0~7MOVRn,direct;(direct)→Rn,n=0~7MOVRn,#dat;#data→Rn,n=0~7功能:是把源操作数的内容送入当前一组工作寄存器区的R0~R7中的某一个寄存器。3.以直接地址direct为目的操作数的指令MOVdirect,A;(A)→directMOVdirect,Rn;(Rn)→direct,n=0~7MOVdirect1,direct2;MOVdirect,@Ri;((Ri))→directMOVdirect,#data;#data→direct功能:把源操作数送入直接地址指出的存储单元。direct指的是内部RAM或SFR的地址。4.以寄存器间接地址为目的操作数的指令MOV@Ri,A;(A)→((Ri)),i=0,1MOV@Ri,direct;(direct)→((Ri))MOV@Ri,#data;#data→((Ri))5.16位数传送指令MOVDPTR,#data16;#data16→DPTR唯一的16位数据的传送指令,立即数的高8位送入DPH,立即数的低8位送入DPL。6.堆栈操作指令MCS-51内部RAM中可以设定一个后进先出(LIFO-LastInFirstOut)的区域称作堆栈.堆栈指针SP指出堆栈的栈顶位置。(1)进栈指令PUSHdirect先将栈指针SP加1,然后把direct中的内容送到栈指针SP指示的内部RAM单元中。例如:》》当(SP)=60H,(A)=30H,(B)=70H时,执行:PUSHACC(SP)+1=61H→SP,(A)→61HPUSHB;(SP)+1=62H→SP,(B)→62H结果:(61H)=30H,(62H)=70H,(SP)=62H(2)出栈指令POPdirectSP指示的栈顶(内部RAM单元)内容送入direct字节单元中,栈指针SP减1。例如:当(SP)=62H,(62H)=70H,(61H)=30H,执行:POPDPH;((SP))→DPH,(SP)-1→SPPOPDPL;((SP))→DPL,(SP)-1→SP结果:(DPTR)=7030H,(SP)=60H思考:POPSP7.累加器A与外部数据存储器传送指令MOVXA,@DPTR;((DPTR))→A,读外部RAM/IOMOVXA,@Ri;((Ri))→A,读外部RAM/IOMOVX@DPTR,A;(A)→((DPTR)),写外部RAM/IOMOVX@Ri,A;(A)→((Ri)),写外部RAM/IO功能:读外部RAM存储器或I/O中的一个字节,或把A中一个字节的数据写到外部RAM存储器或I/O中。注意:RD*或WR*信号有效。采用DPTR间接寻址,高8位地址(DPH)由P2口输出,低8位地址(DPL)由P0口输出。采用Ri(i=0,1)间接寻址,可寻址片外RAM的256个单元。Ri内容由P0口输出。MOV后“X”表示单片机访问的是片外RAM存储器或I/O。8.查表指令共两条,用于读程序存储器中的数据表格的指令,均采用基址寄存器加变址寄存器间接寻址方式。(1)MOVCA,@A+PC以PC作基址寄存器,A的内容作为无符号整数和PC中的内容(下一条指令的起始地址)相加后得到一个16位的地址,该地址指出的程序存储单元的内容送到累加器A。注意:PSEN*信号有效。例如:(A)=30H,执行地址1000H处的指令1000H:MOVCA,@A+PC本指令占用一个字节,执行结果将程序存储器中1031H的内容送入A。优点:不改变特殊功能寄存器及PC的状态,根据A的内容就可以取出表格中的常数。缺点:表格只能存放在该条查表指令后面的256个单元之内,表格的大小受到限制,且表格只能被一段程序所利用。(2)MOVCA,@A+DPTR以DPTR作为基址寄存器,A的内容作为无符号数和DPTR的内容相加得到一个16位的地址,把由该地址指出的程序存储器单元的内容送到累加器A.例如:(DPTR)=8100H(A)=40H执行指令MOVCA,@A+DPTR本指令的执行结果只和指针DPTR及累加器A的内容有关,与该指令存放的地址及常数表格存放的地址无关,因此表格的大小和位置可以在64K程序存储器中任意安排,一个表格可为各个程序块公用。两条指令是在MOV的后面加C,“C”是CODE的第一个字母,即代码的意思。9.数据交换指令1)字节交换指令XCHA,RnXCHA,directXCHA,@Ri例如:(A)=80H,(R7)=08H,(40H)=F0H(R0)=30H,(30H)=OFH执行下列指令:XCHA,R7;(A)与(R7)互换XCHA,40H;(A)与(40H)互换XCHA,@R0;(A)与((R0))互换结果:(A)=0FH,(R7)=80H,(40H)=08H,(30H)=F0H2)半字节交换指令XCHDA,@Ri累加器的低4位与内部RAM低4位交换。例如:(R0)=60H,(60H)=3EH,(A)=59H》》执行完XCHDA,@RO指令,则(A)=5EH,(60H)=39H。3.3.2算术操作类指令单字节的加、减、乘、除法指令,都是针对8位二进制无符号数。执行的结果对Cy、Ac、OV三种标志位有影响。但增1和减1指令不影响上述标志。1.加法指令共有4条加法运算指令:ADDA,Rn;(A)+(Rn)→A,n=0~7ADDA,direct;(A)+(direct)→AADDA,@Ri;(A)+((Ri))→A,i=0,1ADDA,#data;(A)+#data→A一个加数总是来自累加器A,而另一个加数可由不同的寻址方式得到。结果总是放在A中。使用加法指令时,要注意累加器A中的运算结果对各个标志位的影响:(1)如果位7有进位,则置“1”进位标志Cy,否则清“0”Cy(