




已阅读5页,还剩147页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2MCS-51指令系统及汇编语言程序设计,指令格式寻址方式指令系统程序设计,概述,由构成计算机的电子器件的特性所决定,计算机只能识别二进制代码。这种以二进制代码来描述指令功能的语言,称之为机器语言,用机器语言组成的程序,称为目标程序。计算机就是按照机器语言的指令来完成各种功能操作的,它具有程序简捷、占用存储空间小、执行速度快、控制功能强等特点。一个单片机所需执行指令的集合即为单片机的指令系统。,使用易于阅读和辨认的指令符号来代替机器码,称为助记符,用助记符的形式表示的单片机指令就是汇编语言,为便于记忆和阅读,助记符号通常都使用易于理解的英文单词和拼音字母来表示。单片机使用的机器语言、汇编语言及高级语言,但不管使用是何种语言,最终还是要“翻译”成为机器码,单片机才能执行之。每种单片机都有自己独特的指令系统,那么指令系统是开发和生产厂商定义的,如要使用其单片机,用户就必须理解和遵循这些指令标准,要掌握某种(类)单片机,指令系统的学习是必须的。,MCS-51单片机汇编语言指令的格式,标号:操作码目的操作数,源操作数;注释例如:LOOP:ADDA,10H;(A)(A)+10H(1)方括号表示该项是可选项,可有可无。(2)标号是用户设定的符号,它实际代表该指令所在的地址。标号必须以字母开头,其后跟18个字母或数字,并以“:”结尾。(3)操作码是用英文缩写的指令功能助记符。它确定了本条指令完成的操作功能。任何一条指令都必须有该助记符项,不得省略。(4)目的操作数提供操作的对象,并指出一个目标地址,表示操作结果存放单元的地址,它与操作码之间必须以一个或几个空格分隔。(5)源操作数指出的是一个源地址(或立即数),表示操作的对象或操作数来自何处。它与目的操作数之间要用“,”号隔开。(6)注释部分是在编写程序时,为了增加程序的可读性,用户写的对该条指令或该段程序功能的说明。它以分号“;”开头,可以用中文、英文或某些符号来表示,它不存入单片机,只出现在源程序中。,无标号:MOVA,B无目的操作数:PUSHA无源操作数:CLRA既无目的操作数也无源操作数:RET,标号的作用:如软件延时程序:MOVR1,0AH;给R1赋循环初值DELAY:DJNZR1,DELAY;(R1)(R1)-1,若(R1)0则循环,一些特殊符号的意义,在介绍指令系统前,先了解一些特殊符号的意义,这对今后程序的编写都是相当有用的。Rn当前选中的寄存器区的8个工作寄存器R0R7(n=07)。Ri(i=0,1)当前选中的寄存器区中可作为地址寄存器的两个寄存器R0和R1direct内部数据存储单元的8位地址。包含0127(255)内部存储单元地址和特殊功能寄存地址。#data指令中的8位常数。#data16指令中的16位常数。addr16用于LCALL和LJMP指令中的16位目的地址,目的地址的空间为64KB程序存储器地址。addr11用于ACALL和AJMP指令中的11位目的地址,目的地址必须放在与下条指令第一个字节同一个2KB程序存储器空间之中。rel8位带符号的偏移字节,用于所有的条件转移和SJMP等指令中,偏移字节对于下条指令的第一个字节开始的-128+127范围内。,间接寄存器寻址或基址寄存器的前缀。/为操作的前缀,声明对该位操作数取反。DPTR数据指针。bit内部RAM和特殊功能寄存器的直接寻址位。A累加器。B寄存器B。用于乘法和除法指令中。C进位标志位。(x)某地址单元中的内容。(x)由X寻址单元中的内容。,微型计算机的基本工作原理,微型计算机解题过程举例:计算a+b-c=?,计算a+b-c=?,微型计算机的工作过程,微型计算机的工作过程就是执行程序的过程,而程序由指令序列组成,因此,执行程序的过程,就是执行指令序列的过程,即逐条地从存储器中取出指令并完成指令所指定的操作。由于执行每一条指令,都包括取指、译码和执行三个基本步骤,所以,微型计算机的工作过程,也就是不断地取指令、译码和执行的过程,直到遇到停机指令时才结束机器的运行。,微型计算机工作流程,1.取指令2.取源操作数3.取目的操作数4.执行指令,汇编语言程序对应的机器指令对应的操作MOVA,#110110000将立即数1传送到寄存器A中00000001ADDA,#200000100计算两个数的和,结果存放到A中00000010MOV08H,A10100010将A中的数传送到地址单元08H0000100000000000HLT11110100停机,举例:计算1+2=?,MCS-51的寻址方式,寻址的“地址”即为操作数所在单元的地址,绝大部分指令执行时都需要用到操作数,那么到哪里去取得操作数呢?最易想到的就是告诉CPU操作数所在的地址单元,从那里可取得相应的操作数,这便是“寻址”之意。MCS-51的寻址方式有7种寻址方式:1.立即寻址2.直接寻址3.寄存器寻址4.寄存器间接寻址5.基址寄存器加变址寄存器间接寻址6.相对寻址7.位寻址,1.立即寻址,立即寻址就是把操作数直接在指令中给出,即操作数包含在指令中,指令操作码的后面紧跟着操作数,一般把指令中的操作数称为立即数,因此而得名。立即数可以是8位或16位,用十六进制数表示。为了与直接寻址方式相区别,在立即数前加上“#”符号例如:MOVA,#0EH;(A)0EH这条指令的意义是将0EH这个操作数送到累加器A中。,2.直接寻址,指令中直接给出操作数所在的存储器地址,以供寻址取数或存数的寻址方式称为直接寻址。例如:MOVA,68H;(A)(68H)这条指令的意义是把内部RAM中的68H单元中的数据内容传送到累加器A中。值得注意的是直接寻址方式只能使用8位二进制地址,因此这种寻址方式仅限于内部RAM进行寻址。低128位单元在指令中直接以单元地址的形式给出。对于特殊功能寄存器SFR只能用直接寻址方式访问,而无其它方法。,3.寄存器寻址,寄存器寻址对选定的8个工作寄存器R0R7以及A、B和DPTR进行操作,也就是操作数在寄存器中,因此指定了寄存器就得到了操作数,寄存器寻址的指令中以寄存器的符号来表示寄存器。例如:MOVA,R0;(A)(R0)这条指令的意义是把所用的工作寄存器组中的R0的内容送到累加器A中。值得一提的是工作状态寄存器的选择是通过程序状态寄存器来控制的,在这条指令前,应通过PSW设定当前工作寄存器组。,4.寄存器间接寻址,寄存器中存放的是操作数的地址,也即操作数是通过寄存器指向的地址单元得到的,这便是寄存器间接寻址名称的由来。例如指令:MOVA,R0;(A)(R0)这条指令的意义是R0寄存器指向地址单元中的内容送到累加器A中。假如R0=#56H,那么是将56H单元中的数据送到累加器A中。这里要强调的是:寄存器的内容不是操作数本身,而是操作数的地址。寄存器间接寻址使用所选定寄存器区中的R0和R1作为地址指针,来寻址片内数据存储器RAM(00FFH)的256个单元,但它不能访问特殊功能寄存器SFR。寄存器间接寻址也适用于访问外部数据存储器,此时,用R0、R1或DPTR作为地址指针。寄存器间接寻址用符号“”指明。,例如:MOVR1,#80H;(R1)80HMOVA,R1;(A)(80H),5.基址加变址寄存器间接寻址,基址加变址寄存器间接寻址是以DPTR或PC作为基址寄存器,以累加器A作为变址寄存器,将两寄存器的内容相加形成操作数的16位的实际地址。例如:MOVA,A+DPTRMOVXA,A+PCJMPA+DPTR在这三条指令中,A作为偏移量寄存器,DPTR或PC作为变址寄存器,A作为无符号数与DPTR或PC的内容相加,得到访问的实际地址。其中前两条是程序存储器读指令,后一条是无条件转移指令。,6.相对寻址,相对寻址是以当前程序计数器PC值加上指令规定的偏移量rel,而构成实际操作数地址的寻址方法。它用于访问程序存储器,常出现在相对转移指令中。转移的目的地址可参见如下表达式:目的地址=转移指令地址+转移指令字节数+偏移量rel值得注意的是,偏移量是有正负号之分的,偏移量的取值范围是当前PC值的-128+127之间。,若PC=2050H,JZ为双字节指令,则:JZ08H程序转移的目标地址为:PC+2+rel=2050H+2+08H补=205AHJZF4H程序转移的目标地址为:PC+2+rel=2050H+2+F4H补=2046H,7.位寻址,在MCS-51单片机中,RAM中的20H2FH字节单元对应的位地址为00H7FH,特殊功能寄存器中的某些位也可进行为寻址,这些单元既可以采用字节方式访问它们,也可采用位寻址的方式访问它们。例如:SETBPSW.3;(PSW.3)1,综上所述,在MCS-51系列单片机的存储空间中,指令究竟对哪个存储器空间进行操作是由指令操作码和寻址方式确定的。7种寻址方式如表所示。,MCS-51的指令系统,MCS-51共有111条指令,可分为5类:1.数据传送类指令2.算数运算类指令3.逻辑运算及移位类指令4.控制转移类指令5.布尔变量操作类指令,1.数据传送指令,在MCS-51单片机的数据传送指令总共有28条,分为:内部数据传送指令外部数据传送指令程序存储器向累加器A传送数据指令数据交换指令堆栈操作指令,内部数据传送指令,这类指令的源操作数和目的操作数地址都在单片机的内部,可以是片内RAM的地址,也可以是特殊功能寄存器SFR的地址。其指令通式为:MOV,其中,为源操作数,为目的操作数。该指令的功能是把源操作数送到目的操作数单元,源操作数单元中的源操作数不变。按照寻址方式,内部数据传送指令又可以分为立即寻址型、直接寻址型、寄存器寻址型和寄存器间接寻址型等四类。,立即寻址型传送指令,这类指令的特点是源操作数字节是立即数总共有5条指令:MOVA,#data;(A)dataMOVRn,#data;(Rn)dataMOVRi,#data;(Ri)dataMOVdirect,#data;(direct)dataMOVDPTR,#data16;(DPTR)data16这组指令表明,8位立即数可以直接传送到内部数据区RAM的各个位置,并且可把16位立即数直接装入数据指针DPTR。,直接寻址型传送指令,直接传送型指令的特点是指令码中至少含有一个源操作数和目的操作数的直接地址。这类指令共有如下5条:MOVA,direct;A(direct)MOVRn,direct;Rn(direct)MOVRi,direct;(Ri)(direct)MOVdirect2,direct1;direct2(direct1),这组指令将直接地址所规定的内部RAM单元(片内RAM的00H7FH,SFR的80HFFH单元)内容传送到累加器A,寄存器Rn,并能实现内部数据寄存器RAM之间、特殊功能寄存器SFR之间或SFR与内部RAM之间的直接数据传递。直接传递不需要通过累加器A或者工作寄存器来间接传送,从而提高了数据传送的效率例如:MOVP2,P1;(P2)(P1)该指令的功能是不通过其它寄存器,直接把P1口(口地址90H)的内容传送到P2口(口地址A0H)输出,提高了效率。,寄存器寻址数据传送指令,这类指令总共有如下5条:MOVA,Rn;ARnMOVRn,A;RnAMOVdirect,Rn;directRnMOVdirect,A;directA这组指令的功能是把累加器A的内容传送到内部数据区RAM的各个单元,或者把指定工作寄存器R0R7中的内容传送到累加器A或direct所指定的片内RAM的00H7FH单元或特殊功能寄存器SFR中去。但不能用这类指令在内部工作寄存器之间直接传送。例如:不存在MOVR1,R2这样的指令。,寄存器间接寻址型数据传送指令,这一类指令可以分为如下三条:MOVA,Rn;A(Ri)MOVdirect,Ri;(Ri)-direct这三条指令的共同点是Ri存放的不是操作数本身,而是操作数所在存储单元的地址。第一条指令的功能是把中的内容为地址的操作数传送到累加器A中;第二条指令的功能是把累加器A中的操作数传送到以Ri中内容为地址的存储单元;第三条指令的作用是把以Ri中的内容地址的源操作数传送到direct存储单元。,内部RAM间数据传递关系,外部数据传送指令,MCS-51单片机CPU对片外扩展的数据存储器RAM或I/O口进行数据传送,必须采用寄存器间接寻址的方法,通过累加器A来完成。一般数据的传送是通过P0口和P2口完成的,即片外RAM地址总线低8位由P0口送出,高8位由P2口送出,数据总线(8位)也由P0口传送(双向),但与低8位地址总线是分时传送的。,这类数据传送指令共有以下4条单字节指令,指令操作码助记符标志为MOVX。MOVXA,DPTR;(A)(DPTR)MOVXA,Ri;(A)(Ri)MOVXDPTR,A;(DPTR)(A)MOVXRi,A;(Ri)(A),例如:设外部RAM(0203H)=FFH,分析以下指令执行后的结果。MOVDPTR,0203H;(DPTR)0203HMOVXA,DPTR;(A)(DPTR)MOV30H,A;(30H)(A)MOVA,0FH;(A)0FHMOVXDPTR,A;(DPTR)(A)执行结果为:(DPTR)=0203H,(30H)=FFH,(0203H)=(A)=0FH。,程序存储器向累加器A传送数据指令,程序存储器向累加器A传送数据指令,又称查表指令。它采用变址寻址方式,把程序存储器(ROM或EPROM)中存放的表格数据读出,传送到累加器A。它共有如下两条单字节指令,指令操作码助记符为MOVC。MOVCA,A+DPTR;(A)(A)+(DPTR)MOVCA,A+PC;(PC)(PC)+1,(A)(A)+(PC),例:在外部ROM/EPROM中,从2000H单元开始依次存放09的平方值:0、1、4、9、81,要求依据累加器A中的值(09)来查找所对应的平方值,分析下述程序的结果。MOVDPTR,2000H;(DPTR)2000HMOVA,09H;(A)09HMOVCA,A+DPTR;(A)(A)+(DPTR)执行结果:(DPTR)=2000H,(A)=51H(81的十六进制数)。,例:仍以外部ROM/EPROM2000H单元开始存放09的平方值,以PC作为基址寄存器进行查表。解:设MOVC指令所在地址(PC)=1FF0H,则偏移量=2000H-(1FF0H+1)=0FH,相应的程序如下:MOVA,09H;(A)09HADDA,0FH;地址调整MOVCA,A+PC;(A)(A)+(PC)+1)执行结果为:(PC)=1FF1H,(A)=51H。,数据交换指令,数据传送类指令一般都用来将操作数自源地址传送到目的地址,指令执行后,源地址的操作数不变,目的地址的操作数则修改为源地址的操作数。而数据交换指令其数据作双向传送,涉及传送的双方互为源地址、目的地址,指令执行后各方的操作数都修改为另一方的操作数。因此,两操作数均未冲掉、丢失。,数据交换类指令共有如下5条指令:XCHA,direct;(A)(direct)XCHA,Ri;(A)(Ri)XCHA,Rn;(A)(Rn)XCHDA,Ri;(A30)(Ri)30)SWAPA;(A74)(A30),例:设(R0)=30H,(30H)=4AH,(A)=28H,则:执行XCHA,R0结果为:(A)=4AH,(30H)=28H执行XCHDA,R0结果为:(A)=2AH,(30H)=48H执行SWAPA结果为:(A)=82H,堆栈操作类指令,堆栈操作有进栈和出栈操作,即压入和弹出数据,常用于保存或恢复现场。该类指令共有如下两条指令:(SP)(SP)+1(SP)(direct)(direct)(SP)(SP)(SP)-1,PUSHdirect,POPdirect,例:若在外部ROM/EPROM中2000H单元开始依次存放09的平方值,数据指针(DPTR)=3A00H,用查表指令取出2003H单元的数据后,要求保持DPTR中的内容不变。完成以上功能的程序如下:MOVA,03H;(A)03HPUSHDPH;保护DPTR高8位入栈PUSHDPL;保护DPTR低8位入栈MOVDPTR,2000H;(DPTR)2000HMOVCA,A+DPTR;(A)(2000H+03H)POPDPL;弹出DPTR低8位POPDPH;弹出DPTR高8位,(先进后出),数据传送指令总结,以累加器A为目的操作数的数据传送指令1)MOVA,#data;dataA2)MOVA,Rn;(Rn)A3)MOVA,Ri;(Ri)A4)MOVA,direct;(direct)A以寄存器Rn为目的操作数的数据传送指令1)MOVRn,#data;dataRn2)MOVRn,direct;(direct)Rn3)MOVRn,A;(A)Rn,以Ri间址单元为目的操作数的数据传送指令1)MOVRi,#data;data(Ri),2)MOVRi,direct;(direct)(Ri)3)MOVRi,A;(A)(Ri)以直接地址direct为目的操作数的数据传送指令1)MOVdirect,#data;datadirect,2)MOVdirect2,direct1;(direct1)direct23)MOVdirect,Rn;(Rn)direct4)MOVdirect,Ri;(Ri)direct5)MOVdirect,A;(A)direct,16位立即数传送指令MOVDPTR,#data16;data16DPTR外RAM数据传送指令MOVXDPTR,A;(A)(DPTR)MOVXA,DPTR;(DPTR)AMOVXRi,A;(A)(Ri)MOVXA,Ri;(Ri)AROM数据传送指令MOVCA,A+DPTR;(A)+(DPTR)AMOVCA,A+PC;(A)+(PC)A,数据交换指令XCHA,Rn;(A)(Rn)XCHA,direct;(A)(direct)XCHA,Ri;(A)(Ri)XCHDA,Ri;(A)30(Ri)30SWAPA;(A)74(A)30堆栈操作指令PUSHdirect;SP(SP)+1,(SP)(direct)POPdirect;(SP)direct,SP(SP)-1,数据传送类指令助记符与操作,利用传送类指令并用多种方法将内部RAM中50H单元的内容与40H单元的内容互换。,方法1:MOVA,50HMOV50H,40HMOV40H,A,方法2:MOVA,50HXCH40H,AMOV50H,A,方法3:PUSH50HPUSH40HPOP50HPOP40H,用按键控制灯管发光,如图,编程实现:当按键Ki被按下时对应的发光管Li就发光。,GND,按键Ki被按下时,相应端口线P2.i为低电平0若要发光管Li亮,对应的端口线P1.i应为低电平0按键控制发光管,只需将端口线P2.i的数据送给端口线P1.I输出即可。参考程序:ORG0000HLJMPMAINMAIN:MOVP1,P2AJMPMAIN,2.算术运算指令,算术运算指令共有24条,算术运算主要是执行加、减、乘、除法四则运算,还有加1、减1操作以及BCD码的运算和调整。虽然MCS-51单片机的算术逻辑单元ALU仅能对8位无符号整数进行运算,但利用进位标志C,则可进行多字节无符号整数的运算。同时利用溢出标志,还可以对带符号数进行补码运算。需要指出的是,除加、减1指令外,这类指令大多数都会对PSW有影响,这在使用中应特别注意。,不带进位位的加法指令ADDADDA,#data;例:ADDA,#10HADDA,direct;例:ADDA,10HADDA,Rn;例:ADDA,R7ADDA,Ri;例:ADDA,R0用途:将A中的值与其后面的值相加,最终结果否是回到A中。,带进位位的加法指令ADDCADDCA,#dataADDCA,directADDCA,RnADDCA,Ri用途:将A中的值和其后面的值相加,并且加上进位位C中的值。,说明:由于MCS-51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到0-65535。如何合并呢?,例:1067H+10A0H先做低8位加法67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是7,而1则到了PSW中的CY位了。然后再做高8位加法,并加上低8位的进位10H+10H+CY,结果是21H,所以最终的结果是2107H。所以在进行多字节的加法运算或多次的加法运算中应使用ADDC,将低字节的进位考虑进来。,例:双字节无符号数加法(R0R1)+(R2R3)(R4R5)。假设其和不超过16位,其编程如下:MOVA,R1;取被加数低字节ADDA,R3;低字节相加MOVR5,A;保存和低字节MOVA,R0;取高字节被加数ADDCA,R2;两高字节之和加低位进位MOVR4,A;保存和高字节,带借位的减法指令SUBBSUBBA,#dataSUBBA,directSUBBA,RnSUBBA,Ri说明:没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将Cy清零即可。,乘法指令MULAB此指令的功能是将A和B中的两个8位无符号数相乘,两数相乘结果一般比较大,因此最终结果用1个16位数来表达,其中高8位放在B中,低8位放在A中。在乘积大于FFFFH时,OV置1(溢出),否则OV为0,而CY总是0。例:(A)=4EH,(B)=5DH,执行指令MULAB后,乘积是1C56H,所以在B中放的是1CH,而A中放的则是56H。,除法指令DIVAB此指令的功能是将A中的8位无符号数除以B中的8位无符号数(A/B)。结果,商放在A中,余数放在B中,CY和OV都是0。如果在做除法前B中的值是00H,也就是除数为0,那么OV=1。,加1指令INCAINCRnINCdirectINCRiINCDPTR用途很简单,就是将后面目标中的值加1。,说明:从结果上看INCA和ADDA,#1差不多,但INCA是单字节,单周期指令,ADDA,#1则是双字节,双周期指令,而且INCA不会影响PSW位ADDA,#1,不会影响CY因此加1指令并不适合做加法,事实上它主要是用来做计数、地址增加等用途。另外,加法类指令都是以A为核心操作数,其中一个数必须放在A中,而运算结果也必须放在A中,而加1类指令的对象则广泛得多,可以是寄存器、内存地址、间址寻址的地址等等。,减1指令DECADECRnDECdirectDECRi与加1指令类似。,十进制调整指令DAA在进行BCD码运算时,这条指令总是跟在ADD或ADDC指令之后,其功能是将执行加法运算后存于累加器A中的结果进行调整和修正。十进制调整指令是一条对二十进制的加法进行调整的指令。两个压缩BCD码按二进制相加,必须经过本条指令调整后才能得到正确的压缩BCD码和数,实现十进制的加法运算。由于指令要利用AC、CY等标志才能起到正确的调整作用,因此它必须跟在加法ADD、ADDC指令后面方可使用。,例:双字节压缩BCD码加法。解:设R5(高)、R4(低)为被加数;R3(高)、R2(低)为加数,相加和的结果存入:R6(万)、R5(千、百)、R4(十、个)。参考程序如下:MOVA,R4;被加数十位、个位送入AADDA,R2;十位、个位相加DAA;和的十位、个位调整MOVR4,A;和的十位、个位存入R4MOVA,R5;被加数千位、百位送入AADDCA,R3;千位、百位的和加低位进位DAA;和的千位、百位调整MOVR5,A;和的千位、百位存入R5MOVA,00H;A清零ADDCA,00H;求和的万位值MOVR6,A;和的万位存入R6,3.逻辑运算和移位指令,逻辑运算和移位指令共有25条,有与、或、异或、求反、左右移位、清0等逻辑操作,有直接、寄存器和寄存器间址等寻址方式。这类指令一般不影响程序状态字(PSW)标志。,循环移位指令RLA;累加器A中的内容循环左移一位,不影响进位标志RRA;累加器A中的内容循环右移一位,不影响进位标志RLCA;累加器A中的内容连同进位CY左移一位RRCA;累加器A中的内容连同进位CY右移一位,累加器半字节交换指令SWAPA;这条指令是将累加器中的内容高低半字节互换。求反指令CPLA;这条指令将累加器中的内容按位取反。清零指令CLRA;这条指令将累加器中的内容清0。,逻辑与操作指令这组指令的作用是将两个单元中的内容按位执行逻辑与并将结果存入累加器或直接地址中。ANLA,direct;ANLA,#data;ANLA,Rn;ANLA,Ri;ANLdirect,#data;ANLdirect,A;,逻辑或操作指令这组指令的作用是将两个单元中的内容按位执行逻辑或并将结果存入累加器或直接地址中。ORLA,#data;ORLA,direct;ORLA,Rn;ORLA,Ri;ORLdirect,#data;ORLdirect,A;,逻辑异或操作指令这组指令的作用是将两个单元中的内容按位执行逻辑异或操作并将结果存入累加器或直接地址中。XRLA,#data;XRLA,direct;XRLA,Rn;XRLA,Ri;XRLdirect,#data;XRLdirect,A;,用P1口实现亮点流动,ORG0000HLJMPSTARTORG30HSTART:MOVSP,#5FHMOVA,#80HLOOP:MOVP1,ARLALCALLDELAYLJMPLOOPDELAY:MOVR7,#255D1:MOVR6,#255D2:NOP,NOPNOPNOPDJNZR6,D2DJNZR7,D1RETEND,点亮了哪一个灯?,4.控制转移指令,控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间。MCS-51系列单片机的控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令。这些指令的执行一般都不会对标志位有影响。,无条件转移指令,JMP/SJMP/AJMP/LJMP这组指令执行完后,程序就会无条件转移到指令所指向的地址上去。长转移指令访问的程序存储器空间为16位地址64KB,绝对转移指令访问的程序存储器空间为11位地址2KB空间。,LJMPaddr16;长转移指令,addr16(PC),给程序计数器赋予新值(16位地址)AJMPaddr11;短转移指令,(PC)+2(PC),addr11(PC100),程序计数器赋予新值(11位地址),(PC1511)不改变SJMPrel;相对转移指令,(PC)+2+rel(PC)当前程序计数器先加上2再加上8位偏移量给程序计数器赋予新值JMPA+DPTR;间接转移指令,(A)+(DPTR)(PC),累加器所指向地址单元的值加上数据指针的值给程序计数器赋予新值,条件转移指令,程序可利用这组丰富的指令根据当前的条件进行判断,看是否满足某种特定的条件,从而控制程序的转向。JZrel;(A)=0,(PC)+2+rel(PC),累加器中的内容为0,则转移到偏移量所指向的地址,否则程序往下执行JNZrel;(A)0,(PC)+2+rel(PC),累加器中的内容不为0,则转移到偏移量所指向的地址,否则程序往下执行,DJNZRn,rel;(Rn)-1(Rn),(Rn)0,(PC)+2+rel(PC),工作寄存器Rn减1不等于0,则转移到偏移量所指向的地址,否则程序往下执行DJNZdata,rel;(Rn)-1(Rn),(Rn)0,(PC)+2+rel(PC)直接地址单元中的内容减1不等于0,则转移到偏移量所指向的地址,否则程序往下执行,CJNEA,direct,rel;(A)(direct),(PC)+3+rel(PC),累加器中的内容不等于直接地址单元的内容,则转移到偏移量所指向的地址,否则程序往下执行CJNEA,#data,rel;(A)#data,(PC)+3+rel(PC),累加器中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行,CJNERn,#data,rel;(Rn)#data,(PC)+3+rel(PC),工作寄存器Rn中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行CJNERi,#data,rel;(Ri)#data,(PC)+3+rel(PC),工作寄存器Ri指向地址单元中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行,子程序调用指令,子程序是为了便于程序编写,减少那些需反复执行的程序占用多余的地址空间而引入的程序分支,从而有了主程序和子程序的概念,需要反复执行的一些程序,我们在编程时一般都把它们编写成子程序,当需要用它们时,就用一个调用命令使程序按调用的地址去执行,这就需要子程序的调用指令和返回指令。,子程序调用指令,LCALLaddr16;长调用指令,可在64KB空间调用子程序。此时(PC)+3(PC),(SP)+1(SP),(PC7-0)(SP),(SP)+1(SP),(PC15-8)(SP),addr16(PC),即分别从堆栈中弹出调用子程序时压入的返回地址ACALLaddr11;绝对调用指令,可在2KB空间调用子程序。此时(PC)+2(PC),(SP)+1(SP),(PC7-0)(SP),(SP)+1(SP),(PC15-8)(SP),addr11(PC10-0),LCALL和ACALL指令类似于转移指令LJMP和AJMP,不同之处在于它们在转移前要把执行完该指令的PC内容自动压入堆栈后,才将addr16(或addr11)送往PC,即把子程序的入口地址装入PC。执行这两条指令不影响标志位。,返回指令,RET;子程序返回指令。此时(SP)(PC15-8),(SP)-1(SP),(SP)(PC7-0),(SP)-1(SP)RETI;中断返回指令,除具有RET功能外,还具有恢复中断逻辑的功能需注意的是:RETI指令不能用RET代替,空操作指令,NOP;(PC)(PC)+1空操作指令是一条单字节单周期指令。它控制CPU不做任何操作,仅仅是消耗这条指令执行所需要的一个机器周期的时间,不影响任何标志,故称为空操作指令。但由于执行一次该指令需要一个机器周期,所以常在程序中加上几条NOP指令用于设计延时程序,拼凑精确延时时间或产生程序等待等。,5.布尔变量操作类指令,布尔处理功能是MCS-51系列单片机的一个重要特征,这是出于实际应用需要而设置的。布尔变量也即开关变量,它是以位(bit)为单位进行操作的。在物理结构上,MCS-51单片机有一个布尔处理机,它以进位标志做为累加位,以内部RAM可寻址的128个为存储位。既然有布尔处理机功能,所以也就有相应的布尔操作指令集。,位传送指令,位传送指令就是可寻址位与位累加器CY之间的传送,指令有两条。MOVC,bit;bitCY,某位数据送CYMOVbit,C;CYbit,CY数据送某位不影响其他寄存器的内容或标志,由于两个寻址位之间没有直接的传送指令,常用上述两条指令并通过C作为中间媒介来进行寻址位间的传送。例如:将内部RAM中20H单元的第7位(位地址为07H)的内容,送入P1口的P1.0中的程序如下:MOVC,07H;(CY)(07H)MOVP1.0,C;(P1.0)(CY)当(20H)=A3H,(P1)=11111110B时,执行上述指令后修改了P1口第0位,即(CY)=1,(P1)=11111111B。,位置位、复位指令,这些指令对CY及可寻址位进行置位或复位操作,共有四条指令。CLRC;0CY,清CYCLRbit;0bit,清某一位SETBC;1CY,置位CYSETBbit;1bit,置位某一位,例如:将P1口的P1.7置位,并清进位位的程序如下:SETBP1.7;(P1.7)1CLRC;(CY)0当(P1)=00001111B时,执行完上述指令后,(P1)=10001111B,(CY)=0。,位运算指令,位运算都是逻辑运算,有与、或、非三种指令,共六条。ANLC,bit;(CY)(bit)CYANLC,/bit;(CY)(bit)CYORLC,bit;(CY)(bit)CYORLC,/bit;(CY)(bit)CYCPLC;(CY)CYCPLbit;(bit)bit,CALLPR2JMP$PR2:MOVC,P1.1;(CY)(P1.1)ORLC,P1.2;(CY)(P1.1)(P1.2)=AANLC,P1.0;(CY)(P1.0)ACPLC;(CY)MOVF0H,C;F0H内暂存BMOVC,P1.3;(CY)(P1.3)ANLC,/P1.4;(CY)(P1.3)ORLC,F0H;(CY)BDMOVP1.5,C;运算结果送入P1.5RET,例2:利用位逻辑指令,模拟图37所示硬件逻辑电路功能。参考子程序如下:,位控制转移指令,位控制转移指令是以位的状态作为实现程序转移的判断条件:JCrel;(CY)=1转移,(PC)+2+relPC,否则程序往下执行,(PC)+2PC。JNCrel;(CY)=0转移,(PC)+2+relPC,否则程序往下执行,(PC)+2PC。JBbit,rel;位状态为1转移。JNBbit,rel;位状态为0转移。JBCbit,rel;位状态为1转移,并使该位清“0”。后三条指令都是三字节指令,如果条件满足,(PC)+3+relPC,否则程序往下执行,(PC)+3PC。,JC/JNC这两条指令常和比较条件转移指令CJNE一起使用,先由CJNE指令判别两个操作数是否相等,若相等就顺序执行;若不相等则依据两个操作数的大小置位或清零CY,再由JC或JNC指令根据CY的值决定如何进一步分支,从而形成三分支的控制模式,如图所示。,有符号数的表示,对于有符号数,机器数常用的表示方法有原码、反码和补码三种。原码:最高有效位为符号位,0表示正数,1表示负数。反码:正数的反码与原码相同;负数的反码由原码除符号位外按位取反获得。补码:正数的补码与原码相同;负数的补码由反码加1获得。数X的原码记作X原,反码记作X反,补码记作X补计算机内部默认采用补码表示有符号数。,设数x的原码记作x原,如机器字长为n,则原码定义如下:在原码表示法中,最高位为符号位(正数为0,负数为1),其余数字位表示数的绝对值。n位原码表示数值的范围是,对应的原码是11110111。0的原码有两种形式。,原码,例如,当机器字长n=8时,+0原=00000000B-0原=27+0=10000000B+8原=00001000B-8原=27+8=10001000B+127原=01111111B-127原=27+127=11111111B当机器字长n=16时,+0原=0000000000000000B-0原=215+0=1000000000000000B+8原=0000000000001000B-8原=215+8=1000000000001000B,原码表示法简单直观,且与真值的转换很方便,但不便于在计算机中进行加减运算。如进行两数相加,必须先判断两个数的符号是否相同。如果相同,则进行加法运算,否则进行减法运算。如进行两数相减,必须比较两数的绝对值大小,再由大数减小数,结果的符号要和绝对值大的数的符号一致。按上述运算方法设计的算术运算电路很复杂。因此,计算机中通常使用补码进行加减运算,这样就引入了反码表示法和补码表示法。,设数x的反码记作x反,如机器字长为n,则反码定义如下:n位反码表示数值的范围是,对应的反码是10000111。0的反码有两种形式。,反码,正数的反码与其原码相同:例如,当机器字长n=8时:+0反=+0原=00000000B+127反=+127原=01111111B当机器字长n=16时:+8反=+8原=0000000000001000B+127反=+127原=0000000001111111B负数的反码是在原码基础上,符号位不变(仍为1),数值位按位取反。例如,当机器字长n=8时:-0反=(28-1)-0=11111111B-127反=(28-1)-127=10000000B,设数x的补码记作x补,如机器字长为n,则补码定义如下:n位补码表示数值的范围是,对应的补码是10000111。0的补码只有一种形式。,补码,正数的补码与其原码、反码相同。例如,当机器字长n=8时:+8补=+8反=+8原=00001000B+127补=+127反=+127原=01111111B当机器字长n=16时:+8补=+8反=+8原=0000000000001000B+127补=+127反=+127原=0000000001111111B,负数的补码是在原码基础上,符号位不变(仍为1),数值位按位取反,末位加1;或在反码基础上末位加1。例如,当机器字长n=8时:-8原=10001000B-8反=11110111B-8补=28-8=11111000B-127原=11111111B-127反=10000000B-127补=28-127=10000001B,真值与机器数之间的转换,原码转换为真值:根据原码定义,将原码数值位各位按权展开求和,由符号位决定数的正负即可由原码求出真值。例:已知x原=00011111B,y原=10011101B,求x和yx原=00011111B,说明x为正数x=+(026+025+124+123+122+121+120)=31y原=10011101B,说明y为负数y=-(026+025+124+123+122+021+120)=-29,反码转换为真值:要求反码的真值,只要先求出反码对应的原码,再按上述原码转换为真值的方法即可求出其真值。正数的原码是反码本身。负数的原码可在反码基础上,符号位仍为1不变,数值位按位取反。例:已知x反=00001111B,y反=11100101B,求x和yx原=x反=00001111B,x=+(026+025+024+123+122+121+120)=15y原=10011010B,y=-(026+025+124+123+022+121+020)=-26,补码转换为真值:同理,要求补码的真值,也要先求出补码对应的原码。正数的原码与补码相同。负数的原码可在补码基础上再次求补,即:,例:已知x补=00001111B,y补=11100101B,求x和yx原=x补=00001111B,x=+(026+025+024+123+122+121+120)=15y原=y补补=10011011B,y=-(026+025+124+123+022+121+120)=-27,补码加法运算:在计算机中,凡是带符号数一律用补码表示,运算结果自然也是补码。其运算特点是:符号位和数值位一起参加运算,并且自动获得结果(包括符号位与数值位)。补码加法的运算规则为:即:两数补码的和等于两数和的补码。,补码的加减运算,例:已知+51补=00110011B,+66补=01000010B,-51补=11001101B,-66补=10111110B,求:+66补+51补=?+66补+-51补=?-66补+-51补=?,可以看出,不论被加数、加数是正数还是负数,只要直接用它们的补码直接相加,当结果不超出补码所表示的范围时,计算结果便是正确的补码形式。但当计算结果超出补码表示范围时,结果就不正确了,这种情况称为溢出。例:-34补+-98补=?-34补=11011110B,-98补=10011110B-34补+-98补=00111100B显然错误!原因:-34+-98=-132-127,超出补码表示范围(8位),发生溢出。,补码减法:补码减法的运算规则为:,例:已知+51补=00110011B,+66补=01000010B,51补=11001101B,66补=10111110B,求+66补+51补=?66补51补=?+66补+51补=+66补+51补66补51补=66补+51补,可以看出,无论被减数、减数是正数还是负数,上述补码减法的规则都是正确的。同样,由最高位向更高位的进位会自动丢失而不影响运算结果的正确性。,MCS-51汇编语言程序设计,伪指令在汇编源程序的过程中,还有一些指令不要求计算机进行任何操作,也没有对应的机器码,不产生目标程序,不影响程序的执行,仅仅是能够帮助汇编进行的一些指令,称之为伪指令。它主要用来指定程序或数据的起始位置,给出一些连续存放数据的确定地址,或为中间运算结果保留一部分存储空间以及表示源程序结束等等。不同版本的汇编语言,伪指令的符号和含义可能有所不同,但是基本用法是相似的。下面介绍几种常用的基本伪指令。,(1)设置目标程序起始地址伪指令ORG。格式:标号:ORG16位地址该伪指令的功能是规定其后面目标程序的起始地址。它放在一段源程序(主程序、子程序)或数据块的前面,说明紧跟在其后的程序段或数据块的起始地址就是指令中的16位地址(4位十六进制数)。例如:ORG2000HSTART:MOVA,7FH,(2)结束汇编伪指令END。格式:标号:ENDEND是汇编语言源程序的结束标志,表示汇编结束。在END以后所写的指令,汇编程序都不予以处理。一个源程序只能有一个END命令。在同时包含有主程序和子程序的源程序中,也只能有一个END命令,并放到所有指令的最后,否则,就有一部分指令不能被汇编。,(3)定义字节伪指令DB。格式:标号:DB项或项表其中项或项表指一个字节,或用逗号分开的字符串,或以引号括起来的字符串(一个字符用ASCII码表示,就相当于一个字节)。该伪指令的功能是把项或项表的数值(字符则用ASCII码)存入从标号开始的连续存储单元中。,例如:ORG2000HTAB1:DB30H,8AH,7FH,73DB5,A,“BCD“由于ORG2000H,所以TAB1的地址
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 客户关系培训
- 消息队列协议书
- 过年酒席租赁合同协议
- 《新生儿的护理与喂养》课件
- 邻居协议书模板
- 房地产企业保密协议
- 暗股股份协议书
- 测绘服务协议示本
- 轮胎质保协议书范本
- 道路硬化售砖合同协议
- (三模)遵义市2025届高三年级第三次适应性考试英语试卷(含答案)
- (三模)豫西北教研联盟 (平许洛济)2024-2025学年高三第三次质量检测生物试卷(含答案)
- 《思想道德与法治》课件-第三章 继承优良传统 弘扬中国精神
- NB/T 11646-2024井工煤矿采空区自然发火监测预警技术规范
- 2025年劳动与社会保障专业考核试卷及答案
- 《危险化学品企业安全生产标准化规范》专业深度解读与应用培训指导材料之1:1范围+3术语和定义(雷泽佳编制-2025A0)
- 第18课《井冈翠竹》课件-2024-2025学年统编版语文七年级下册
- 第16课《有为有不为》公开课一等奖创新教学设计
- 【MOOC】《思想道德与法治》(东南大学)章节中国大学慕课答案
- 卜算子-送鲍浩然之浙东课件
- MOOC 中医与辨证-暨南大学 中国大学慕课答案
评论
0/150
提交评论