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

下载本文档

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

文档简介

第三章单片机指令系统3.1指令系统简介3.2寻址方式

3.3数据传送指令3.5逻辑运算类指令3.6控制转移指令

3.4算术运算类指令3.7位操作指令3.1指令系统的简介MCS-51共有111条指令,指令的长度和执行时间因不同的指令而各不相同。3.1.1指令格式3.1.2指令的三种表示形式3.1.3指令的字节数3.1.4指令的分类继续3.1.1指令格式指令格式:既指令的结构形式。OPDATA或ADDRESS操作码操作数或操作数地址举例:MOVA,#0FFHADDA,R0(1)二进制的表示形式:(以“累加器的内容+08H”为例)00100100B操作码OP(加法)00001000B操作数DATA(08H)3.1.2指令的三种表示形式(2)十六进制表示方式:它是对二进制形式的一种简化。00100100B24H00001000B08H(3)指令的“助记符”方式(“汇编格式”):

00100100B24H00001000B08HADDA,#08H

1)是一种由英文单词或字母、数字来表征指令功能形式。2)“汇编”格式的指令必须把它“翻译”为二进制形式“机器码”后才能为CPU所识别。3)三种不同的表示方法适用于不同的场合。

二进制表示形式十六进制表示汇编格式3.1.3指令的字节数#7

分为单字节、双字节和三字节。一、单字节指令(49条):

无操作数:如INCDPTR;10100011B INCA;00000100B【特点】:操作数隐含在操作码中。

含有操作数寄存器名称的单字节指令:

如:MOVA,R011101000B

MOVA,R1

11101001B

【特点】:寄存器名以三位数代码的形式在指令的后三位。二、双字节指令(46条):

指令的操作码和操作数各占一个字节。如:

MOVA,#data;01110100Bdata程序存储器01110100datan+1MOVA,#data双字节指令在程序存储器的存放示意图

三、三字节指令(16条)

(1)指令中的操作数为双字节。如:MOVDPTR,#data16;(2)指令中分别包含1个字节的操作数和1个字节的操作数地址。如:

MOVdirect,#data

举例:MOV20H,#0FFH

10010000data15-8data8-0

MOVdirect,#dataOP(75H)direct(20H)data(FFH)MOVDPTR,#data16三字节指令在存储器中存放的方式示意图指令的字节数与指令的运行时间指令的字节多是否意味着指令周期就长?指令字节数周期数指令说明MOVA,R011R0内容送累加器AMOVA,#0FFH21立即数FFH送AMOV20H,#30H32立即数30H送内存20h单元MULAB14乘法指令INCDPTR1116位寄存器DPTR加一从表中可见,指令的字节数与指令周期不是对等的关系3.1.4指令的分类(41页)

(1)数据传送类指令:完成数据在单片机内部之间的传送。分为8位数和16位两种。

(2)算术运算指令:用于操作数之间的加、减、乘除运算。【特点】:多数情况下:操作数之一在累加器A中,结果也保留在A中,运算结果要影响PSW(进位标志、奇偶和溢出标志等)。

(3)逻辑操作和循环移位指令:操作数之间的逻辑加、逻辑与、取反和异或等操作。多数情况下一个操作数在A中,结果也存于A。(4)控制转移类指令:条件转移、无条件转移,调用和返回。

【特点】:通过修改程序指针PC的内容,使CPU转到另一处执行,从而改变程序的流向。(5)位操作指令:

位传送、位置位、位运算和位控制转移等操作。

【特点】:按位操作而不是按字节的操作。位控转移的判断不是检测某一个字节而是对某一个位进行检测并决定是否进行程序转移。

3.2寻址方式在指令的操作数位置上,用于表征、寻找操作数的方式定义为“寻址方式”。在MCS-51单片机中,共使用了七种寻址方式。分别是:(1)立即数寻址(5)变址寻址;(2)直接寻址(6)相对寻址;(3)寄存器寻址(7)位寻址。(4)寄存器间接寻址继续3.2.1立即寻址指令本身直接含有所需要的8位或16位的操作数。将此数称为“立即数”(使用#标明)。如:

MOVA,#5FH;将(8位)立即数送累加器A

MOVDPTR,#2000H;16位立即数送DPTR寄存器5FH74Hnn+1ROM累加器A00H20H90HROMDPTR3.2.2直接寻址指令直接给出了操作数的地址。如:

MOVA,3AH;将RAM3AH单元内容送累加器直接寻址的指令长度是两个或三个字节。3AHOP程序ROMnn+1操作数x数据RAM3AH累加器A直接寻址示意图3.2.3寄存器寻址当所需要的操作数在内部某一个寄存器Rn中时,将此寄存器名Rn直接写在指令的操作数的位置上。如:MOVA,R0 MOV20H,R0INCR1ADDA,R3

注意:寄存器寻址方式的指令大多是单字节指令。指令本身并不带有操数,而是含有存放操作数的寄存器的3位代码。以MOVA,Rn为例,使用R7寄存器,所以rrr=111,既指令的机器码为:0EFH11101rrr返回3.2.4寄存器间接寻址指令中含有保存操作数地址的寄存器Ri。MOVA,@Ri如:MOVR0,#3AH;立即数送R0寄存器MOVA,@R0;从RAM的H单元取数送累加器A11100000ROM3AHxRAM3AHR000H累加器A1233.2.5变址寻址指令使用DPTR或PC中的内容作为基地址,再与累加器A的内容相加,和作为操作数地址。如:

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

MOVXA,@A+DPTR;DPTR内容与A的内容相加得操作数地址并将此操作数送A变址指令适用于对ROM存储器得访问,查表。【举例】:已知ROM中0302H单元有一个数x,现要把它送到累加器A中,试编程。MOVDPTR,#0300H;立即数送DPTRMOVA,#02H;立即数送累加器A

MOVCA,@A+DPTR;从ROM的0302单元取数送A变址寻址示意图02H0300HROM

XALU0302H累加器ADPTR0300H+02H0302HMOVCA,@A+DPTR3.2.6相对寻址相对转移指令在执行中是将PC值与指令中的8位偏移量进行相加,形成指令要转移的目标地址。

SJMPrel由指令中有一个8位偏移量rel为带符号位的补码,所以控制程序转移的范围为+127~-128。例如:SJMP54H;(80H、54H)54H2002HALU累加器APC2002H+54H2056H

54H80H程序存储器ROM2056H操作码偏移量2000H2002H(LOOP1)PC2000H3.2.7位寻址在位寻址指令(位操作指令)中使用的位地址。单片机在控制、检测的应用中,系统的输入、输出数据有很多属于开关量信号。这些开关量信号以bit---“位”的形式进行各种运算、处理和存储的。MCS-51单片机控制、检测系统驱动器电动机外设1外设2状态信号状态信号控制信号

【举例】:SETB20H;将位地址为20H的位置1SETB90H;将P1口的d0位置1第二例中,完全可以使用下面的指令格式:

SETBP1.0;将P1口的d0位置1类似还有:

MOVC,ACC.7;将累加器中的d7位送PSW的cy

3.3数据传送指令3.3.0传送指令的特点3.3.1内部数据传送类指令3.3.2外部数据传送类指令3.3.3堆栈操作指令3.3.4数据交换指令功能是将数据在累加器、片内的RAM、SFR及片外ROM、RAM之间进行传送。必须指定被传送数据的源地址和目标地址。在传送过程中,源地址的内容不被改变。传送类指令除了以累加器A为目标的传送对PSW的P有影响外,其余的传送类指令对PWS一概无影响。操作码数据的目标地址数据的源地址【举例】:MOVA,R0;将R0寄存器中的数据送累加器A中(注意寻址方式)指令通式:MOV<dest>,<src>3.3.0传送指令的特点3.3.1内部数据传送类指令(1)以累加器为目的操作数的指令(2)以寄存器Rn为目的操作数的指令(4)以寄存器间接地址为目的字节传送指令(3)以直接地址为目的操作数的指令(5)16位数据传送指令(1)以累加器为目的操作数的指令(4条)

MOVA,Rn;Rn→A MOVA,direct;(direct)→A MOVA,@Ri ;(Ri)→A

MOVA,#data;data→A

(2)以寄存器Rn为目的操作数的指令(3条)MOVRn,AMOVRn,directMOVRn,#data

(3)以寄存器间接地址为目的字节传送指令(3条)

MOV@Ri,A;A→(Ri)

MOV@Ri,direct;(direct)→(Ri)

MOV@Ri,#data ;data→(Ri)

例:MOV@R0,A MOV@R1,20H MOV@R0,#34H(4)以直接地址为目的操作数的指令(5条)

MOVdirect,A

MOVdirect,Rn MOVdirect1,direct2 MOVdirect,@Ri MOVdirect,#data

这组指令功能是把源操作数指定的内容送入由直接地址指出的片内存储单元。例:MOV20H,A MOV20H,R1 MOV20H,30H MOV20H,@R1 MOVA0H,#34H MOVP2,#34H(5)16位数据传送指令(1条)MCS-51指令系统唯一的16位数据传送指令。

MOVDPTR,#data16DPTR是单片机内部SFR中的两个寄存器DPH、DPL组合而成。其中DPH为高八位,DPL为低八位。DPTR是一个专门用于访问外部存储器的间址寄存器。寻址能力为64K(0~65535)。(6)内部数据传送类指令的使用①在使用传送指令时,可以根据实际情况选用恰当寻址方式。但不能根据主观意愿去“创造”指令。例如:要将R0中数据传送到R1中。如何使用指令去完成上面操作?

MOVR1,R0是否可以?只能使用:

1,MOVA,R0或:2,MOV01H,00H

MOVR1,AMCS-51内部数据传送类指令方式图累加器Adirect直接寻址@Ri间址Rn寄存器Data立即数返回上一次②以累加器A为目的寄存器的传送指令会影响PSW中的奇偶位P,而其余的指令对PSW均无影响。③要会正确地估计指令的字节。

【举例】:

MOVA,@RI()个字节MOVA,DIRECT()个字节MOVDIRECT,DATA()个字节MOVDIRECT2,DIRECT1()个字节④在学习指令系统和编程时开始就要养成一个好的、合理的编程习惯。⑤注意给程序进行正确的注释,这对于阅读、编写和修改程序都是非常重要的。下面就是一些注释的例子:MOVA,30H;(30h)→AMOVA,R0;R0→AMOV40H,30H;(30h)→40hMOVA,@Ri;(Ri)→A(7)内部传送类指令举例试编出把30h和40h单元内容进行交换。

MOVA,30H

;(30h)→A

MOV30H,40H

;(40h)→30h

MOV40H,A

;A→40h累加器AXRAM30H40HY1233.3.2外部RAM数据传送类指令MOVXA,@RiMOVX@Ri,AMOVXA,@DPTRMOVX@DPTR,A外部RAM的字节传送指令举例已知外部RAM的2040H单元有一个数x,试编程将x送外部RAM的2560H单元。【解】:外部RAM中的数据是不能直接传送的,因此必须使用两次MOVX指令完成此操作。 ORG2000H MOVDPTR,#2040H;为16位指针赋值MOVXA,@DPTR;取x到累加器A MOVDPTR,#2560H;为16位指针赋值 MOVX@DPTR,A

;x送RAM2560h单元 SJMP$;停机 END3.3.3数据交换指令格式:XCHA,Rn;A↔RnXCHA,direct;A↔(direct) XCHA,@Ri;A↔(Ri)

XCHDA,@Ri;A3~0↔((Ri))3~0

SWAPA数据交换指令举例(一)举例:已知片外RAM20H单元、内部RAM20H单元分别有数X和Y,试编程互将两数相交换。MOVR1,#20H;指针赋初值MOVXA,@R1;X→AXCHA,20H;交换A↔(20H),Y→AMOVX@R1,A;Y→(20H)片外RAM片内RAMy

(x)片外RAMx

(y)(y)

x20h20h累加器A123数据交换指令举例(二)已知:RAM的50H单元有一个0~9的数,试编程将它变成相应的ASCII码。

【解】:0~9的ASCII码是30H~39H,两者相差30H。 MOVR0,#50H;指针赋值 MOVA,#30H;30H→A XCHDA,@R0;A3~0↔(R0)3~0, MOV@R0,A;A中的ASCII送回50H单元0000010150H00110000(A)=30H0011010100110101思考:另一种方法实现本题,试编程实现?123.3.4查表指令(2条)

MOVCA,@A+DPTR;A←(A+DPTR)MOVCA,@A+PC;PC←PC+1,

A←(A+PC)该指令也称为“查表”指令。在ROM中建立一个数据表,可以使用DPTR、PC作为数据表格的基地址。

举例

已知累加器A中存有0~9范围内的数,试用查表指令编写出查找出该数平方的程序。(1)采用DPTR作基址寄存器:MOV A,40HMOV DPTR,#LABMOVC A,@A+DPTR……LAB:DB0,1,8,27,64……若(40H)为2,查表得8并存于A中

(2)采用PC作基址寄存器:ROM01491625364964812000H2009h2008h2007h2006h2005h2004h2003h2002h2001H

ORG1FFBH1FFBH74DATA

ADDA,#DATA

;(DATA=02H)?1FFDH83H

MOVCA,@A+PC;(PC=1FFEH)?1FFEH80FEH

SJMP$2000H00H

DB0;平方表首址2001H01H

DB12002H04H

DB42003H09H

DB92004H10H

DB162005H19H

DB25

:::2009H51H

DB81

ENDDATA为MOVC指令首地址与表头地址之间的单元数。思考:如果在查表指令的后面增加:NOPNOP此时,DATA的值如何?3.3.5堆栈操作指令堆栈:一个用来保存程序断点、数据的特殊的存储区域。在MCS-51单片机中,栈区是占用片内RAM的存储空间,具体栈位置由指针SP来确定。

1.进栈操作:PUSHdirect

;(SP)+1→SP,(direct)→SP2.出栈操作:POPdirect

;(SP)→direct,(SP)-1→SP【注意】:①寻址方式为直接寻址或者寄存器寻址,但PUSHA是错误的,应当是PUSHACC或PUSH0E0H,同理:PUSHR0也错误。②进栈是堆栈向上“生长”的过程,即SP+1;出栈则相反。③系统上电时,(SP)

=07H。SP的值可以根据需要进行修改,以适应具体编程的需要。在确定栈区位置时要考虑对数据区的影响,以避免数据区与栈区冲突。堆栈操作指令举例例2:设片内RAM的30H单元存有x,40H单元存有y。试将两个单元内容互换。

PUSH30H PUSH40H

POP30H POP40H栈底xy

yxxyRAMSP=07h40H30H继续3.4算术运算#10

功能:完成算术运算三大功能。特点:大多指令都要由累加器A来存放一个源操作数,并把操作结果放回累加器A中。3.4.1:算术运算指令1,加法指令:带进位的加法指令(ADC)不带进位的加法指令(ADD)

加1指令(INC)十进制调整指令(DAA)2,减法指令:带进位的减法指令(SUBB)减1指令(DEC)3,乘法指令:(MUL)4,除法指令:(MUL)1.加法指令(1)不带进位的加法指令格式: ADDA,Rn ;A+Rn→A ADDA,direct;A+(direct)→A ADDA,@Ri;A+(Ri)→A ADDA,#data;A+data→A【注意】:结果影响PSW。根据编程者的需要,8位数据可以是无符号数(0~255),也可以是有符号数(-128~+127)。不论编程者使用的数据是有符号数还是无符号数,CPU都将它们视为有符号数(补码)进行运算并影响PSW。不带进位的加法指令举例试分析执行下列指令后累加器A和PSW中各标志的变化。 MOVA,#19H ADDA,#66H

25A=00011001+102data=01100110B127001111111B

Cy=0;AC=0;OV=CP∀CS=0;P=1(2)带进位的加法指令格式:ADDCA,Rn ;A+Rn+Cy→A ADDCA,direct ;A+(direct)+Cy→A ADDCA,@Ri ;A+(Ri)+Cy→A ADDCA,#data ;A+data+Cy→A

【注意】:这里的Cy是指令执行前的Cy;对PSW的影响同ADD指令。(3)加1指令(增量指令)格式: INCA;累加器A加一 INCRn;Rn+1→Rn INCdirect;内存单元数据加一 INC@Ri;内存单元数据加一 INCDPTR;dptr+1→dptr【注意】:

(1),除了第一条对PSW的P有影响外,其余对PSW均无影响。

(2),INC主要用于修改数据指针控制、循环语句中使用。编程举例已知M1、M2单元中存有两个16位无符号数X1、X2(低位在前)。试写出X1+X2,并将结果放入M1、M1+1单元(低8位在M1单元)。设两数之和不会超过16位(65535)。【 解】:MOVR0,#M1;x1指针赋初值MOVR1,#M2;x2指针赋初值

MOVA,@R0

;取x1低8位送A

ADDA,@R1

;x1与x2低8位相加MOV@R0,a;低8位和送m1单元INCR0 INCR1 ;修改指针MOVA,@R0;取x1的高8位送A

ADDCA,@R1

;x1与x2的高8位和Cy相加MOV@R0,A;结果送M1+1单元X1data0~7X1data8~15X2data0~7X2data8~15RAMM1M1+1M2M2+1(4)十进制调整指令在CPU进行BCD码运算时,必须在运算后进行十进制调整,(CPU在加法运算时是按二进制加法)。举例:试写出完成85+59的BCD码的加法程序。

MOVA,#85H ADDA,#59H

85A=10000101B+59dtat=01011001B

正确的结果所得结果是(DEH)请比较两个结果?为什么?

格式:DAA

;若AC=1或A3~0>9,则A+06h→A;若Cy=1或A7~4>9,则A+60h→A

【注意】:1,DAA指令必须紧跟在加法指令之后;2,DAA指令只适用于加法指令的调整。十进制调整指令应用举例

举例:试写出完成85+59的BCD码的加法程序。

MOVA,#85H ADDA,#59H

DAA

85A=10000101B+59data=01011001B1441101111

0B低4位〉9,所以加06h

+00000110B

11100100B高4位〉9,所以加60h

01100000B

101000100B结果为144h3.4.2减法指令(带进位的减法指令)格式:SUBBA,Rn ;A–Rn–Cy→A SUBBA,direct;A–(direct)–Cy→A SUBBA,@Ri ;A–(Ri)–Cy→A SUBBA,#data;A–data–Cy→A使用减法指令要注意的几个问题在单片机内部,减法指令实际上是采用补码的加法实现的。无论相减两数是无符号数还是有符号数,减法操作总是按有符号数来处理、影响PSW中相关的标志。在MCS-51的指令系统中没有不带Cy的减法,所以在使用SUBB指令前必须使用一条清除Cy的指令:CLRC。减一指令格式: DECA;累加器A减1 DECRn;Rn-1→Rn DECdirect;内存单元数据减1 DEC@Ri;内存单元数据减1【注意】:

除了第一条对PSW的P有影响外,其余对PSW均无影响。

主要用于修改数据指针在控制、循环语句中使用)。3.4.3乘法指令格式: MUL

AB;

低八位放A,高八位存于B中

【注意】:

若乘积大于(0FFH)则OV=1,否则,OV=0;

该指令执行完后,CY=0;3.4.4除法指令格式: DIV

AB;

商存于A,余数存于B中

【注意】:

若除数B=0,则OV=1,否则,OV=0;

该指令执行完后,CY=0;3.5逻辑运算指令#11

1,逻辑与运算指令(ANL) 2,逻辑或运算指令(ORL) 3,逻辑异或指令(XRL) 4,累加器清零和取反指令(CLR&CPL)

5,移位指令1.逻辑与运算指令可以分为两类:1,以累加器A为目标寄存器的逻辑运算指令;2,以内存单元为目标的逻辑运算指令。格式ANLA,Rn;A∧Rn→AANLA,direct;A∧(direct)→A ANLA,@Ri ;A∧(Ri)→A ANLA,#data ;A∧data→A ANLdirect,A ;(direct)∧A→direct ANLdirect,#data

;(direct)∧data→direct应用举例已知R0=30H和(30H)=0AAH,试问执行下列指令后累加器A和30H单元中内容是什么? 1.MOVA,#0FFH2.MOVA,#0F ANLA,R0 ANLA,30H

(A)=30H,(A)=0AH,(30H)=0AAH(30H)=0AAH很明显:ANL操作可以从某个存储单元中取出某几位,而把其它的为屏蔽掉(清零)。2.逻辑或运算指令格式:ORLA,Rn;A∨Rn→AORLA,direct;A∨(direct)→A ORLA,@Ri ;A∨(RI)→AORLA,#data;A∨data→A ORLdirect,A;(direct)∨A→direct ORLdirect,#data

;(direct)∨data→direct应用举例设累加器A=0AAH,P1口=0FFH。试编程将累加器A中的第四位送P1口低四位,而P1口高四位不变。解:MOVR0,A;累加器A中的数据暂存 ANLA,#0FH ;屏蔽A的高4位 ANLP1,#0F0H;屏蔽P1口的低4位 ORLP1,A;在P1口组装 MOVA,R0;恢复累加器A的数据【小结】:与运算可以“屏蔽”某些位;

或运算可以“置位”某些位。3.逻辑异或运算指令格式:XRLA,Rn ;A⊕Rn→AXRLA,direct ;A⊕(direct)→A XRLA,@Ri ;A⊕(RI)→A XRLA,#data ;A⊕data→A XRLdirect,A ;(direct)⊕A→direct XRLdirect,#data

;(direct)⊕data→direct特点:按位运算,相同时为0,不同时为1。使用异或可以实现将某个字节的数据或将数据的某几位变反。举例已知:外部RAM30H单元中有一个数AAH,现要将其高4位不变,低4位取反,试编程。解:

MOVDPTR,#0030H10101010

MOVXA,@DPTR⊕00001111 XRLA,#0FH10100101

MOVX@DPTR,A4.累加器清零和取反指令格式: CLRA;累加器清零 CPLA;累加器取反

举例:已知30H单元中有数x,写出对它求补的程序。 MOVA,30H CPLA INCA MOV30H,A逻辑运算指令应用举例设X、Y和Z分别存在X、Y和Z单元。试编出能实现此电路功能的程序,并将结果送入F单元。解:MOVA,X

ANLA,Y ;X∧Y→A MOVR1,A;送R1暂存 MOVA,Y XRLA,Z ;Y∨Z→A CPLA ;A取反 ORLA,R1;(X∧Y) MOVF,A ;A→F⊕+XYZF∨(Y∨Z)→A5移位指令#12

格式:

RLA RRA RLCA RRCA

SWAPAA7←A0A7→A0A7←A0CyCyA7→A0

A3A0

A7A4A6←A0A70000000100000010举例(一)已知:在M1和M1+1单元有一个16位数(M1存低8位),试编程将其扩大2倍(设结果小于65535)。解:扩大2倍可以用左移一位来实现。

dataH=00101100

01011001dataL=11001111

10011110M1M1+1110011110001011001110011110001011001程序清单

ORG1000HCLRC ;清除Cy位 MOVR1,#M1 ;指针赋值 MOVA,@R1 ;取低8位数据 RLCA ;循环左移,Cy进低位,高位进Cy MOV@R1,A ;移位后数据回送 INCR1 ;指针加一 MOVA,@R1 ;取高8位数据 RLCA ;循环左移Cy进低位 MOV@R1,A ;数据回送END3.6控制转移指令

3.6.1,无条件转移指令 3.6.2,条件转移指令 3.6.3,子程序调用和返回 3.6.4,空操作指令

3.6.1无条件转移指令1.短转移指令(绝对转移指令)AJMPaddr11;绝对转移,寻址范围2K;指令中的11位地址,确定了地址的转移范围在2K以内,所以AJMP也称“页内转移”指令。101

0000110100101

XXXX

X10110100101A10a9a8

操作码a7~a0AJMP指令PC程序计数器a10~800001a7~a0MCS-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~07FFH8页010004000H~47FFH1页000010800H~0FFFH9页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存储空间的页面示意图00000111

11111110PC值00001000

00000000PC+2值AJMP指令中的11位地址::::AAA:MOVA,R0MOVR1,A::AJMPAAA原本AJMP指令要转到本页的0100H单元但是由于PC的高5位页面地址发生了变化使AJMP指令实际转到下一页0900H单元。00001001

00000000

最后PC值0100H07FEH发生跨页错误为什么?AJMP转一指令是用来做页内2K范围的转移,如果使用不当,会发生错误的“跨页”操作。产生跨页的原因是AJMP指令处于每一页的最后两个单元的结果,所以避免这种现象的方法就是不要在每一页的最后两个单元使用AJMP指令。如果目标地址与AJMP地址不再同一页内,建议使用LJMP指令替代AJMP。使用AJMP指令时,11位的绝对地址可以用符号地址取代正确使用AJMP转移指令2.相对转移指令SJMPrel;寻址范围256B;转移范围(+127~-128);80Hrel3.长转移指令格式:LJMPaddr16;长转移指令,寻址范围65535;用法:

指令执行时,将指令码中的addr16送入PC中,使程序无条件的转向addr16所指向地址执行程序。

【举例】:

已知某单片机的监控程序地址为A080H,试问用什么方法使单片机开机后自动的转向该监控程序?

【解】:因为单片机上电时,PC=0000H,所以在0000H单元存放一条LJMP0A080H的指令即可。ROM4.散转指令(变址转移)格式:JMP@A+DPTR单字节操作码为73H特点:转移地址由累加器A的内容与DPTR相加形成。用途:用来制作一个多分支的转移结构。【举例】:ORG2000HMOVDPTR,#TABLE;指针赋表头地址

RLA JMPA,@A+DPTR;

TABLE: AJMPROUT0 ;多分支转移表 AJMPROUT1 AJMPROUT2: :思考:如果该指令换成LJMP指令A应如何处理?3.6.2,条件转移指令#13

(1)累加器A判零转移指令(双字节指令) JZrel ;若A=0,则PC=PC+2+rel

;若A≠0,则PC=PC+2JNZrel ;若A≠0,则PC=PC+2+rel

;若A=0,则PC=PC+2(2)比较不相等条件转移指令(3字节) (A)=data时:PC+3→PC,Cy=0 CJNEA,#data,rel(A)>data时:PC+3+rel,Cy=0 CJNERn,#data,rel(A)<data时:PC+3+rel,Cy=1 CJNEA,direct,rel CJNE@Ri,#data,rel

【注意】:1,4条指令都是3字节指令,所以执行时PC+3→PC。2,指令的执行实际上就是做不回送的减法,通过Cy反映无符号数的两数的大小:Cy=0则X>Y时; 若Cy=1则X<Y。(3)减1条件转移指令1,DJNZRn,rel;Rn-1→Rn,若Rn≠0则PC+2+rel→PC若Rn=0则PC+2→PC2,DJNZdirect,rel;(direct)-1→direct,若(direct)≠0则PC+3+rel→PC若(direct)=0则PC+3→PC注意:第一条指令为双字节,第二条指令为三字节。指令本身先做一个带回送的减一运算操作,根据运算的结果是否为零作为转移的条件应用举例令片内RAM中DATA为起始地址的数据块中连续10个无符号数相加,并把和送到SUN单元(设其和小于256)。 ORG1000HSTART:MOVR2,#0AH ;数据块长度10送计数器R2 MOVR0,#DATA ;数据块起始地址送指针R0 CLRA ;累加器清零LOOP:ADDA,@R0 ;累加部分和 INCR0

DJNZR2,LOOP;若R2-1≠0则转LOOP继续

MOVSUN,A

;存累加和 SJMP$ ;停机 END3.6.3,调用和返回指令(一)子程序调用指令:

1,短调用指令ACALLaddr11 2,长调用指令LCALLaddr16

(二)返回指令: (一)调用指令1,短调用指令ACALLaddr11

PC+2→PC

SP+1→SP,PC7~0→(SP) SP+1→SP,PC15~8→(SP) addr11→PC10~0

2,长调用指令LCALLaddr16

PC+3→PC

SP+1→SP,PC7~0→(SP) SP+1→SP,PC15~8→(SP) addr16→PC(二)返回指令格式:RET操作: (SP)

→PC15~8,SP-1→SP

(SP)→PC7~0,SP-1→SP格式:RETI操作: (SP)→PC15~8,SP-1→SP

(SP)→PC7~0,SP-1→SP

3.6.4,空操作指令格式:NOP功能:仅使程序计数器PC加一,消耗12个时钟周期,所以时常用作延时。3.7位操作指令#14

特点:操作数不是字节,而是某一位。每位的取值只能是“0”或“1”,因而也称之为布尔变量操作。布尔变量存在于片内RAM的位寻址区(20H~2FH)、11个可以按位寻址的SFR。3.7.1,位传送指令格式:MOVC

温馨提示

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

评论

0/150

提交评论