嵌入式计算机系统及实践之6-MCS-51 指令系统(一)-_第1页
嵌入式计算机系统及实践之6-MCS-51 指令系统(一)-_第2页
嵌入式计算机系统及实践之6-MCS-51 指令系统(一)-_第3页
嵌入式计算机系统及实践之6-MCS-51 指令系统(一)-_第4页
嵌入式计算机系统及实践之6-MCS-51 指令系统(一)-_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录Contents12345小结MCS-51指令概述指令的寻址方式数据传输类指令算术运算类指令1、MCS-51指令概述

汇编指令就是一种计算机语言,通过汇编器可以生成CPU能理解并执行的机器语言;有点像英文单词或者汉字,比如ADD指令执行加法操作,MOV指令则是数据传输等功能。1、MCS-51指令概述

CPU执行指令的过程与时序CPU执行指令的过程一般分为两步:1)取指令,2)译码,3)执行指令。1)取指令的过程,是指CPU根据程序设计的要求,将当前PC中的地址送到地址总线,并从程序存储器中读取机器码(包括操作码和操作数)的过程。2)指令执行的过程是指,根据指令的内容,CPU完成指令的执行,可以是逻辑运算,也可以是数据的读取,程序跳转等操作。上述两个过程是CPU根据用户程序设计,而自动执行的,无需人为干预。1、MCS-51指令概述

CPU工作示例MOVA,#02H;CPU程序memory7402数据memory指令寄存器IR7402第一步取指指令译码器IDMOVA,#02H;累加器A=2第三步执行第二步译码1、MCS-51指令概述

1、MCS-51指令概述

MCS51单片机有111条指令,通常按照指令的长短,功能,运算速度进行分类。字节数运算速度单字节指令:49条双字节指令:45条三字节指令:17条单周期指令:64条双周期指令:45条四周期指令:2条功能数据传送类:29条算术运算类:24条逻辑运算类:24条控制转移类:17条位操作类:17条以ADDA,30H为例1、MCS-51指令概述

注意:指令的长短和执行速度与寻址方式有关。指令长短指令执行速度指令长短指令执行速度1、MCS-51指令概述

3.机器周期:一个机器周期包括12个振荡周期。4.指令周期:执行一条指令的时间。1.振荡周期:晶体振荡器的周期(有参考资料称振荡周期为时钟周期。2.状态周期:一个状态周期(S)包含两个振荡周期,第一个振荡周期成为P1,第二个振荡周期为P2。1、MCS-51指令概述

指令周期举例INCA;单字节单周期指令ADDA,#0FH;双字节,单周期指令;INCDPTR;单字节双周期指令;MULAB;累加器乘寄存器B,四周期指令;DIVAB;累加器除以寄存器B;四周期指令;INTEL对每一条指令都给出了它的指令周期数,MCS-51单片机的所有指令中,有一些完成得比较快,只要1个机器周期就行了,有一些完成得比较慢,得要2个机器周期,还有两条指令要4个机器周期才行。1、MCS-51指令概述

时钟周期实例例子1:22.1184MHZ的晶振,它的振荡周期、状态周期和机器周期分别是多少?以51为例,晶振22.1184M,振荡周期就是(1/22.1184)μs,一个机器周期包含12个振荡周期,一个机器周期就是0.5425μs。一个机器周期一般是一条指令花费的时间,也有些是2个机器周期的指令,DJNZ,是双周期指令.例2如果选用6MHZ的晶振,一个机器周期为多少时间?一个机器周期需要12个振荡周期,所以一个机器周期的时间为2uS。注意事项:在软件定时,特别要注意晶振的振荡周期,另外需要注意的是,中断等对延时程序的打断干扰。1、MCS-51指令概述

内存中的地址机器码指令操作数1、MCS-51指令概述

执行周期1、MCS-51指令概述

常用符号Rn:工作寄存器中的寄存器R0、R1…R7之一,Ri:工作寄存器中的寄存器R0或R1#data:8位立即数#data16:16位立即数direct:片内RAM或SFR的地址(8位)@间接寻址寄存器Bit:片内RAM或SFR的位地址addr11:11位目的地址addr16:16位目的地址rel:补码形式的8位地址偏移量。偏移范围为-128~127/:位操作指令中,该位求反后参与操作,不影响该位X:片内RAM的直接地址或寄存器(X):相应地址单元中的内容→:箭头左边的内容送入箭头右边的单元内1、MCS-51指令概述

[标号:]汇编指令[目的操作数][,源操作数][;注释]START:ADDA,#10H;将立即数10H与A相加并存入A寄存器1)标号,由1~8个字母或数字构成,以字母开头以“:”结尾,标号可有可无,它仅仅代表了该指令所在的地址,便于源程序编写过程中使用该地址。

2)汇编指令,表示该指令所实现的操作功能,一般由2~5个英文字母表示。例如ORL,ADD,LCALL等。3)操作数,表示参与操作的数据来源和目的单元。操作数可以是一个立即数,也可以是一个内存单元或者是一个寄存器单元。

操作码和第一个操作数之间一般用一个或几个空格隔开,而操作数与操作数之间用逗号隔开。操作数可以有1个,2个,3个或没有。

4)如果需要对指令进行注释说明的话,在最后一个操作数后加一个分号,分号后面是注释。

1、MCS-51指令概述

标号操作码目的操作数源操作数即使是同一条指令,寻址方式不同,操作码会不同。目录Contents12345小结MCS-51指令概述指令的寻址方式数据传输类指令算术运算类指令2、指令的寻址方式2.1立即寻址ImmediateAddressing

操作数就包含在指令代码中,在操作码之后,称为立即数,用“#”表示。如:MOVP1,#80HMOVR7,#0F5HMOVDPTR,#1245H操作数存在程序存储器中

寻址方式:通俗地讲就是获得操作数的方式。

举个例子

MOVA,#10H;如何获得源操作数和目的操作数?

2、指令的寻址方式

2.2直接寻址DirectAddressing

直接使用数所在单元的地址找到了操作数,所以称这种方法为直接寻址。操作数在SFR、内部RAM、位地址空间。如:MOVA,00HMOVC,60HMOVA,0F0H2.3寄存器寻址RegisterAddressing

对选定的工作寄存器R0~R7、累加器A、通用寄存器B、地址寄存器DPTR中的数进行操作。例:MOVA,R0;将R0工作寄存器中的数据送到累加器A中去。这些数是地址!!!2、指令的寻址方式

思考一个问题:我们知道,工作寄存器就是内存单元的一部分,如果我们选择工作寄存器组0,则R0就是RAM的00H单元,那么这样一来,MOVA,00H和MOVA,R0不就没什么区别了吗?

的确,这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去,但是执行的过程不同,执行第一条指令需要2个机器周期,而第二条则只需要1个机器周期,第一条指令变成最终的目标码要两个字节(E5H00H),而第二条则只要一个字节(E8H)就可以了。2、指令的寻址方式

2.4寄存器间接寻址

RegisterIndirectAddressing

把地址放在另外一个寄存器中,根据这个寄存器中的数值决定该到哪个单元中取数据。R0,R1----8位地址,片内低128字节或片外,DPTR----16位,片外64KBMCS-51如: MOVA,@R0 MOVXA,@R0 MOVXA,@DPTR操作数在片内RAM中操作数在片外RAM中操作数在片外RAM中注意:只能用R0和R1,不能用其他通用寄存器SP堆栈指针也是寄存器间接寻址,PUSH和POP指令涉及的地址,即为SP中的地址。2、指令的寻址方式

以DPTR或PC为基址寄存器,累加器A为变址寄存器。把两者内容相加,结果作为操作数的地址。

常用于查表操作。

MCS-51MOVCA,@A+DPTR;(A+DPTR)→AMOVCA,@A+PC ;PC+1→PC,(A+PC)→A注意:这里的PC指的是当前指令的地址,计算地址的时候使用的是下一条指令的地址,即PC+1,而不是PC。2.5变址寻址(基址+变址)Base-Register-plus-Index-Register-IndirectAddressing操作数在程序存储器中2、指令的寻址方式

E0A程序存储区2040H9320E0H472041H………DPH20DPL00ALU如:MOVCA,@A+DPTR设DPTR=2000H,A=E0H20E0H47指令代码2、指令的寻址方式

E0A程序存储区ALU如:MOVCA,@A+PC设A=E0H2121H452040H832121H452041H……

…2120H47当前PC指令代码2、指令的寻址方式

2、指令的寻址方式

2.6相对寻址

将PC中的当前内容与指令第二字节给出的数相加,结果作为跳转指令的转移地址(转移目的地址)。PC中的当前内容称为基地址(本指令后的字节地址)指令第二字节给出的数据称为偏移量,1字节带符号数.

常用于跳转指令。如:JCLABE1

若C=0,不跳转;C=1,跳转.RelativeAddressing改变PC2、指令的寻址方式

程序存储区ALUJC语句的执行过程023H0000H400023H450001H21…

…0022H470002H3021H0002H指令代码当前PC2、指令的寻址方式

2、指令的寻址方式

对片内RAM的位寻址区和某些可位寻址的特殊功能寄存器进行位操作时的寻址方式。如:SETB3DH;将27H.5位置1 CLRC;Cy位清08086/8088CPU无此寻址方式2.7位寻址BitAddressing操作数在片内RAM位地址区或SFR某些位中2、指令的寻址方式

寻址方式寻址空间(操作数存放空间)立即寻址程序存储器直接寻址片内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字节地址)某些可位寻址的SFR目录Contents12345小结MCS-51指令概述指令的寻址方式数据传输类指令算术运算类指令3、数据传输类指令(29条)

MCS-51助记符:8086/8088助记符:________________________________________________________

MOV、MOVX、MOVCMOVXCH、XCHD、SWAPXCHGPUSH、POPPUSH、POP

源操作数寻址方式(5种):立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址。

目的操作数寻址方式(3种):直接寻址、寄存器寻址、寄存器间接寻址除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。3、数据传输类指令

3.1以累加器为目的操作数的指令(4条) MOVA,Rn;Rn→A MOVA,direct ;(direct)→A MOVA,@Ri ;(Ri)→A MOVA,#data ;data→A

将源操作数指定内容送到A中。3.2以寄存器Rn为目的操作数的指令(3条)MOVRn,A

MOVRn,direct

MOVRn,#data

这组指令功能是把源操作数指定的内容送入当前工作寄存器,源操作数不变。3、数据传输类指令

3.3以直接地址为目的操作数的指令(5条) MOVdirect,A MOVdirect,Rn MOVdirect1,direct2 MOVdirect,@Ri MOVdirect,#data

这组指令功能是把源操作数指定的内容送入由直接地址指出的片内存储单元。例: MOV20H,A MOV20H,R1 MOV20H,30H MOV20H,@R1 MOV0A0H,#34H MOVP2,#34H3、数据传输类指令

3.4以间接地址为目的操作数的指令(3条) MOV@Ri,A;A→(Ri)MOV@Ri,direct ;(direct)→(Ri) MOV@Ri,#data ;data→(Ri)

功能:把源操作数指定的内容送入以R0或R1为地址指针的片内存储单元中。例: MOV@R0,A MOV@R1,20H MOV@R0,#34H3、数据传输类指令

3.5十六位数的传递指令(1条) MOVDPTR,#data168051是一种8位机,这是唯一的一条16位立即数传递指令。功能:将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。例:MOVDPTR,#1234H执行完了之后DPH中的值为12H,DPL中的值为34H。如果我们分别向DPH,DPL送数,则结果也一样。如下面两条指令:MOVDPH,#35H MOVDPL,#12H。则就相当于执行了MOVDPTR,#3512H。3、数据传输类指令

3.6累加器A与片外RAM之间的数据传递类指令(4条)MOVXA,@Ri MOVX@Ri,A MOVXA,@DPTR MOVX@DPTR,A说明:

1.在51中,与外部存储器RAM打交道的只可以是A累加器。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再送到0200H单元中去。3、数据传输类指令

2.要读或写外部的RAM,当然也必须要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址,高8位地址由P2口来提供。(演示举例)??

3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。

MOVDPTR,#0100H MOVXA,@DPTR MOVDPTR,#0200H MOVX@DPTR,A3、数据传输类指令

3、数据传输类指令

3.7读程序存储器指令(2条)MOVCA,@A+DPTR;MOVCA,@A+PC

本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格说明:查找到的结果被放在A中,因此,本条指令执行前后,A中的值不一定相同。例:有一个数在R0中,要求用查表的方法确定它的平方值(此数的取值范围是0-5)

MOVDPTR,#100H MOVA,R0 MOVCA,@A+DPTR .… ORG0100H DB0,1,4,9,16,25如果R0中的值为2,则最终地址为100H+2为102H,到102H单元中找到的是4。3、数据传输类指令

3.8堆栈操作(2条)

PUSHdirect;SP

SP+1,(SP)(direct) POPdirect;(direct)(SP),SP

SP-1第一条为压入指令,就是将direct中的内容送入堆栈中,第二条为弹出指令,就是将堆栈中的内容送回到direct中。例: MOVSP,#5FH MOVA,#100 MOVB,#20 PUSHACC PUSHBPOPBPOPACC

则执行第一条PUSHACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元的值就是100,同样,执行PUSHB时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后,61H单元中的值变为20。3、数据传输类指令

3.9交换指令(5条) XCHA,Rn ;A←→Rn XCHA,direct ;A←→(direct) XCHA,@Ri ;A←→(Ri) XCHDA,@Ri ;A.3~A.0←→(Ri).3~(Ri).0 SWAPA ;A.3~A.0←→A.7~A.4例:已知A中的内容为34H MOVR6,#29H XCHA,R6 SWAPA XCHA,R6

;R6=29H;A=29H,R6=34H;A=92H;A=34H,R6=92H;3、数据传输类指令

(40H)=H50H=HA=H

(41H)=H51H=HR0=H

课堂练习1.设:内部RAM中,(40H)=50H,(41H)=60H,(50H)=30H,(51H)=70H,执行下列片段后:MOVR0,40HMOVA,@R0INCR0MOV@R0,Ab.MOVR0,#40HMOVA,@R0INC@R0MOVA,@R0;R0=50H;A=30H;R0=51H;(51H)=30H;R0=40H;A=50H;(40)=51H;A=51H目录Contents12345小结MCS-51指令概述指令的寻址方式数据传输类指令算术运算类指令4、算术运算类指令

主要对8位无符号数;也可用于带符号数运算。包括:加、减、乘、除、加1、减1运算指令,影响PSW有关位。4.1

加法指令 ADDA,#data ;A+data→A ADDA,direct ;A+(direct)→A ADDA,Rn ;A+Rn→A ADDA,@Ri ;A+(Ri)→A用途:将A中的值与源操作数所指内容相加,最终结果存在A中。1.不带进位位的加法指令(4条)4、算术运算类指令

例1:ADDA,#47H ADDA,34H ADDA,R7 ADDA,@R0例2:MOVA,#0AEH;-82D ADDA,#81H;-127D则执行完本条指令后,A中的值为2FH;C=1,AC=0,OV=1,P=1。对无符号数:结果为12FH;带符号数运算:OV=1,有错。实验验证一下本例10101110+10000001100101111 4、算术运算类指令

2.带进位位的加法指令(4条) ADDCA,Rn ;A+Rn+CY→A ADDCA,direct ;A+(direct)+CY→A ADDCA,@Ri ;A+(Ri)+CY→A ADDCA,#data ;A+data+CY→A用途:将A中的值和其后面的值以及进位位C中的值相加,最终结果存在A,常用于多字节数运算中。说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0~255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位(两字节)的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到0~65535。4、算术运算类指令

例:

先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是07H,而1则到了PSW中的CY位了。换言之,CY就相当于是100H。然后再做10H+30H+CY,结果是41H,所以最终的结果是4107H。1067H+30A0H0001000001100111001100001010000001000001000001111067H30A0H4107H4、算术运算类指令

设:1067H存在R1R0中,30A0H存在R3R2中,计算R1R0+R3R2,结果存在R5R4中。MOVA,R0ADDA,R2;R0+R2→A和CYMOVR4,AMOVA,R1ADDCA,R3;R1+R3+CY→A和CYMOVR5,A课堂思考题:如果要求设计一段程序完成任意两个无符号16位数的相加,上述方法是否完善?会不会出错?(需要考虑高位溢出)4、算术运算类指令

3.加1指令(5条)INCA ;A+1→A,影响P标志INCRn ;Rn+1→RnINCdirect ;(direct)+1→(direct)INC@Ri ;(Rn)+1→(Rn)INCDPTR ;DPTR+1→DPTR功能很简单,就是将后面目标中的值加1。例:A=12H,R0=33H,(21H)=32H,

(34H)=22H,DPTR=1234H。连续执行下面的指令:

INCAINCR0INC21HINC@R0INCDPTR;A=13H;R0=34H;(21H)=33H;(34H)=23H;DPTR=1235H4、算术运算类指令

DAA在进行BCD码加法运算时,跟在ADD和ADDC指令之后,用来对BCD码加法运算结果进行自动修正。例:A=00010101BCD(代表十进制数15)

ADDA,#84.十进制调整指令(1条);A=1DH,按二进制规律加;A=23H,按十进制规律加DAA4、算术运算类指令

4.2减法指令(8条)SUBBA,Rn ;A-Rn-CY→ASUBBA,direct;A-(direct)-CY→ASUBBA,@Ri ;A-(Ri)-CY→ASUBBA,#data ;A-data-CY→A将A中的值减去源操作数所指内容以及进位位C中的值,最终结果存在A中。如:SUBBA,R2设:A=C9H,R2=55H,CY=1,执行指令之后,A中的值为73H。1.带借位的减法指令(4条)4、算术运算类指令

说明:没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。对带符号数,要注意OV标志。OV=1,出错。2.减1指令(4条)DECA ;A-1→A,影响P标志DECRn ;Rn-1→RnDECdirect ;(direct)-1→(direct)DEC@Ri ;(Rn)-1→(Rn)

与加1指令类似。4、算术运算类指令

试编写程序实现1234H-0FA3H的减法操作,将结果高8位存入51H,低8位存入50H单元。MOVA,#34HSUBBA,#0A3HMOV50H,AMOVA,#12HSUBBA,#0FHMOV51H,A课后,上机用Keil运行本程序,并参看结果是否正确?CLRC4、算术运算类指令

4.3乘法指令(1条)MULAB ;A×B→BA此指令的功能是将A和B中的两个8位无符号数相乘,两数相乘结果一般比较大,因此最终结果用1个16位数来表达,其中高8位放在B中,低8位放在A中。在乘积大于FFH时,0V置1,否则OV为0;而CY总是0。例:A=4EH,B=5DH,执行指令MULAB后,乘积是1C56H,所以在B中放的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论