您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 机械/模具设计 > 单片机第四章 MCS-51指令系统
2020/1/241§4.1概述第四章MCS-51指令系统指令:主机能直接识别和接受并指挥计算机执行某种操作的命令。指令系统:是一种CPU所能直接执行的所有命令的集合。机器语言(指令代码):二进制代码表示的计算机自身固有的语言,缺点是不便记忆。汇编语言:计算机的机器语言指令一一对应。优点:直观、易记忆、好理解和好阅读、程序紧凑、灵活、占内存少,执行速度快,实时性强。缺点:通用性差、编程工作量大。2020/1/242功能数据传送类:29条算术运算类:24条逻辑运算类:24条控制转移类:17条位操作类:17条运算速度单周期指令:64条双周期指令:45条四周期指令:2条字节数单字节指令:49条双字节指令:45条三字节指令:17条7种寻址方式,111条指令2020/1/243常用符号Rn:工作寄存器中的寄存器R0、R1…R7之一,Ri:工作寄存器中的寄存器R0或R1#data:8位立即数#data16:16位立即数direct:片内RAM或SFR的地址(8位)@间接寻址寄存器Bit:片内RAM或SFR的位地址addr11:11位目的地址addr16:16位目的地址2020/1/244rel:补码形式的8位地址偏移量。偏移范围为-128~127/:位操作指令中,该位求反后参与操作,不影响该位。X:片内RAM的直接地址或寄存器。(X):相应地址单元中的内容。→:箭头左边的内容送入箭头右边的单元内。2020/1/245§4.2寻址方式4.2.1立即寻址ImmediateAddressing操作数就包含在指令代码中,在操作码之后,称为立即数,用“#”表示。MCS-51如:MOVP1,#80HMOVR7,#0F5HMOVDPTR,#1245H8086/8088MOVAL,80HMOVAL,0F5HMOVBX,1245H操作数存在程序存储器中2020/1/2464.2.2直接寻址DirectAddressing直接使用数所在单元的地址找到了操作数,所以称这种方法为直接寻址。操作数在SFR、内部RAM、位地址空间。如:MOVA,00HMOVC,60HMOVA,0F0H8086/8088CPUMOVAL,[2000H]2020/1/2474.2.3寄存器寻址RegisterAddressing对选定的工作寄存器R0~R7、累加器A、通用寄存器B、地址寄存器DPTR中的数进行操作。例:MOVA,R0;将R0工作寄存器中的数据送到累加器A中去。提一个问题:我们知道,工作寄存器就是内存单元的一部分,如果我们选择工作寄存器组0,则R0就是RAM的00H单元,那么这样一来,MOVA,00H和MOVA,R0不就没什么区别了吗?MOVAL,BL(8086CPU的寄存器寻址方式)2020/1/248的确,这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去,但是执行的过程不同,执行第一条指令需要2个机器周期,而第二条则只需要1个机器周期,第一条指令变成最终的目标码要两个字节(E5H00H),而第二条则只要一个字节(E8H)就可以了。2020/1/2494.2.4寄存器间接寻址RegisterIndirectAddressing把地址放在另外一个寄存器中,根据这个寄存器中的数值决定该到哪个单元中取数据。R0,R1----8位地址,片内、外低128字节DPTR----16位,片外64KBMCS-51如:MOVA,@R0MOVXA,@R0MOVXA,@DPTR8086/8088CPUMOVAL,[BX]MOVAX,[SI]操作数在片内RAM中操作数在片外RAM中操作数在片外RAM中2020/1/2410以DPTR或PC为基址寄存器,累加器A为变址寄存器。把两者内容相加,结果作为操作数的地址。常用于查表操作。MCS-51MOVCA,@A+DPTR;(A+DPTR)→AMOVCA,@A+PC;PC+1→PC,(A+PC)→A4.2.5变址寻址(基址+变址)Base-Register-plus-Index-Register-IndirectAddressing8086/8088CPUMOVAL,[BX+SI]MOVAX,[BP+DI]操作数在程序存储器中2020/1/2411E0A程序存储区2040H9320E0H472041H………DPH20DPL00ALU如:MOVCA,@A+DPTR设DPTR=2000H,A=E0H20E0H47指令代码2020/1/2412E0A程序存储区ALU如:MOVCA,@A+PC设A=E0H2121H452040H832121H452041H………2120H47当前PC指令代码2020/1/24134.2.6相对寻址将PC中的当前内容与指令第二字节给出的数相加,结果作为跳转指令的转移地址(转移目的地址)。PC中的当前内容称为基地址(本指令后的字节地址)指令第二字节给出的数据称为偏移量,1字节带符号数.常用于跳转指令。如:JC23H若C=0,不跳转;C=1,跳转.RelativeAddressing改变PC2020/1/2414程序存储区ALU如:JC23H1025H1000H401025H451001H23……1024H471002H3023H1002H指令代码当前PC如:JCAAA2020/1/2415对片内RAM的位寻址区和某些可位寻址的特殊功能寄存器进行位操作时的寻址方式。如:SETB3DH;将27H.5位置1CLRC;Cy位清08086/8088CPU无此寻址方式4.2.7位寻址BitAddressing操作数在片内RAM位地址区或SFR某些位中2020/1/2416寻址方式涉及的存储器空间寻址方式寻址空间(操作数存放空间)立即寻址程序存储器直接寻址片内RAM低128字节、SFR寄存器寻址工作寄存器R0~R7,A,B,DPTR寄存器间接寻址片内RAM:@R0,@R1,SP片外RAM:@R0,@R1,@DPTR变址寻址程序存储器:@A+PC,@A+DPTR相对寻址程序存储器256字节范围内:PC+偏移量位寻址片内RAM的位寻址区(20H~2FH字节地址)某些可位寻址的SFR2020/1/2417§4.3数据传送类指令(29条)DataTransferInstructionMCS-51助记符:8086/8088助记符:MOV、MOVX、MOVCMOVXCH、XCHD、SWAPXCHGPUSH、POPPUSH、POP源操作数寻址方式(5种):立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址。目的操作数寻址方式(3种):直接寻址、寄存器寻址、寄存器间接寻址除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。2020/1/2418MCS-51单片机片内数据传送图2020/1/24194.3.1以累加器为目的操作数的指令(4条)MOVA,Rn;Rn→AMOVA,direct;(direct)→AMOVA,@Ri;(Ri)→AMOVA,#data;data→A将源操作数指定内容送到A中。4.3.2以寄存器Rn为目的操作数的指令(3条)MOVRn,AMOVRn,directMOVRn,#data这组指令功能是把源操作数指定的内容送入当前工作寄存器,源操作数不变。2020/1/24204.3.3以直接地址为目的操作数的指令(5条)MOVdirect,AMOVdirect,RnMOVdirect1,direct2;8086无此指令MOVdirect,@RiMOVdirect,#data这组指令功能是把源操作数指定的内容送入由直接地址指出的片内存储单元。例:MOV20H,AMOV20H,R1MOV20H,30HMOV20H,@R1MOV0A0H,#34HMOVP2,#34H;功能同上2020/1/24214.3.4以间接地址为目的操作数的指令(3条)MOV@Ri,A;A→(Ri)MOV@Ri,direct;(direct)→(Ri)MOV@Ri,#data;data→(Ri)功能:把源操作数指定的内容送入以R0或R1为地址指针的片内存储单元中。例:MOV@R0,AMOV@R1,20HMOV@R0,#34H2020/1/24224.3.5十六位数的传递指令(1条)MOVDPTR,#data168051是一种8位机,这是唯一的一条16位立即数传递指令。功能:将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。例:MOVDPTR,#1234H执行完了之后DPH中的值为12H,DPL中的值为34H。如果我们分别向DPH,DPL送数,则结果也一样。如下面两条指令:MOVDPH,#35HMOVDPL,#12H。则就相当于执行了MOVDPTR,#3512H。2020/1/24234.3.6累加器A与片外RAM之间的数据传递类指令(4条)MOVXA,@RiMOVX@Ri,AMOVXA,@DPTRMOVX@DPTR,A说明:1.在51中,与外部存储器RAM打交道的只可以是A累加器。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再送到0200H单元中去。2020/1/24242.要读或写外部的RAM,当然也必须要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口来提供。(演示举例)3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。MOVDPTR,#0100HMOVXA,@DPTRMOVDPTR,#0200HMOVX@DPTR,A思考:以上功能用Ri能实现吗?2020/1/24254.3.7读程序存储器指令(2条)MOVCA,@A+DPTRMOVCA,@A+PC本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格说明:查找到的结果被放在A中,因此,本条指令执行前后,A中的值不一定相同。例:有一个数在R0中,要求用查表的方法确定它的平方值(此数的取值范围是0-5)MOVDPTR,#100HMOVA,R0MOVCA,@A+DPTR.…ORG0100HDB0,1,4,9,16,25如果R0中的值为2,则最终地址为100H+2为102H,到102H单元中找到的是4。2020/1/2426例:某程序采用子程序调用进行查表(主程序).…MOVA,R0LCALLREL-PC.…REL-PC:INCAMOVCA,@A+PCRETDB0,1,4,9,16,25REL-PC:MOVCA,@A+PCDB0,1,4,9,16,25REL-PC:MOVCA,@A+PCRETDB0,1,4,9,16,25REL-PC:MOVCA,@A+PCDB0,1,4,9,16,25RET2020/1/24274.3.8堆栈操作(2条)PUSHdirect;SPSP+1,(SP)(direct)POPdirect;(direct)(SP),SPSP-1第一条为压入指令,就是将direct中的内容送入堆栈中,第二条为弹出指令,就是将堆栈中的内容送回到direct中。例:MOVSP,#5FHMOVA,#100MOVB,#20PUSHACCPUSHB则执行第一条PUSHACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元的值就是100,同样,执行PUSHB时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后,61H单元中的值变为20。2020/1/24284.3.9交换指令(5条)XCHA,Rn;A←→RnXC
本文标题:单片机第四章 MCS-51指令系统
链接地址:https://www.777doc.com/doc-3281069 .html