第三章单片机指令系统_第1页
第三章单片机指令系统_第2页
第三章单片机指令系统_第3页
第三章单片机指令系统_第4页
第三章单片机指令系统_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

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

文档简介

单片机指令系统第三章单片机指令系统调用子程序及返回指令分类指令寻址方式指令分类MCS-51指令系统的分类,格式及一般说明3-1指令格式

例:LOOP:MOVA,#40H;取参数[标号]:操作码操作数1,操作数2[;注释]标号指令的符号地址。操作码指明指令功能操作数指令操作对象。包括数据、地址、寄存器名及约定符号注释说明指令在程序中的作用操作码和操作数是指令主体。MOV__move传送XCH__exchange交换ANL__andlogic与逻辑运算XRL__exclusiveor异或运算MUL__Multiply乘法RR__rotateright右循环SJMP__shortjump短跳转RET__return子程序返回二.机器语言指令格式111010000111111000110010011101010100000001100100举例:汇编语言:

机器语言:MOVA,R0 E8HMOVR6,#32H 7EH32HMOV40H,#64H 75H40H64H指令中操作码和操作数是指令主体,称为指令可执行部分,附录指令表中可查出对应指令代码。

分为单字节、双字节和三字节指令

操作码[操作数1][操作数2]三.指令描述符号介绍Rn—当前工作寄存器区中的8个寄存器R.0~R7(n=0~7)。Ri—当前工作寄存器区中的2个工作寄存器R0,R1(i=0,1)direct——8位的内部数据存储器单元中的地址。#data——包含在指令中的8位常数。#data16——包含在指令中的16位常数。

addr16——16位目的地址。

addr11——11位目的地址。

rel——8位带符号的偏移字节,简称偏移量。

DPTR——数据指针,可用作16位地址寄存器。

bit——内部RAM或专用寄存器中的直接寻址位。在介绍指令之前,先把描述指令的一些符号的意义作些介绍。A——累加器。

B——专用寄存器,用于乘法和除法指令中。

C——进位标志或进位位,或布尔处理机中的累加器。@——间址寄存器或基址寄存器的前缀,如@Ri、@DPTR。/——位操作数的前缀,表示对该位操作数取反,如/bit。×——×单元中的内容。(×)——由×寻址的单元中的内容。

——箭头左边的内容被箭头右边的内容所代替。3-2指令寻址方式3-2-1 寻址方式和操作数类型

一、寻址方式

是指指令中确定操作数的形式。为了区别指令中操作数不同的存储空间,对不同存储器中数据进行操作采用不完全相同的寻址方式二、操作数类型位(b)─位寻址区中的一位二进制数据字节(B)─8位二进制数据字(W)─16位双字节数据寻址方式:12736

45立即寻址直接寻址位寻址寄存器寻址相对寻址寄存器间接寻址变址寻址寻址方式一.立即寻址方式指令中给出实际操作数据(立即数)。指令本身直接含有所需要的8位或16位的操作数。将此数称为“立即数”(使用#标明)。如:

MOVA,#30H;将(8位)立即数送累加器AMOVDPTR,#2000H;16位立即数送DPTR寄存器【注意】:MOVA,#30HMOVA,30H两者的区别。

立即数寻址的指令长度为2或3个字节。74H30Hnn+1ROM累加器AMOVA,#30H

指令执行流程90H20H00HROMDPTRMOVDPTR,#2000H指令的存储和执行返回一、立即寻址目的地#XXH操作数MOVP1,#55HMOVA,#01H#55H目的地信寄存器寻址直接寻址立即数寻址寄存器间接寻址变址寻址相对寻址位寻址二.直接寻址方式

指令中直接给出操作数地址的寻址方式,能直接寻址的存储空间为内部RAM和特殊功能寄存器(SFR)。

例2:MOVPSW,#20H;PSW¬#20H

PSW为直接寻址寄存器的符号地址。

例1:MOVA,30H;A¬(30H)65H

31H

7FH30H

65HA思考题:直接寻址方式指令和立即寻址方式指令的形式有什么不同?目的地寄存器寻址直接寻址立即数寻址寄存器间接寻址变址寻址相对寻址位寻址内部RAM或SFR区操作数XXHMOVP1,20H20H目的地20H注:寻址是寻操作数的“地址”!直接给出地址

20H——直接寻址使用直接寻址应注意的三个问题:

指令助记符中direct是用16进制数表示的操作数地址。

当地址恰好在SFR区域时,指令也可以用寄存器名来表示。如:

MOVA,80H

可以写成MOVA,P0

后者用SFR中寄存器的名字取代它的物理地址80H。很明显,后者更容易阅读和交流,所以我们提倡使用SFR中寄存器名称来代替直接地址。如:MOVA,SBUF

;串口数据缓冲器数据送A

MOVIE,#00H

;初始化中断允许寄存器

MOVTH1,#0FEH

;为定时器1赋初值

尽管使用SFR的寄存器名称来取代直接地址,可以带来程序的可读性,但是在汇编时,仍要将寄存器名字转换为直接地址。

当直接寻址时在工作寄存器区中时,可以使用两种寻址方式来访问。如:

MOVA,00H

;将RAM中00H单元数据送累加器A

MOVA,R0

;将工作寄存器R0的内容送累加器A

这里使用了不同的寻址方式,其指令的结构也不相同。前者是:11100101(E5H)、00000000(00H)

双字节。后者的机器码是:11101000(E8H)

单字节;

在物理结构上,R0与RAM的00H单元恰好是同一单元,所以不同的指令而执行结果是一样的。

类似的还有累加器A:

INCA

寄存器寻址方式(单字节);

INCACC

直接寻址方式(双字节);

INCE0H

直接寻址方式(双字节)。

一.立即寻址方式

在指令系统中:字节地址与位地址是完全不同的概念。前者用direct表示,而后者用bit表示,但在指令中都是用16进制表示的数。如:

MOVA,20H

;将RAM的20H单元内容送A

MOVC,20H

;将位寻址区中的位地址为20H位内容送PSW中的Cy中。片内RAM(20H-2FH)中的位寻址区结构图7F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A393837262524232221202F2E2D2C2B2A292827262524232221201F1E1D1C1B1A191817161514131211100F0E0D0C0B0A090807060504030201002FH20H字节地址24H位地址以通用寄存器的内容为操作数的寻址方式。

通用寄存器指A,B,DPTR,R0-R7

例:

MOVA,R0

;AR0

设指令执行前A=20H,R0=40H,

执行指令后,A=?,R0=?40H40H01000000A00100000R001000000三.寄存器寻址方式目的地寄存器寻址直接寻址立即数寻址寄存器间接寻址变址寻址相对寻址位寻址寄存器目的地操作数XXHMOVP1,A寄存器R0-R7A

B

DPTR你能说出为什么叫寄存器寻址吗?

以寄存器中内容为地址,以该地址中内容为操作数的寻址方式。存放地址的寄存器称为间址寄存器或数据指针,包括R0,R1,DPTR,SP等。例: MOVA,@R0 ;A(R0)设指令执行前A=20H,R0=40H,地址为40H存储器单元内容如图。执行指令后,A=?,R0=?,(40H)=?

41H 67H

40H30H30H40H30HR040H四.寄存器间接寻址方式寄存器寻址直接寻址立即数寻址寄存器间接寻址变址寻址相对寻址位寻址MOVP1,@R0目的地寄存器操作数3AH内部RAM3AH65H3AHR0R1

DPTR寄存器间接寻址寄存器目的地2号信在2号箱子里1号你能说出1号箱子和2号箱子分别对应内存中哪一部分吗?一.立即寻址方式使用寄存器间址指令时应注意的三个问题:

间址寄存器Ri只能使用R0、R1寄存器(i=0、1)。

间址方式不仅用于片内RAM,同样也适用于片外RAM。对于片内RAM使用Ri寄存器,寻址范围为00H~FFH。

对于片外RAM,可以使用Ri,也可以使用DPTR做间址寄存器,两者区别在于后者寻址范围为0000H~FFFFH。

间址方式的指令不能访问SFR中的单元。如下面的程序是错误的:

MOVR1,#80HMOVA,@R1

(因为80H为SFR的物理地址)五.变址寻址方式指令使用DPTR或PC中的内容作为基地址,再与累加器A的内容相加,其和作为操作数地址。如:

MOVCA,@A+PC

;PC内容与A的内容相加得操作数地址并将此操作数送A

MOVCA,@A+DPTR;DPTR内容与A的内容相加得操作数地址并将此操作数送A使用变址指令时,要事先分别为A、DPTR赋值,以便获得操作数得地址。变址指令只适用于对ROM存储器得访问,如查表等。一.立即寻址方式

【举例】:已知ROM中0302H单元有一个数01H,现要把它送到累加器A中,试编程。

MOVDPTR,#0300H

;立即数送DPTR

MOVA,#02H

;立即数送累加器A

MOVCA,@A+DPTR

;从ROM的00302单元取数送A五.变址寻址方式ROM

0102H0300HALU0302H累加器ADPTR0300H+02H0302H变址寻址示意图:寄存器寻址直接寻址立即数寻址寄存器间接寻址变址寻址相对寻址位寻址MOVCA,@A+DPTR目的地基址寄存器0012H变址寄存器34HROM0046H65HADPTRPC0046H对位地址中的内容作位操作的寻址方式。它其实是一种直接寻址方式。例:MOVC,40H ;Cy(位地址40H)设指令执行前Cy=1,位地址40H存储器单元如上图,执行指令后,Cy=?0六.位寻址方式28H0110001029H11010111位寻址区47H-40H位地址号4FH-48H寄存器寻址直接寻址立即数寻址寄存器间接寻址变址寻址相对寻址位寻址20H······27H21H28H21H20H100000000想一想:如果想使27H单元的第3位置1,该怎么办呢?七、相对寻址

以当前程序计数器PC的内容为基础,加指令给出的一偏移量形成新的PC值的寻址方式。

例如:SJMP54H

;(80H、54H)

54H2002H程序存储器ROM80H54H

ALU2056H累加器APC2002H+54H2056H操作码偏移量2000H2002H(LOOP1)目的地寄存器寻址直接寻址立即数寻址寄存器间接寻址变址寻址相对寻址XXH位寻址操作数SJMP54HPC+54HPC2002H······2002H=2056HPC2056H相对寻址使用中应注意的问题:与绝对寻址相比,相对寻址具有很好的“浮动性”,因此是编程人员普遍使用的一种寻址方式。使用时,要注意3点:CPU进行地址计算时,PC取值是执行本指令后的地址值。以上面的例子说明:指令本身的首地址是2000H,执行完后变为2002H(既下一条指令的首地址)。如果使用三字节的相对转移指令,则PC=PC+3。偏移量的计算:

rel=目标地址-源地址-2(2字节指令)或:rel=目标地址-源地址-3(3字节指令)

结果用补码的形式书写。为了减少计算偏移量的计算,汇编程序允许使用“符号地址”的方式代替偏移量。如:

SJMPloop1

汇编程序在翻译时,自动计算并将结果替换符号地址。如果转移地址的范围超过相对寻址的范围(如:-127~+128)时,就要采用别的方式法,否则在编译时,提示出错。寻址比较MOVP1,R0③地址是寄存器R0MOVP1,@R0②地址在寄存器R0里MOVP1,20H④地址是内存20HMOVP1,#20H①直接将20H这个数送P1口错!错!错!MOVP1,R0对!寻址比较MOVP1,R0③地址是寄存器R0MOVP1,@R0②地址在寄存器R0里面MOVP1,20H④地址是内存20HMOVP1,#20H①直接将20H这个数送P1口错!错!错!MOVP1,@R0对!寻址比较MOVP1,R0③地址是寄存器R0MOVP1,@R0②地址在寄存器R0里面MOVP1,20HMOVP1,#20H①直接将20H这个数送P1口错!错!错!MOVP1,20H对!④地址是内存20H寻址比较MOVP1,R0③地址是寄存器R0MOVP1,@R0②地址在寄存器R0里MOVP1,20H④地址是内存20HMOVP1,#20H①直接将20H这个数送P1口错!错!错!MOVP1,#20H对!总结:寻址方式

寻址范围直接寻址只能寻址片内RAM(00H~FFH)寄存器寻址只能寻址A,B,DPTR,R0~R7寄存器间接寻址只能寻址内部RAM和片外RAM,不可寻址SFR变址寻址只能寻址ROM(MOVC)相对寻址只能寻址ROM3-3 MCS-51指令分类指令按功能可分为如下几类:12345数据传送指令算术运算类指令逻辑运算指令程序转移指令子程序调用及返回6位操作指令一.立即寻址方式3.3传送指令的特点数据传送是编程中使用最多、最主要的操作。它的功能是将数据在累加器、片内的RAM、SFR及片外ROM、RAM之间进行传送。在传送类指令中,必须指定被传送数据的源地址和目标地址。在传送过程中,源地址的内容不被改变。传送类指令除了以累加器A为目标的传送对PSW的P有影响外,其余的传送类指令对PWS一概无影响。操作码数据的目标地址数据的源地址【举例】:MOVA,R0;将R0寄存器中的数据送累加器A中(注意寻址方式)指令通式:MOV

<dest>,<src>3-3-1数据传送指令12345内部传送指令外部传送指令交换指令堆栈指令查表指令数据传送指令实现寄存器、存储器之间的数据传送一.立即寻址方式一、内部传送指令:实现片内数据存储器中数据传送。

指令格式:

MOV目的操作数,源操作数

指令通式:MOV<dest>,<src>

寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器

间接寻址MOVA,Rn;A←Rn

MOVA,direct;A←(direct)

MOVA,@Ri;A←(Ri)

MOVA,#data

;A←data指令机器码:

E8~EFE5

directE6、E774data

(1)

以A为目的操作数:

一.立即寻址方式例1:顺序执行下列指令序列,求每一步执行结果。MOVA,#30H MOV40H,A MOVR0,#20H MOV@R0,40H MOV30H,20H;A=30H;(40H)=30H;R0=20H;(20H)=30H;(30H)=30H(1)以A为目的操作数:

一.立即寻址方式(2)

以Rn为目的操作数:MOVRn,A;Rn←A

MOVRn,direct;Rn←(direct)

MOVRn,#data;Rn←data指令机器码:

F8~FFA8~AFdirect78~7Fdata例2:以知A=2BH,R1=16H,(40H)=50H,执行下面各指令MOVR1,AMOVR2,40H MOVR3,#33H

;R1=2BH;R2=50H;R3=33H一.立即寻址方式

(3)

以直接地址为目的操作数:

MOVdir,A;(dir)←AMOVdir,Rn;(dir)←RnMOVdir1,dir2;(dir1)←(dir2)MOVdir,#data;(dir)←dataMOVdir,@Ri;(dir)←(Ri)指令机器码:

F5dir88~8Fdir85dir2dir175dirdata86~87dir例3:以知A=30H,(30)=40H,(40H)=5EH,执行下面各指令MOV20H,AMOV30H,40H MOVR0,AMOV40H,@R0

;(20H)A,将A中数据取出送入20H单元;(30H)(40H),将40H单元中数据取出送入30H;R0A,将A中数据取出送入R0;(40H)(R0),将R0间接寻址的单元中数据送入40H单元一.立即寻址方式(4)

以间接地址为目的操作数:

MOV@Ri,A;(Ri)←AMOV@Ri,dir;(Ri)←dirMOV@Ri,#data;(Ri)←data

例4:设(30H)=6FH,R1=40H,

MOV@R1,30H

;30H单元中数据取出送入R1

间接寻址的40H单元,

(40H)=6FH

MOVDPTR,#data16

;DPTR←data16(5)

以DPTR为目的操作数:说明:

4.只有指令表中的指令才有对应指令代码,计算机才能执行。编程时,不能随意创造发明指令。1.一条指令中不能同时出现两个工作寄存器:

非法指令: MOVR1,R2

MOVR2,@R02.间址寄存器只能使用R0、R1。

非法指令:MOVA,@R23.SFR区只能直接寻址,不能用寄存器间接寻址。

非法指令:MOVR0,#80H

MOVA,@R0;间接

MOVA,80H(√)一.立即寻址方式二、

外部传送指令:实现片外数据存储器或程序存储器和累加器A之间的数据传送。

指令格式:MOVX

目的操作数,源操作数寻址方式:片外数据存储器用寄存器间址方式。1.DPTR作16位数据指针,寻址64KB片外RAM空间

MOVXA,@DPTR ;A←(DPTR)

MOVX@DPTR,A ;(DPTR)←A

2.Ri作8位数据指针,寻址256B片外RAM空间

MOVX A,@Ri

;A←(P2Ri)

MOVX @Ri,A

;(P2Ri)←A指令机器码E2~E3HF2~F3HE0HF0H(1)片外RAM数据传送指令一.立即寻址方式

MOVDPTR,#2000H MOVXA,@DPTR MOVDPTR,#2100H MOVX@DPTR,A

;DPTR=2000H ;A=X ;DPTR=2100H ;(2100H)=X片外数据存储器不能直接寻址。下列为非法指令:

MOVXA,2000H(×)MOVX2100H,2000H(×)例3:将片外数据存储器数据从2000H传送到2100H。思考题:为什么对DPTR的数据传送使用内部传送指令?习题:将片外RAM0000H单元的数据传送到片内RAM地址为60H的单元。一.立即寻址方式2,外部ROM的字节传送指令指令格式:MOVC

目的操作数,源操作数寻址方式:变址寻址方式。例如:MOVCA,@A+DPTR;A←(A+DPTR)MOVCA,@A+PC;PC←PC+1,A←(A+PC)

该指令也称为“查表”指令。在ROM中建立一个数据表,可以使用DPTR、PC作为数据表格的基地址。在第一条指令中:用DPTR作为基地址。使用前,先将数据表的首地址送入DPTR中,累加器A作为偏移量。由两者数据相加得到待查的表中数据地址并取出。第二条指令是以程序计数器PC为基地址。由于PC的内容与该指令在ROM中的位置有关,所以一旦该指令在程序中的位置确定,其PC的值也就确定。外部ROM的字节传送指令举例:已知累加器A中存有0~9范围内的数,试用查表指令编写出查找出该数平方的程序。1,采用DPTR作基址寄存器:设平方表的首地址为2000h,累加器A中的内容恰好是查表的偏移量。首先将表的起始地址2000h送入DPTR中。

MOVDPTR,#2000H

;指针赋值

MOVCA,@A+DPTR

;平方值送AROM01491625364964812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h2,采用PC作基址寄存器:与DPTR不同,使用PC作为基地址时,必须对累加器A的数据进行修正,以保证@A+PC恰好找到待查的平方值地址。

ORG1FFBH1FFBH74dataADDA,#data

;data=02h1FFDH83H

MOVCA,@A+PC

;PC=1FFE1FFEH80FEH

SJMP$2000H

00H

DB0

;平房表首址2001H01H

DB12002H04H

DB42003H09H

DB92004H10H

DB162005H19H

DB25:::2009H51H

DB81

ENDdata为MOVC指令首地址与表头地址之间的单元数。74hdata83h80hFEh01491625364964812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h1FFFh1FFEh1FFDh1FFCh1FFBh返回例:查表法求Y=X2。设X(0≤X≤15)在片内RAM的20H单元中,要求将查表求Y,存入片内RAM的21H单元。解法1:以DPTR为基地址寄存器ORG1000H

SQU: MOVDPTR,#TAB

;确定表首地址(基地址)

MOVA,20H

;取X(偏移量

MOVCA,@A+DPTR

;查表求Y=X2

MOV21H,A

;保存Y

RET

;子程序结束 … ;其它程序段

ORG2000H

;常数表格首地址TAB: DB00,01,04,09,…,225

;平方表解法2:以PC为基地址寄存器指令地址

源程序

ORG1000H

;程序起始地址 1000H SQU: MOVA,20H

;取X 1002H ADDA,#03H

;修正偏移量 1004H MOVCA,@A+PC

;查表求Y=X2 1005H MOV21H,A

;存结果 1007H RET

;子程序结束 1008H TAB: DB00,01,04

;平方表 100BH DB09,…,225

思考题:当0≤X≤255时,如何用查表法编程求Y=X2。例4:设A=29H,(2AH)=38H,执行指令XCHA,2AH后,A=? (2AH)=?三、

交换指令:

实现片内RAM区的数据双向传送。1.字节交换指令

XCHA,Rn

;A«Rn

XCHA,@Ri

;A«(Ri)

XCHA,direct

;A«(direct)习题:将片内RAM60H单元与61H单元的数据交换。XCH60H,61H←对吗?38H29H指令机器码:C8~CFHC6~C7HC5dir 为提供一种方便的累加器和寄存器或RAM之间的数据交换。避免了使用一般MOV传送指令完成交换时的不便。2.半字节交换指令

XCHDA,@Ri;A0~3«(Ri)0~3

SWAPA;A4~7«A0~3习题:交换片内RAM40H单元和41H单元的低半字节。指令机器码:D6~D7HC4

例如:已知A=45H,R1=30H,(30H)=67H,

XCHD A,@R1

SWAPA A=

,(30H)=

,

一.立即寻址方式四、堆栈操作指令堆栈操作是一种特殊的数据传送指令。堆栈:一个用来保存程序断点、数据的特殊的存储区域。在MCS-51单片机中,栈区是占用片内RAM的存储空间,具体栈位置由指针SP来确定(系统上电或复位时,SP=07h)。

1,进栈操作:pushdirect

;sp+1→sp,(direct)→(sp)2,出栈操作:popdirect

;(sp)→(direct),sp-1→spPUSH是进栈(或称为压入操作)指令。在数据入栈之前,SP指针自动加1,然后将直接寻址单元中的数据压入到SP指针所指的单元POP是出栈(或称为弹出操作)指令。执行该指令,将SP指针所指示单元数据弹出到直接寻址单元中,然后将SP的内容减1。一.立即寻址方式四、堆栈操作指令【注意】:①寻址方式为直接寻址,所以pushr0也是错误的。②进栈是堆栈向上“生长”的过程,即sp+1;出栈则相反。“先进后出,后进先出”。③系统上电时,sp=07h。SP的值可以根据需要进行修改,以适应具体编程的需要。在确定栈区位置时要考虑对数据区的影响,以避免数据区与栈区冲突。

×

×

×

×

SP→ ×

×

×

×SP→

×

×例:设

A=02H,B=56H,执行下列指令后,SP=?,A=?,B=?ASBR:MOVSP,#30H;设栈底

PUSHA PUSHB MOVA,#00H MOVB,#01H … POP B POPA B02H56H←PC←PC

×

×SP→

×

02H

×02H←PC56H←PC00H←PC01H←PC56H←PC02H1.MOVA,#1000H ;A←1000H2.MOVXA,1000H ;A←(1000H)片外RAM3.MOVCA,1000H ;A←(1000H)片外ROM4.MOVX60H,A ;片外RAM(60H)←A5.MOVR0,60H ;片内RAM:(61H)←(60H)

MOV61H,@R06.

XCHR1,R2 ;R1←→R27.

MOVXDPTR,#2000H;DPTR←2000H8.

MOVX60H,@DPTR ;片内RAM←片外RAM习题:找出指令错误并改正:一.立即寻址方式3-3-2 算术运算指令MCS-51的程序状态字寄存器PSW为标志寄存器。其格式如下:其中标志位(自动设置状态)为CY、AC、OV和P。用户选择位(编程设置状态)有RS0、RS1和F0。该类指令共24条。主要是进行无符号数的四则运算。与数据传送指令不同,多数算术运算指令会影响标志位的状态,即CPU执行算术运算指令后,根据数据操作情况自动设置标志位的状态。功能:完成算术运算、逻辑运算和循环移位三大功能。特点:大多指令都要由累加器A来存放一个源操作数,并把操作结果放回累加器A中。 1)不带进位加法:指令格式:

ADD

A,源操作数(影响Cy、OV、AC、P)

ADDA,Rn;A←A+Rn

ADDA,direct;A←A+(direct)ADDA,@Ri;A←A+(Ri)

ADDA,#data;A←A+#data

例1:A=3BH,PSW=0,执行指令ADDA,#3BH求:A=,Cy=,OV=,AC=,P=, PSW=?

一.加、减指令

1.加法指令

00111011

+00111011

0111011076H

0

0

1

101000001=41H

解:OV=Cy7ÅCy6=0,无进位Cy=0,产生辅助进位AC=1,A中数据的个数为奇数,P=1。一.立即寻址方式

10011010

11100011

+

0

1

01111101

2)带进位加法:

指令格式:

ADDCA,源操作数(影响Cy、OV、AC、P)

ADDCA,Rn;A←A+Rn+C

ADDCA,direct;A←A+(direct)+C

ADDCA,@Ri;A←A+(Ri)+C

ADDCA,#data;A←A+#data+C

其中:C来自PSW状态寄存器中的进借位C。例2:A=9AH,R2=E3H,PSW=0,执行指令

ADDCA,R2

后求:A=,Cy=,OV=,AC=,P=, PSW=?

7DH

1

1

0

010000100=84H带进位加法指令ADDC用于多字节运算例:设双字节数X存在片内RAM41H、40H单元,Y存在42H、43H单元,编程求Z=X+Y,并存入片内RAM单元44H、45H、46H。ADDS:MOVA,40H ADDA,42H MOV44H,A MOVA,41H ADDCA,43H MOV45H,A MOVA,#0 ADDCA,#0 MOV46H,A RET;取被加数低字节;加上加数低字节;保存和的低字节;取被加数高字节;加上加数高字节;保存和的高字节;求高字节进位;子程序结束一.立即寻址方式例:A=5AH,R2=5AH,Cy=0,执行下列指令

SUBBA,R2求: A=,Cy=,OV=,P=,AC=?2.带借位减法指令

指令格式:SUBBA,源操作数(影响Cy、OV、AC、P)

SUBBA,Rn

;A←A-Rn-C

SUBBA,direct

;A←A-(direct)-C

SUBBA,@Ri

;A←A-(Ri)-C

SUBBA,#data

;A←A-#data–C000000

习题:编程求双字节减法。设X、Y存在片内RAM60H起始单元,计算

Z=X-Y。一.立即寻址方式

3.增量、减量指令指令格式:

INC

单操作数;加1指令

INCA

;A←A+1

INCRn

;Rn←Rn+1

INCdirect

;(direct)←(direct)+1

INC@Ri

;(Ri)←(Ri)+1

INCDPTR

;DPTR←DPTR+1指令格式:

DEC

单操作数

;减1指令

DECA

;A←A-1

DECRn

;Rn←Rn-1

DECdirect

;(direct)←(direct)-1

DEC@Ri

;(Ri)←(Ri)-1

注意:没有指令

DECDPTR

可用指令

DECDPL

代替一.立即寻址方式二、乘除指令指令格式:MULAB ;BA←A×B,Cy←0, ;当积高字节B=0,OV←0;B≠0,则OV←1

例:A=60H(96),B=C0H(192),执行指令MULAB

后,

求:A=,B=,Cy=,OV=,P=?

解:

96×192=18432(4800H)00H

48H

0

1

0指令格式:DIVAB;A÷B,A←商,B←余Cy←0,

;当除数B=0,OV←1;B≠0,则OV←0一.立即寻址方式例:A=60H(96),B=C0H(192),执行指令MULAB

后,

求:A=,B=,Cy=,OV=,P=?

解:

96×192=18432(4800H)00H

48H

0

1

0例:A=F6H(156),B=0DH(13),执行指令DIVAB

后求:A=,B=,Cy=,OV=,P=? 解:

156÷13=12(0CH),余数=0(00H)。12H

0CH

0

0

0思考题:如何实现多字节数据的乘除运算。十进制加法指令:

ADDA,源操作数

DAA带进位十进制加法指令:

ADDCA,源操作数

DAA

作业:BCD码加法编程。 设X、Y为4位压缩BCD码,求Z=X+Y。三、BCD调整指令:

DA A

;对A中加法结果进行调整,且必须跟;在ADD或ADDC指令之后。1)“与”操作指令

ANLA,Rn;A←A∧Rn

ANLA

,direct

;A←A∧(direct)

ANLA,@Ri;A←A∧(Ri)

ANLA,#data;A←A∧#data

ANLdirect,A;(direct)←(direct)∧A

ANLdirect,#data;(direct)←(direct)∧#data3-3-3 逻辑运算与循环类指令

逻辑运算指令共有24条。主要用于对8位数进行逻辑“与”、“或”、“异或”、取反、清零以及循环移位。2)“或”操作指令

ORLA,Rn;A←A∨Rn

ORLA,direct

;A←A∨(direct)

ORLA,@Ri;A←A∨(Ri)

ORLA,#data;A←A∨#data

ORLdirect,A;(direct)←(direct)∨A

ORLdirect,#data;(direct)←(direct)∨#data3-3-3 逻辑运算与循环类指令5)8位循环指令

RLA;A循环左移一位

RRA;A循环右移一位3)“异或”操作指令

XRLA,Rn;A←ARn

XRLA,direct;A←A(direct)

XRLA,@Ri;A←A(Ri)

XRLA,#data;A←A#data

XRLdirect,A;(direct)←(direct)A

XRLdirect,#data;(direct)←(direct)#data4)求反与清除指令

CPLA;A←A

CLRA;A←0A7←A0A7→A06)9位循环指令

RLCA;带Cy循环左移一位

RRCA;带Cy循环右移一位

例2:A=23H,执行指令

CPLA

后,A=? 解:

23H取反为DCH。

例1:A=23H,(20H)=40H,执行指令

ANLA,20H后

A=? 解:23H∧40H=00H

例3:A=20H,执行指令

RLA

后,A=? 解:

A中的各位向左移1位后,A=40H。00HDCH40HA7→A0A7←A0CyCy例4:设

A=11000101,Cy=0,分别执行下列单条指令:

CPLA

求:A=,Cy=

RLA RLCA

10001010

1例5:编程将寄存器R6R5中的双字节数X左移一位。CLR CMOV A,R5RLC AMOV R5,AMOV A,R6RLC AMOV R6,A0CyR6R5Cy;Cy=0,设R6=55H,R5=AAH;R6=01010101,R5=10101010,Cy=0;R6=01010101,R5=01010100,Cy=1;R6=10101011,R5=01010100,Cy=0思考题:如何将寄存器R2中的数据奇数位取反,偶数位不变?

转移指令通过改写PC的当前值,从而改变CPU执行程序的顺序,使程序发生跳转。按转移条件分类:1)无条件转移:

执行无条件转移指令,程序无条件转移到指定处。2)条件转移:

指令中给出转移条件,执行指令时,先测试条件,若满足条件,则程序发生转移,否则仍顺序执行程序。按转移方式分类:1)绝对转移:指令给出转移目的的绝对地址

nn,执行指令后,PC¬nn。2)相对转移:指令给出转移目的与转移指令的相对偏移量e,执行指令后,PC¬PC+e。3-3-4转移指令1、无条件转移指令:

格式:

LJMPaddr16

长转移指令,寻址范围65535;

AJMPaddr11

绝对转移,寻址范围2K;

SJMPrel

短转移,转移范围(+127~-128);

JMP@A+DPTR

变址转移,寻址范围65535。02Haddr15~8addr7~0a10~8

00001a7

~a080Hrel73HLJMP指令(三字节)AJMP指令(双字节)SJMP指令(双字节)JMP指令(单字节)(1)长转移指令:(三字节双周期指令)指令执行时,将指令码中的addr16送入PC中,使程序无条件的转向addr16所指向的新地址执行程序。【举例】:已知某单片机的监控程序地址为A080H,试问用什么方法使单片机开机后自动的转向该监控程序?【解】:

因为单片机上电时,PC=0000H,所以在0000H单元存放一条LJMP0A080H

的指令即可。LJMPA0H80HROM0000H0001H0002H0003H(2)绝对转移指令:双字节、双周期指令。将AJMP指令中的11位转移地址替换掉原来PC中16位地址中的低11位地址。指令中的11位地址,确定了地址的转移范围在2K以内,所以AJMP也称“页内转移”指令。101

0000110100101

XXXX

X

10110100101A10a9a8操作码a7~a0AJMP指令PC程序计数器MCS-15的ROM系统是以2K为一页来划分程序存储器,这样对于4K的片内ROM存储器可以分为2页;片外64K的ROM可以分为32页。在执行AJMP指令时,PC的高5位决定了ROM中的页地址;而AJMP

指令的低11位地址用来选择页内地址。在一般情况下,AJMP指令应当与目标地址在同一页内。更具体的说:目标地址应当与AJMP指令取出后的PC值(PC=PC+2)在同一页内。否则转移将会出现错误。ROM的64K存储空间的页面(部分)划分表页面PC高5位页内地址页面PC高5位页内地址0页000000000H~07FFH

8页010004000H~47FFH1页000010800H~0FFFH

9页010014800H~4FFFH2页000101000H~17FFH10页010105000H~57FFH3页000111800H~1FFFH11页010115800H~5FFFH4页001002000H~27FFH12页011006000H~67FFH5页001012800H~2FFFH13页011016800H~6FFFH6页001103000H~37FFH14页011107000H~77FFH7页001113800H~3FFFH15页011117800H~7FFFHROM的64K存储空间的页面示意图

::::AAA:MOVA,R0MOVR1,A::AJMPAAA0100H07FEH00000111

11111110PC值0000100000000000PC+2值00001001

00000000AJMP指令中的11位地址原本AJMP指令要转到本页的0100H

单元但是由于PC的高5位页面地址发生了变化使AJMP指令实际转到下一页0900H单元。最后PC值发生跨页错误AJMP转一指令是用来做页内2K范围的转移,如果使用不当,会发生错误的“跨页”操作。产生跨页的原因是AJMP指令处于每一页的最后两个单元的结果,所以避免这种现象的方法就是不要在每一页的最后两个单元使用AJMP指令。如果目标地址与AJMP地址不再同一页内,建议使用LJMP指令替代AJMP。使用AJMP指令时,11位的绝对地址可以用符号地址取代正确使用AJMP转移指令(3)短转移SJMP指令格式:SJMPrel

rel

为偏移量(+127~-128)rel(偏移量)的计算公式:

rel=目标地址–源地址–2

(其中:2为SJMP指令的长度)【例1】:如图,要转到0116H时:

rel=0116H-0110H-2=04H【例2】:要转到0109H时:

rel=0109H-0110H-2=F7H(-9)实际编程时,使用符号地址取代rel以简化计算,在汇编时由汇编程序来计算rel。SJMPrelPCPC+20109H0110H0116H(5)变址转移指令格式:JMP@A+DPTR

单字节操作码为73H特点:转移地址由累加器A的内容与DPTR相加形成,转移范围64KB。用途:用来制作一个多分支的转移结构。【举例】: MOVDPTR,#TABLE;指针赋表头地址

JMPA,@A+DPTR

;转移地址由A+DPTR产生

TABLE:

AJMPROUT0

;多分支转移表

AJMPROUT1

AJMPROUT1

AJMPROUT2

: :返回

2.条件转移指令1.判零转移指令

JZrel;若A=00H,PC←PC+2+rel(转移), ;若A≠00H,PC不转移,顺序执行

JNZrel

;若A≠00H,PCPC←PC+2+rel(转移) ;若A=00H,PC不转移,顺序执行

条件转移指令形成程序的分支,赋予计算机判断决策能力。

转移条件:1)标志位的状态2)位地址中的状态

2.判Cy转移指令

JCrel

;Cy=1则转移(PC←PC+2+rel),

;Cy=0不转移

JNCrel

;Cy=0则转移(PC←PC+2+rel),;Cy=1不转移3.判位转移指令

JBbit,rel

;(b)=1转移(PC←PC+3+rel),;否则不转移

JNBbit,rel

;(b)=0转移(PC←PC+3+rel),;否则不转移JBCbit,rel

;(b)=1转移(PC←PC+2+rel),;且(bit)←0;;否则不转移4.比较不相等转移指令:

CJNEA,direct,rel;若A≠(direct),则转移

;(PC←PC+3+rel),

;否则程序顺序执行

CJNEA,#data,rel

;若A≠#data,则转移

;(PC←PC+3+rel),

;否则程序顺序执行

CJNE@Ri,#data,rel;若(Ri)≠#data,则转移

;(PC←PC+3+rel),

温馨提示

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

评论

0/150

提交评论