收藏 分销(赏)

单片机第3章 AT89S51单片机的指令系统.ppt

上传人:s4****5z 文档编号:13985820 上传时间:2026-05-22 格式:PPT 页数:88 大小:3.30MB 下载积分:10 金币
下载 相关 举报
单片机第3章 AT89S51单片机的指令系统.ppt_第1页
第1页 / 共88页
单片机第3章 AT89S51单片机的指令系统.ppt_第2页
第2页 / 共88页


点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,3,章,AT89S51,单片机的 指令系统,AT89S51,单片机,使用,MCS-51,指令系统,。,介绍指令系统,寻址方式,对,111,条,基本指令,按功能分类详细讲解,。,指令,-,是,CPU,按照人们的意图来完成某种操作的命令,它以英文名称或缩写形式作为,助记符,。,汇编语言指令,-,用助记符、符号地址、标号等表示的书写程序的语言。,掌握汇编语言指令是程序设计的,基础,。,内容概要,3.1,指令系统概述,简明、易掌握、效率较高的指令系统,,,复杂指令集,。,按,所占字节分,,分,三种,:,(,1,)单字节指令,49,条;,(,2,)双字节指令,45,条;,(,3,)三字节指令,17,条。,按,执行时间来分,,分三种:,(,1,),1,个,机器周期(,12,个时钟振荡周期)的指令,64,条,;,(,2,),2,个,机器周期指令,45,条,;,(,3,),4,个,机器周期,乘、除指令,。,12MHz,晶振,每个机器周期为,1,s,。,AT89S51,一大特点,是在硬件结构中有一个,位处理机,,,一个处理,位变量,的,指令子集,。,3.2,指令格式,指令格式,:,指令的表示方法。,指令通常由,两部分,组成:,操作码,和,操作数,。,操作码,指令进行什么,操作,。,操作数,指令操作的,对象,。可能是一具体数据,也可能是指出到哪里取得数据的地址或符号。,指令长度不同,格式也就不同。,(,1,)单字节指令:操作码和操作数同在一个字节中。,(,2,)双字节指令:一个字节为操作码,另一个字节是操作数,。,(,3,)三字节指令:操作码占一个字节,操作数占二个字节,。,3.3,指令系统的寻址方式,寻址方式,在指令中说明操作数所在地址的方法。,一般说,寻址方式越多,功能就越强,灵活性则越大,指令系统就越复杂。,寻址方式所要解决的主要问题,就是如何在整个存储器和寄存器的寻址空间内快速地,找到指定的地址单元,。,下面介绍指令系统,7,种,寻址方式。,1,寄存器寻址方式,指令中的操作数为某一寄存器的内容。,例如:,MOVA,,,R,n,;,(R,n,),A,,,n,=0,7,把,R,n,中的源操作数送入到累加器,A,中。由于指令指定了从寄存器,R,n,中取得源操作数,所以称为寄存器寻址方式。,本,寻址方式的寻址范围:,(,1,),4,组通用工作寄存区共,32,个工作寄存器。但只对,当前工作寄存器区,的,8,个工作寄存器寻址,指令中的寄存器名称只能是,R0,R7,。,(,2,)部分特殊功能寄存器,如累加器,A,、寄存器,B,以及数据指针寄存器,DPTR,等。,2,直接寻址方式,指令中直接给出操作数的单元地址,该单元地址中的内容就是操作数,直接的操作数单元地址用,“,direct,”,表示。,例如:,MOVA,,,direct,“,direct,”,就是操作数的单元地址,。,例如:,MOVA,,,40H,表示把内部,RAM 40H,单元(,direct,)的内容传送到,A,。指令中,源操作数(右边的操作数)采用的是,直接寻址方式,。,指令中两个操作数都可由直接寻址方式给出,。,例如:,MOVdirect1,,,direct2,具体指令:,MOV 42H,,,62H,把片内,RAM,中,62H,单元的内容送到片内,RAM,中的,42H,单元中,。,直接寻址,是访问片内所有特殊功能寄存器的,唯一寻址方式。,寻址范围:,(1),内部,RAM,的,128,个单元,(2),特殊功能寄存器。除了以单元地址的形式外,还可用,寄存器符号,的形式给出。例如:,MOV A,,,80H,与,MOV A,,,P0,是等价的,。,3.,寄存器间接寻址方式,寄存器中存的是,操作数地址,,即先从寄存器中找到操作数的地址,再按该地址找到操作数。,为了区别寄存器寻址和寄存器间接寻址,在寄存器间接寻址方式中,应在寄存器名称前面加,前缀标志,“,”,。,访问内部,RAM,或外部,RAM,的低,256,个字节时,,只能采用,R0,或,R1,作为间址寄存器,。例如:,MOV A,,,Ri,;,i=0,或,1,其中,Ri,中的内容为,40H,,把内部,RAM40H,单元内容送,A,。,寻址范围:,(,1,)访问,内部,RAM,低,128,个,单元,其通用形式为,Ri,(,2,)对,外部,RAM,的,64K,字节,的间接寻址,例如:,MOVX A,,,DPTR,(,3,)片外数据存储器的低,256,字节,例如:,MOVX A,,,Ri,(,4,)堆栈区,堆栈操作指令,PUSH,(压栈)和,POP,(出栈)使用堆栈指针(,SP,)作间址寄存器,4,立即数寻址方式,直接在指令中给出操作数,也称,立即数,。为了与直接寻址指令中的直接地址加以区别,,需在操作数前加前缀标志,“,#,”,。,例如:,MOV A,,,#40H,第一个字节是操作码,第二字节是立即数,,,就是放在程序存储器内的常数。,5,基址寄存器加变址寄存器间址寻址方式,以,DPTR,或,PC,作为,基址寄存器,,以累加器,A,作为,变址寄存器,,以两者内容相加形成的,16,位地址作为目的地址进行寻址。例如指令:,MOVCA,,,A+DPTR,其中,,(,A,),=05H,,,(,DPTR,),=0400H,,指令执行结果是把程序存储器,0405H,单元的内容传送给,A,。,(,1,)本寻址方式是,专门针对程序存储器,的寻址方式,寻址范围可达到,64KB,。,(,2,),本寻址方式的,指令有,3,条,:,MOVCA,,,A+DPTR,MOVCA,,,A+PC,JMPA+DPTR,前两条指令适用于读程序存储器中固定的数据。,例如,,将固定的、按一定顺序排列的,表格,存放在程序存储器中,在程序运行中由,A,的动态参量来确定读取对应的表格参数,。,第,3,条为,散转指令,,,A,中内容为程序运行后的动态结果,可根据,A,中不同内容,实现跳向不同程序入口的跳转。,6,相对寻址方式,解决程序转移。,该,寻址是以该转移指令的地址(,PC,值)加上它的字节数,再加上,相对偏移量(,rel,),,形成,新的转移目的地址,,从而程序转移到该目的地址。转移的目的地址,用下式计算:,目的地址,=,转移指令所在的地址,+,转移指令字节数,+rel,其中,,偏移量,rel,是带符号,8,位二进制补码数,,,128,+127,。,程序转移范围,是以转移指令的,下条指令首地址,为基准地址,相对偏移在,128,+127,之间。,例如,,LJMP rel,程序要转移到该指令的,PC,值加,3,再加上,rel,的目的地址处。,向,地址增加方向,最大可转移(,127+,转移指令字节)个单元地址,向,地址减少方向,最大可转移(,128-,转移指令字节)个单元地址。,编写程序时,只需在转移指令中直接写要转向的地址标号。,例如:,LJMP LOOP,“,LOOP,”,为目的地址标号。汇编时,由汇编程序自动计算和填入偏移量。但手工汇编时,偏移量的值,由,手工计算。,7,位寻址方式,对内部,RAM,和特殊功能寄存器具有位寻址功能的某位内容进行置,1,和清,0,操作。,位地址一般以,直接位地址,给出,位地址符号为,“,bit,”,。,例如:,MOV C,,,bit,其具体指令:,MOV C,,,40H,把位地址为,40H,的值送到进位位,C,。,由于,AT89S51,具有位处理功能,可直接对数据位方便地实现置,1,、清,0,、求反、传送、判跳和逻辑运算等操作,为测控系统的应用提供了最佳代码和速度,增强了实时性。,寻址范围包括:,(,1,)内部,RAM,中的位寻址区,。,位有两种表示方法,,,例如,,40H,;另一种是单元地址加上位,例如,,(28H).0,,指的是,28H,单元中的最低位。它们是等价的。,(,2,),特殊功能寄存器中的可寻址位,可寻址位在指令中有如下,4,种的表示方法:,a.,直接使用位地址。,例如:,PSW.5,的位地址为,0D5H,。,b.,位名称的表示,方法。,例如:,PSW.5,是,F0,标志位,可使用,F0,表示该位。,c.,单元地址加位数,的表示方法。,例如,:(0D0H).5,。,d.,特殊功能寄存器符号加位数,的表示方法。,例如,:PSW.5,。,表,2-3,内部,RAM,的可寻址位及位地址,表,2-4 SFR,中的位地址分布,7,种寻址方式,已介绍完毕。,问题:,当一条指令给定后,如何来确定该指令的寻址方式?,例如,:,MOV A,,,#40H,,属于立即数寻址还是寄存器寻址?,要看以哪个操作数,作为参照系,。,操作数分为,源操作数,和,目的操作数,。对于,源操作数,“,#40H,”,来说,是,“,立即数寻址,”,方式,但对,目的操作数,“,A,”,来说,是属于,“,寄存器寻址,”,方式。,一般而言,,寻址方式指的是,源操作数,,所以此例为立即数寻址方式。,对指令系统,7,种寻址方式,总结,概括,见,表,3-1,。,序号,寻址方式,寻址空间,1,寄存器寻址,R0,R7,、,A,、,B,、,C(,位,),、,DPTR,等,2,直接寻址,内部,128,字节,RAM,、特殊功能寄存器,3,寄存器间接寻址,片内数据存储器、片外数据存储器,4,立即数寻址,程序存储器中的立即数,5,基址寄存器加变址寄存器间,接寻址,读程序存储器固定数据和程序散转,6,相对寻址,程序存储器相对转移,7,位寻址,内部,RAM,中的可寻址位、,SFR,中的可寻址位,表,3-1,7,种寻址方式及其寻址空间,3.4.1,数据传送类指令,使用最频繁,。一般数据传送类指令的助记符为,“,MOV,”,,,通用格式,如下:,MOV ,,,数据传送类指令是,把,源操作数,传送,到,目的操作数,。指令执行,之,后,源操作数不改变,目的操作数修改为源操作数。所以数据传送类操作属,“,复制,”,性质,,而不是,“,搬家,”,。,本,类指令,不影响标志位,:,Cy,、,Ac,和,OV,,但,不包括,奇偶标志位,P,。,1,以累加器为目的操作数的指令,MOVA,,,R,n,;,(R,n,),A,,,n,=0,7,MOVA,,,R,i,;,(,R,i,),A,i,=0,,,1,MOVA,,,direct,;,(direct),A,MOVA,,,#data,;,#data,A,把源操作数内容送累加器,A,,,源操作数,有寄存器寻址、直接寻址、间接寻址和立即数寻址等方式,例如:,MOVA,,,R6,;,(R6),A,,寄存器寻址,MOVA,,,R0,;,(R0),A,,间接寻址,MOVA,,,70H,;,(70H),A,,直接寻址,MOVA,,,#78H,;,78H,A,,立即数寻址,2,以,Rn,为目的操作数的指令,MOV,R,n,,,A,;,(A),R,n,,,n,=0,7,MOV,R,n,,,direct,;,(direct),R,n,,,n,=0,7,MOV,R,n,,,#data,;,#data,R,n,,,n,=0,7,把源操作数送入当前寄存器区的,R0,R7,中的某一寄存器。,3,以直接地址,direct,为目的操作数的指令,MOV direct,,,A,;,(A),direct,MOV direct,,,R,n,;,(,R,n,),direct,,,n,=0,7,MOV direct1,,,direct2,;,(direct2),direct1,MOV direct,,,R,i,;,(,R,i,),direct,,,i,=0,,,1,MOV direct,,,#data,;,#data,direct,把源操作数送入直接地址指定的存储单元。,direct,指的是内部,RAM,或,SFR,地址。,4,以寄存器间接地址为目的操作数的指令,MOVR,i,,,A,;,(A),(R,i,),,,i,=0,,,1,MOVR,i,,,direct,;,(direct),(R,i,),,,i,=0,,,1,MOVR,i,,,#data,;,#data,(R,i,),,,i,=0,,,1,功能是把源操作数内容送入,R0,或,R1,指定的存储单元中。,5,16,位数传送指令,MOVDPTR,,,#data16,;,#data16,DPTR,功能是把,16,位立即数送入,DPTR,,用来设置数据存储器的地址指针。,AT89S51,有两个,DPTR,,通过设置,特殊功能寄存器,AUXR1,中的,DPS,位,来选择。当,DPS=1,,则指令中的,DPTR,即为,DPTR1,,,DPTR0,被屏蔽,反之亦然。,DPTR,为,16,位的数据指针,分为,DPH,和,DPL,。,操作十分灵活方便。,设有两个,DPTR,后,就可避免频繁的出入堆栈操作,。,对于所有,MOV,类指令,累加器,A,是一个特别重要的,8,位寄存器,,CPU,对它具有其他寄存器所没有的操作指令。后面将要介绍的加、减、乘、除指令都是以,A,作为目的操作数,。,R,n,为所选择的寄存器组中的,R0,R7,,,直接地址,direct,为内部,RAM,的,00H,7FH,和特殊功能寄存器(地址范围,80H,FFH,),在间接地址中,用,R0,或,R1,作为内部,RAM,的地址指针,可访问内部,RAM,的,00H,7FH,共,128,个单元。,6,堆栈操作指令,内部,RAM,中设定一个,后进先出,(,LIFO,,,Last In First Out,)的区域,称,为,堆栈,。在特殊功能寄存器中有一个,堆栈指针,SP,,指,示,堆栈的栈顶位置。堆栈操作有进栈和出栈两种,因此,在指令系统中相应有两条堆栈操作指令。,(,1,)进栈指令,PUSH direct,首先将栈指针,SP,加,1,,然后把,direct,中的内容送到,SP,指示的内部,RAM,单元中。,例如:,当,(SP)=60H,,,(A)=30H,,,(B)=70H,时,执行下列指令,PUSHAcc,;,(SP)+1=61H,SP,,,(A),61H,PUSHB,;,(SP)+1=62H,SP,,,(B),62H,结果,:,(61H)=30H,,,(62H)=70H,,,(SP)=62H,。,(,2,)出栈指令,POPdirect,将,SP,指示的栈顶单元,的,内容送入,direct,字节,中,,,SP,减,1,。,例如:,当,(SP)=62H,,,(62H)=70H,,,(61H)=30H,时,执行指令,POP DPH,;,(SP),DPH,,,(SP)-1,SP,POP DPL,;,(SP),DPL,,,(SP)-1,SP,结果为,(DPTR)=7030H,,,(SP)=60H,。,7,累加器,A,与外部数据存储器,RAM/IO,传送指令,MOVX A,,,DPTR,;,(DPTR),A,,读外部,RAM/IO,MOVX A,,,R,i,;,(R,i,),A,,读外部,RAM/IO,MOVX DPTR,,,A,;,(A),(DPTR),,写外部,RAM/IO,MOVX R,i,,,A,;,(A),(R,i,),,写外部,RAM/IO,MOV,的后面加,“,X,”,,表示访问的是片外,RAM,或,I/O,口,在执行前两条指令,,(,P3.7,),有效;后两条指令,,(,P3.6,),有效。,采用,16,位的,DPTR,间接寻址,,可寻址整个,64KB,片外数据存储器空间,高,8,位地址(,DPH,)由,P2,口输出,低,8,位地址(,DPL,)由,P0,口输出。,采用,R,i,(,i,=0,,,1,)进行间接寻址,,可寻址片外,256,个单元的数据存储器。,8,位地址由,P0,口输出,锁存在地址锁存器中,然后,P0,口再作为,8,位数据口。,8,查表指令,共,两条,,,仅有的,两条,读程序存储器中表格数据的指令,。由于程序,存储器只读,不写,因此传送,为,单向,从程序存储器中读出,数据到,A,中。两条查表指令均采用基址寄存器加变址寄存器间接寻址方式。,(,1,),MOVCA,,,A+PC,以,PC,作为基址寄存器,,,A,的内容,(,无符号数,),和,PC,的当前值(下一条指令的起始地址)相加后得到一个,新的,16,位地址,,把该地址的内容送到,A,。,例如:,当,(A)=30H,时,执行地址,1000H,处的指令,1000H,:,MOVCA,,,A+PC,该指令占用一个字节,下一条指令的地址为,1001H,,,(PC)=1001H,再加上,A,中的,30H,,,得,1031H,,结果,把,程序存储器中,1031H,的内容送入累加器,A,。,优点,:,不改变特殊功能寄存器及,PC,的状态,根据,A,的内容就可以取出表格中的常数。,缺点,:,表格只能存放在,该条查表指令所在地址的,+256,个单元之内,,表格大小受到限制,且表格只能被一段程序所用。,(,2,),MOVC A,,,A+DPTR,DPTR,为基址寄存器,,A,的内容,(,无符号数,),和,DPTR,的内容相加得到一个,16,位地址,把由该地址指定的程序存储器单,元的内容送到累加器,A,。,例如:,(DPTR)=8100H,,,(A)=40H,,执行指令,MOVC A,,,A+DPTR,将程序存储器中,8140H,单元,内容送入,A,中。,本,指令执行结果只与指针,DPTR,及累加器,A,的内容有关,与该指令存放的地址及常数表格存放的地址无关,因此,表格的大小和位置可以在,64KB,程序存储器空间中任意安排,,一个表格,可以为各个程序块公用,。,两条指令的助记符都是在,MOV,的后面加“,C,”,,,是,CODE,的第一个字母,即表示程序存储器中的代码。,执行上述两条指令时,单片机的,引脚信号(程序存储器读)有效,这一点读者要牢记。,9,字节交换指令,XCHA,,,R,n,;,(A)(R,n,),,,n,=0,7,XCHA,,,direct,;,(A)(direct),XCHA,,,R,i,;,(A)(R,i,),,,i,=0,,,1,这组指令的功能是将累加器,A,的内容和源操作数的内容相互交换。源操作数有寄存器寻址、直接寻址和寄存器间接寻址等方式。例如:,(A)=80H,,,(R7)=08H,,,(40H)=F0H,(R0)=30H,,,(30H)=0FH,执行下列指令:,XCHA,,,R7,;,(A)(R7),XCHA,,,40H,;,(A)(40H),XCHA,,,R0,;,(A)(R0),结果为,(A)=0FH,,,(R7)=80H,,,(40H)=08H,,,(30H)=F0H,。,结果为,(A)=0FH,,,(R7)=80H,,,(40H)=08H,,,(30H)=F0H,。,10,半字节交换指令,XCHD A,,,R,i,累加器的低,4,位与内部,RAM,低,4,位交换。,例如:,(R0)=60H,,,(60H)=3EH,,,(A)=59H,,执行完“,XCHD A,,,R0”,指令,则,(A)=5EH,,,(60H)=39H,。,3.4.2,算术运算类指令,指令系统中,有单字节的加、减、乘、除法指令,算术运算功能比较强。,算术运算指令都是,针对,8,位二进制无符号数,的,如要进行带符号或多字节二进制数运算,需编写具体的运算程序,通过执行程序实现。,算术运算的结果将使,PSW,的进位(,Cy,)、辅助进位(,Ac,)、溢出(,OV,),3,种标志位,置,1,或清,0,。,但增,1,和减,1,指令,不影响这些标志,。,1,加法指令,4,条指令:,ADD A,,,R,n,;,(A)+(R,n,),A,,,n=0,7,ADD A,,,direct,;,(A)+(direct),A,ADD A,,,R,i,;,(A)+(R,i,),A,,,i=0,,,1,ADD A,,,#data,;,(A)+#data,A,8,位加法指令的,一个加数,总是来自累加器,A,,而,另一个加数,可由寄存器寻址、直接寻址、寄存器间接寻址和立即数寻址等不同的寻址方式得到。加的结果总是放在累加器,A,中。,使用,本,指令时,要注意累加器,A,中的运算结果,对各个标志位的影响:,(,1,)如果,位,7,有进位,,则进位标志,Cy,置,1,,否则,Cy,清,0,。,(,2,)如果,位,3,有进位,,辅助进位标志,Ac,置,1,,,否则,Ac,(,Ac,为,PSW,寄存器中的一位)清,0,。,(,3,)如果,位,6,有进位,,而,位,7,没有进位,,或者,位,7,有进位,,而,位,6,没有进位,,则溢出标志位,OV,置,1,,,否则,OV,清,0,。,溢出标志位,OV,的状态,,只有带符号数加法运算时才有意义。当两个带符号数相加时,,OV=1,,表示加法运算超出了累加器,A,所能表示的带符号数的有效范围(,-128,+127,),即产生了溢出,表示运算结果是错误的,否则运算是正确的,即无溢出产生。,【,例,3-1,】,(A)=53H,,,(R0)=FCH,,执行指令,ADDA,,,R0,运算式为,结果,:,(A)=4FH,,,Cy=1,,,Ac=0,,,OV=0,,,P=1,(,A,中,1,的位数为奇数)。,注意:,在上面的运算中,由于位,6,和位,7,同时有进位,所以标志位,OV=0,。,【,例,3-2,】,(A)=85H,,,(R0)=20H,,(,20H,),=AFH,,执行指令,ADD A,,,R0,运算式为,结果,:,(A)=34H,,,Cy=1,,,Ac=1,,,OV=1,,,P=1,。,注意:,由于位,7,有进位,而位,6,无进位,所以标志位,OV=1,。,2,带进位加法指令,特点是进位标志位,Cy,参加运算,三个数相加。,4,条指令:,ADDC A,,,R,n,;,(A)+(R,n,)+C,A,,,n,=0,7,ADDC A,,,direct,;,(A)+(direct)+C,A,ADDC A,,,R,i,;,(A)+(R,i,)+C,A,,,i,=0,,,1,ADDC A,,,#data,;,(A)+#data+C,A,如果,位,7,有进位,,则进位标志,Cy,置“,1,”,,否则,Cy,清“,0,”,;,如果,位,3,有进位,,则辅助进位标志,Ac,置“,1,”,,否则,Ac,清“,0,”,;,如果,位,6,有进位,而,位,7,没有进位,,或者,位,7,有进位,而,位,6,没有进位,,则溢出标志,OV,置“,1,”,,否则标志,OV,清“,0,”,。,【,例,3-3,】,(A)=85H,,,(20H)=FFH,,,Cy=1,,执行指令,ADDCA,,,20H,运算式为,结果为,(A)=85H,,,Cy=1,,,Ac=1,,,OV=0,,,P=1,(,A,中,1,的位数为奇数,。,3,增,1,指令,5,条指令:,INC A,INC R,n,;,n,=0,7,INC direct,INC R,i,;,i,=0,,,1,INC DPTR,把指令中所指出的变量增,1,,且不影响,PSW,中的任何标志。,指令,“,INC DPTR,”,,,16,位数增,1,指令。首先对低,8,位指针,DPL,执行加,1,,当溢出时,就对,DPH,的内容进行加,1,,不影响标志,Cy,。,4,十进制调整指令,用于对,BCD,码加法运算结果的内容修正,指令格式为,:,DA A,是对压缩的,BCD,码(一个字节存放,2,位,BCD,码)的加法结果进行十进制调整。,两个,BCD,码按二进制相加之后,必须经本指令的调整才能得到正确的压缩,BCD,码的和数。,(,1,)十进制调整问题,对,BCD,码加法运算,只能借助于二进制加法指令。,但,二进制数加法原则上并不适于十进制数的加法运算,有时会产生错误结果。例如:,上述的,BCD,码运算中:,(,a,)结果正确。,(,b,)结果不正确,因为,BCD,码中没有,1111,这个编码。,(,c,)结果不正确,正确结果应为,17,,而运算结果却是,11,。,可见,,二进制数加法指令不能完全适用于,BCD,码十进制数的加法运算,要对结果做有条件的修正,这就是所谓的十进制调整问题。,(,2,)出错原因和调整方法,出错原因在于,BCD,码共有,16,个编码,,但,只用其中的,10,个,,剩下,6,个没用到。这,6,个没用到的编码(,1010,,,1011,,,1100,,,1101,,,1110,,,1111,),为,无效编码,。,在,BCD,码加运算中,凡结果进入或者跳过,无效编码区,时,结果,出错,。因此,1,位,BCD,码加法运算出错的情况有,两种,:,加结果,大于,9,,说明已经,进入,无效编码区。,加结果,有进位,,说明已经,跳过,无效编码区。,无论哪种错,误,,都因为,6,个无效编码,造成的。因此,只要出现上述两种情况之一,就必须调整。,方法是把运算结果,加,6,调整,,即,十进制调整修正,。,十进制调整方法如下:,累加器低,4,位大于,9,或辅助进位位,Ac=1,,则低,4,位加,6,修正。,累加器高,4,位大于,9,或进位位,Cy=1,,则高,4,位加,6,修正。,累加器高,4,位为,9,,低,4,位大于,9,,高,4,位和低,4,位分别加,6,修正,上述调整修正,是,通过执行指令“,DA A,”,来自动实现的,。,【,例,3-4,】,(A)=56H,,,(R5)=67H,,把它们看作两个压缩的,BCD,数,进行,BCD,加法。执行指令:,ADD A,,,R5,DA A,高,4,位和低,4,位分别大于,9,,所以“,DA A,”,指令要分别加,6,,对结果修正。,结果为,(A)=23H,,,Cy=1,。,由上可见,,56+67=123,,结果正确,。,5,带借位的减法指令,4,条指令:,SUBB A,,,R,n,;,(A)-(R,n,)-Cy,A,,,n,=0,7,SUBB A,,,direct,;,(A)-(direct)-Cy,A,SUBB A,,,R,i,;,(A)-(R,i,)-Cy,A,,,i,=0,,,1,SUBB A,,,#data,;,(A)-#data-Cy,A,从,A,的内容减去指定变量和进位标志,Cy,的值,结果存在,A,中。,如果位,7,需借位,则,Cy,置,1,,否则,Cy,清,0,;,如果位,3,需借位,则,Ac,置,1,,否则,Ac,清,0,;,如果位,6,借位而位,7,不借位,,或者,位,7,借位而位,6,不借位,,则溢出标志位,OV,置“,1,”,,否则,OV,清“,0,”,。,【,例,3-5,】,(A)=C9H,,,(R2)=54H,,,Cy=1,,执行指令,SUBB A,,,R2,运算式为,结果,:,(A)=74H,,,Cy=0,,,Ac=0,,,OV=1,(位,6,向位,7,借位)。,6,减,1,指令,DEC A,;,(A)-1,A,DEC R,n,;,(R,n,)-1,R,n,,,n,=0,7,DEC direct,;,(direct)-1,direct,DEC R,i,;,(R,i,)-1,(R,i,),,,i,=0,,,1,功能是指定的变量减,1,。若原来为,00H,,减,1,后下溢为,FFH,,不影响标志位(,P,标志除外)。,【,例,3-6,】,(A)=0FH,,,(R7)=19H,,,(30H)=00H,,,(R1)=40H,,,(40H)=0FFH,,执行指令,DEC A,;,(A)-1,A,DEC R7,;,(R7)-1,R7,DEC 30H,;,(30H)-1,30H,DEC R1,;,(R1)-1,(R1),结果,:,(A)=0EH,,,(R7)=18H,,,(30H)=0FFH,,,(40H)=0FEH,,,P=1,,不影响其他标志。,7,乘法指令,MUL AB,;,A,B,BA,积的低字节在累加器,A,中,高字节在,B,中。如果积大于,255,,则,OV,置,1,,否则,OV,清,0,。,Cy,标志总是清,0,。,8,除法指令,DIV AB,;,A/B,A(,商,),,余数,B,商(为整数)存放在,A,中,余数存放在,B,中,且,Cy,和溢出标志位,OV,清“,0,”,。,如果,B,的内容为,0,(即除数为,0,),则存放结果的,A,、,B,中的内容不定,并溢出标志位,OV,置,1,。,【,例,3-7,】,(A)=FBH,,,(B)=12H,,执行指令,DIV AB,结果,:,(A)=0DH,,,(B)=11H,,,Cy=0,,,OV=0,。,3.4.3,逻辑操作类指令,1,累加器,A,清“,0,”,指令,CLRA,累加器,A,清,0,。不影响,Cy,、,Ac,、,OV,等标志位。,2,累加器,A,求反指令,CPL A,将累加器,A,的内容按位逻辑取反,不影响标志位。,52,3,左环移指令,RLA,功能是,A,向左循环移位,位,7,循环移入位,0,,不影响标志位,,,如,图,3-1,所示。,4,带进位左环移指令,RLCA,将累加器,A,的内容和进位标志位,Cy,一起向左环移一位,,,如,图,3-2,所示。,52,图,3-1,左环移,操作,图,3-2,带进位左环移,操作,53,5,右环移指令,RR A,这条指令的功能是,A,的内容向右环移一位不影响其他标志位,,,如图,3-3,所示。,6,带进位右环移指令,RRC A,A,的内容和进位标志,Cy,一起向右环移一位,,,如图,3-4,所示。,53,图,3-3,右环移,操作,图,3-4,带进位右环移,操作,54,7,累加器半字节交换指令,SWAP A,是将累加器,A,的高半字节(,Acc.7,Acc.4,)和低半字节(,Acc.3,Acc.0,)互换。,【,例,3-8,】,(A)=95H,,执行指令,SWAP A,结果为,(A)=59H,。,8,逻辑与指令,ANLA,,,R,n,;,(A),(R,n,),A,,,n,=0,7,ANLA,,,direct,;,(A),(direct),A,ANLA,,,#data,;,(A),#data,A,ANLA,,,R,i,;,(A),(R,i,),A,,,i,=0,1,ANLdirect,,,A,;,(direct),(A),direct,ANLdirect,,,#data,;,(direct),#data,direct,54,55,是在指定的变量之间以位为基础进行“逻辑与”操作,结果存放到目的变量所在的寄存器或存储器中。,【,例,3-9,】,(A)=07H,,,(R0)=0FDH,,执行指令,ANLA,,,R0,运算式为,结果,:,(A)=05H,。,55,56,9,逻辑或指令,ORLA,,,R,n,;,(A),(R,n,),A,,,n,=0,7,ORLA,,,direct,;,(A),(direct),A,ORLA,,,#data,;,(A),#data,A,ORLA,,,R,i,;,(A),(R,i,),A,,,i,=0,,,1,ORLdirect,,,A,;,(direct),(A),direct,ORLdirect,,,#data,;,(direct),#data,direct,是在所指定的变量之间执行位的“逻辑或”操作,结果存到目的变量寄存器或存储器中。,56,57,【,例,3-10,】,(P1)=05H,,,(A)=33H,,执行指令,ORLP1,,,A,运算式为,结果,:,(P1)=35H,。,57,58,10,逻辑异或指令,XRLA,,,R,n,;,(A),(R,n,),A,,,n,=07,XRLA,,,direct,;,(A),(direct),A,XRLA,,,R,i,;,(A),(R,i,),A,,,i,=0,,,1,XRLA,,,#data,;,(A),#data,A,XRLdirect,,,A,;,(direct),(A),direct,XRLdirect,,,#data,;,(direct),#data,direct,功能是在所指定的变量之间执行以,位,的“逻辑异或”操作,结果存到目的变量寄存器或存储器中。,58,59,【,例,3-11,】,(A)=90H,,,(R3)=73H,,执行指令,XRLA,,,R3,运算式为,结果,:,(A)=E3H,。,59,60,3.4.4,控制转移类指令,1,长转移指令,LJMPaddr16,指令执行时,把转移的目的地址,即指令的第二和第三字节分别装入,PC,的高位和低位字节中,无条件地转向,addr16,指定的目的地址,:,64KB,程序存储器地址空间的任何位置。,2,相对转移指令,SJMPrel,无条件转移,,rel,为相对偏移量,,,是一单字节的带符号,8,位二进制补码数,因此程序转移是双向的。,rel,如为正,,,向地址增大的方向转移;,rel,如为负,,向地址减小的方向转移。,60,61,执行时,在,PC,加,2,(本指令为,2B,)之后,把指令的有符号的偏移量,rel,加到,PC,上,并计算出目的地址。,编程,时,,只需写上目的地址标号,相对偏移量由汇编程序自动计算。例如:,LOOP,:,MOV A,,,R6,SJMP LOOP,汇编时,,跳,到,LOOP,处的偏移量由汇编程序自动计算和填入。,3,绝对转移指令,AJMPaddr11,61,62,指令双字节,格式如下:,指令,提供,11,位地址,A10,A0,(即,addr11,),其中,A10,A8,则位于,第,1,字节的高,3,位,,,A7,A0,在,第,2,字节,。,操作码,只占,第,1,字节的低,5,位,。,指令构造转移目的地址:,执行本指令,,PC,加,2,,然后把指令中的,11,位,无符号整数地址,addr11,(,A10,A0,),送入,PC.10,PC.0,,,PC.15,PC.11,保持不变,形成新的,16,位转移目的地址。,63,需注意,目标地址必须与,AJMP,指令的下一条指令首地址的高,5,位地址码,A15,A11,相同,否则将混乱。所以,是,2KB,范围内的无条件跳转指令。,4,间接跳转指令,JMP A+DPTR,单字节转移指令,,目的地址,由,A,中,8,位无符号数与,DPTR,的,16,位无符号数内容之和来确定。以,DPTR,内容为,基址,,,A,的内容作为,变址,。给,A,赋予不同值,即可实现多分支转移。,64,5,条件转移指令,执行指令时,如,条件满足,,则转移;不满足,则顺序执行下一指令。,转移目的地址,在以下一条指令首地址为中心的,256B,范围内(,-128,+127,)。,JZrel,;如果累加器内容为,0,,则执行转移,JNZrel,;如果累加器内容非,0,,则执行转移,6,比较不相等转移指令,CJNEA,,,direct,,,rel,CJNEA,,,#data,,,rel,CJNE R,n,,,#data,,,rel,CJNE R,i,,,#data,,,rel,65,比较前两个操作数大小,如果值,不相等则转移,,并转向目的地址。,如果第一操作数(无符号整数)小于第二操作数,(无符号整数),则进位标志位,Cy,置,1,,否则,Cy,清,0,。该指令的执行不影响任何一个操作数的内容。,7,减,1,不为,0,转移指令,把减,1,与条件转移两种功能合在一起。,两条:,DJNZR,n,,,rel,;,n,=0,7,DJNZdirect,,,rel,66,用于控制程序循环,。预先装入循环次数,,以减,1,后是否为“,0,”,作为转移条件,,,即实现按次数控制循环。,8,调用子程序指令,(,1,)长调用指令,LCALL addr16,可调用,64KB,范围内程序存储器中的任何一个子程序。执行时,,先把,PC,加,3,获得下一条指令的地址(断点地址),,并压入堆栈(先低位字节,后高位字节),堆栈指针加,2,。,接着,把指令的第二和第三字节(,A15,A8,,,A7,A0,)分别装入,PC,的高位和低位字节中,,然后从,PC,指定的地址开始执行程序。执行后,不影响任何标志位。,67,(,2,)绝对调用指令,ACALL addr11,与,AJMP,指令类似,为,兼容,MCS
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服