微型计算机原理及其应用 第11章 湖南大学出版社_第1页
微型计算机原理及其应用 第11章 湖南大学出版社_第2页
微型计算机原理及其应用 第11章 湖南大学出版社_第3页
微型计算机原理及其应用 第11章 湖南大学出版社_第4页
微型计算机原理及其应用 第11章 湖南大学出版社_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

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

文档简介

第十一章

单片机指令系统本章内容寻址方式指令的分类、格式及符号说明各类指令的说明

掌握MCS-51指令系统的各种寻址方式掌握每条指令的格式、功能及用法掌握指令的操作过程中操作数的变化情况以及对标志位的影响学会正确选用指令完成简单的程序设计学习目的

MCS-51指令系统共有111条指令,共255种操作代码,11.1MCS-51指令系统简介按功能划分可分为五类:数据传送指令(29条)

算术运算指令(24条)逻辑运算及转移指令(24条)控制转移指令(17条)位操作指令(17条)单字节指令(49条)双字节指令(45条)三字节指令(17条)

按指令字节数划分可分为三种:单机器周期指令(64条)双机器周期指令(45条)四机器周期指令(2条)按指令的执行时间划分可分为三种:

指令的表示方法称为指令格式。表达形式为:11.1.1

指令格式标号又称为指令地址符号,一般由1-8个字符组成,是以字母开头的字母数字串。[标号]:操作码[操作数];[注释]

操作码

用MCS-51单片机所规定的助记符来表示,用来规定指令进行什么操作。

注释是对指令作用或功能的说明,是方便阅读而添加的解释说明性文字,用分号“;”开头。

操作数指出了指令的操作对象,它可以是一个具体的数据,也可以是指出到哪里取得数据的地址或符号。在一条指令中可能没有操作数,也可能有多个操作数。Rn:当前选中的工作寄存器区的8个工作寄存器R0~R7中的一个(n=0~7)Ri:可用于寄存器间接寻址的工作寄存器

R0、R1(i

=

0,1)Direct:8位直接地址。可以是内部RAM的低128个单元地址;或是特殊功能存器地址。11.1.2

指令中常用符号说明#data:8位立即数。#data16:16位立即数。rel:8位补码数的地址偏移量。bit:位地址,表示片内RAM或特殊功能寄存器中的直接寻址位。addr11:11位目的地址。addr16:16位目的地址。@:间接寻址寄存器前缀。$:

当前指令的地址。X:

由X指定的地址单元或寄存器中的内容(X):以X指定的地址单元或寄存器中的内容作为 地址的存储单元的内容。→:

将箭头左边的内容送到箭头右边的单元中。/:

位操作数的前缀,表示对该位操作数取反。

MCS-51指令系统共有七种寻址方式:

立即寻址直接寻址寄存器寻址寄存器间接寻址相对寻址变址寻址位寻址11.2寻址方式1.

直接寻址指令中直接给出了操作数所在的存储单元地址,只限于访问片内数据存储器:(1)片内RAM低128个字节单元,(2)特殊功能寄存器,在指令中既可用特殊功能寄存器的单元地址形式给出,也可以用特殊功能寄存器的符号名称来表示。

功能:

将片内RAM56H单元中的内容34H送到累加器A中。例:MOVA,56H;A(56H)机器码:E55634H片内RAM

34H累加器A56H

图11.1指令传递

操作数在指令中直接给出,该操作数称为立即数。 操作数字前加“#”符号为前缀,以区别直接地址。使用时一定要注意!

2.

立即寻址

特点功能:

(1)将片内RAM中44H单元的内容送累加器A, 属于直接寻址;

(2)则是把44H这个数本身送到累加器A,属于立即寻址。

(1)MOVA,44H;(44H)→A (2)MOVA,#44H;44H→A例3.寄存器寻址以寄存器的内容为操作数的寻址方式。可进行寄存器寻址的寄存器有:R0~R7、A、B、DPTR和CY。

4.寄存器间接寻址

指令指定寄存器中的内容为操作数的地址。

工作寄存器R0、R1和专用寄存器DPTR可用于寄存器间接寻址,

在寄存器前加“@”符号作前缀。若:R0=65H,(65H)=26H如图11.2所示,执行(1)结果A=65H,执行(2)结果A=26H。26H片内RAMA

65H

图11.2

R065H①②例:(1)MOVA,R0;A←R0(2)MOVA,@R0;A←(R0)注意:@是寄存器间接寻址区别寄存器寻址的标志。5.变址寻址以DPTR或PC(基址寄存器)与累加器A(变址寄存器)的内容之和为地址,读取数据。

(1)MOVCA,@A+PC;(A+PC)→A(2)MOVCA,@A+DPTR;(A+DPTR)→A

执行第一条时先使当前PC值加1,然后把这个加1后的PC值和累加器A中的偏移量相加,作为操作数地址,从该地址中取出操作数送入A中。6.相对寻址

相对寻址只在相对转移指令中使用。相对寻址是将程序计数器PC中的当前值与指令第二字节所给的偏移量rel相加,其和作为跳转指令的转移地址。

20008026SJMPrel;PC←PC+2+rel程序存储器A图11.3指令执行过程

PC

26H0000H2000H2001H

80H

26H

xx

xx

2028H02H20HALU2002H┆例┆┆┆

7.

位寻址

当把八位二进制数中某一位作为操作数看待时,这个操作数的地址就称为位地址,对位地址寻址简称位寻址。

位寻址方式的寻址范围为:(1)片内RAM的位寻址区。(2)特殊功能寄存器中的可寻址位。MOV30H,C

;30H是位寻址位地址MOVA,30H

;30H是直接寻址的字节地址MOVC,ACC.7

;Cy←ACC.7

由上面指令可知,位寻址的位地址与直接寻址的字节地址形式完全一样,主要由操作码来区分,使用时需应该特别注意。例如11.3指令系统2)算术运算指令4)控制转移类指令3)逻辑运算及移位指令1)数据传送指令5)位操作指令

这类指令的源操作数和目的操作数地址都在单片机内部。指令助记符为“MOV”。11.3.1数据传送指令1、内部数据传送指令

MOVA,#data ;data→A

MOVA,direct ;(direct)→A

MOVA,Rn

;Rn→A

MOVA,@Ri ;(Ri)→A(1)以累加器A为目的操作数的数据传送指令(2)以寄存器Rn为目的寄存器的数据传送指令MOVRn,#data ;data→RnMOVRn,direct;(direct)→RnMOVRn,A ;Rn→AMOVdirect,A

;A

→(direct)MOVdirect,Rn

;Rn

→(direct)MOVdirect,@Ri

;(Ri)

→(direct)MOVdirect,#data

;#data

→(direct)MOVdirect1,direct2

;(direct2)

→(direct1)(3)以直接地址为目的地的数据传送指令(4)以寄存器间接地址为目的地的数据传送指令MOV@Ri,A ;A→(Ri)MOV@Ri,#data;#data→(Ri)MOV@Ri,direct;(direct)→(Ri)(5)以DPTR为目的寄存器的数据传送指令只有唯一的一条16位数传送指令:MOVDPTR,#data16;data16→DPTR已知:R1=20H、(21H)=54H、(22H)=55H、(30H)=56H,试问执行如下指令后,结果A、40H、R2、20H、和P2口中的内容各是什么?

MOVA,21HMOV40H,AMOVR2,22HMOV@R1,21HMOVP2,30H例结果为:A=54H,(40H)=54H,R2=55H,(20H)=54H,P2=56H已知:R1=30H、R2=31H、(56H)=23H,试问执行以下指令后,结果各是什么? MOVA,R1 MOVR2,A MOV56H,R1例结果为:A=30H,R2=30H,(56H)=30H注意:

不允许MOVR2,R1已知:(30H)=12H、(31H)=13H、R0=30H、R1=31H,试问执行以下指令后A、30H、31H和32H各是什么?

MOVA,@R0MOV@R1,AMOV@R0,#34HMOV32H,@R1例执行后,A=12H,(30H)=34H,(31H)=12H, (32H)=12H2、外部数据存储器传送指令该类指令共4条,指令助记符为“MOVX”:

MOVXA,@Ri;(Ri)→A MOVX@Ri,A;A→(Ri) MOVXA,@DPTR;(DPTR)→A MOVX@DPTR,A;A→(DPTR)例11.1

编程实现:将片外数据存储器2000H单元内容送入片外数据存储器20H单元中。解:外部数据存储器之间的数据不能直接传送,必须经过累加器A。程序如下:MOVDPTR,#2000H

;2000H→DPTRMOVXA,@DPTR

;(2000H)→AMOVR1,#20H

;20H→R1MOVX@R1,A

;(2000H)→(20H)该类指令共两条:MOVCA,@A+DPTR;(A+DPTR)→AMOVCA,@A+PC;PC+1→PC,(A+PC)→A3、程序存储器查表指令

已知程序存储器2008H单元开始为BCD-ASCII转换表TAB,表中的内容依次为0~9的ASCII码:30H、31H、32H、…、39H。要求根据累加器A中的值(0~9)来查找相应的ASCII码,并存入片内RAM的20H单元中。例11.2START:MOVDPTR,#TAB;指向表格基地址

MOVCA,@A+DPTR;结果A=35H

MOV20H,A

;结果(20H)=35H

SJMP$

ORG2008HTAB:DB30H,31H,32H,…,39H解:①采用DPTR作为基址寄存器(假设进入本程序前,A=05H) ADDA,#04H

;修改查表偏移量 MOVCA,@A+PC

;由A与PC当前值之和确定地址,

;取数送A,A=35H

MOV20H,A

;存结果 SJMP$

TAB:DB30H,31H,32H,…,39H②采用PC作为基址寄存器注:

MOVCA,@A+PC指令与TAB表之间有两条指令,各占了两个字节。因此CPU执行该指令时,PC的当前值到表头的距离为4个字节,应修改查表偏移量。(假设进入本程序前,A=05H)4、数据交换指令SWAPA

;A7~4A3~0XCHA,Rn

;ARnXCHA,direct;A(direct)XCHA,@Ri;A(Ri)

XCHDA,@Ri

;A3~

0

(Ri)3~

0解:

相应的程序为:MOVDPTR,#2000H

MOVXA,@DPTR

;(2000H)→AXCHA,20H

;A(20H)MOVX@DPTR,A

;A→(2000H)例11.3编程实现:片内数据存储器20H单元与片外数据存储器2000H单元的内容相互交换。PUSHdirect;SP+1→SP,(direct)→(SP)POPdirect;(SP)→(direct),SP-1→SP

第一条指令称为压栈指令,用于把直接地址direct的内容传送到堆栈中去。第二条指令称为出栈指令。5、堆栈操作指令例11.4设A=30H,B=40H,试问执行下列指令后寄存器A、B、SP、DPTR的内容分别为多少。MOV SP,#60H PUSHACC

PUSHBPOPDPLPOPDPH;设置栈底位置,SP=60H

;SP=61H,栈顶(61H)=A=30H;SP=62H,栈顶(62H)=B=40H;DPL=(62H)=40H,SP=61H;DPH=(61H)=30H,SP=60H

已知:片内数据存储器(20H)=M1,(50H)=M2,编程用堆栈指令把20H和50H单元中内容相互交换。解:MOVSP,#60H

;栈底首地址为60HPUSH20H

;SP←SP+1,(61H)←M1PUSH50H

;SP←SP+1,(62H)←M2POP20H

;(20H)←M2,SP-1=61HPOP50H

;(50H)←M1,SP-1=60H例3.9该类指令总共24条,分为加法、减法、十进制调整和乘除法指令四大类。11.3.2算术运算指令(1)不带进位位加法指令ADDA,Rn ;A+Rn→AADDA,direct ;A+(direct)→AADDA,@Rj ;A+(Ri)→AADDA,#data ;A+#data→A1、加法指令已知:A=83H,R0=20H,(20H)=AFH,试分析执行ADDA,@R0指令后累加器A和PSW中各标志位状态。例11.5:解:结果为:

A=32H、Cy=1、AC=1、OV=1、P=1。

(2)带进位位加法指令ADDCA,Rn ;A+Rn+Cy→AADDCA,direct;A+(direct)+Cy→AADDCA,@Ri;A+(Ri)+Cy→AADDCA,#data;A+data+Cy→A(3)加1指令INCA ;A+1→AINCRn ;Rn+1→RnINCdirect ;(direct)+1→(direct)INC@Ri ;(Ri)+1→(Ri)INCDPTR ;DPTR+1→DPTR设有两个16位无符号二进制数,分别存放在片内RAM30H、31H单元和40H、41H单元中(低地址存放数据低8位)。编程实现这两个16位数的加法(设和不超过16位),并将和存入片外数据存储器的50H、51H单元。例11.6:解:由于不存在16位数的加法指令,所以只能先加低8位,后加高8位,且在加高8位时还应加上低8位相加时的进位位。程序为:

MOV A,30H ADD A,40H MOV R0,#50H MOVX@R0,A MOV A,31H ADDCA,41H INC R0 MOVX@R0,A

(1)带借位(Cy)减法指令SUBBA,Rn ;A-Rn-Cy→ASUBBA,@Ri;A-(Ri)-Cy→ASUBBA,direct;A-(direct)-Cy→ASUBBA,#data;A-#data-Cy→A2、减法指令已知:A=35H、R1=B5H、Cy=1,试分析执行SUBBA,R1指令后A和PSW中各标志位状态。例11.7:解:结果为:

A=7FH、Cy=1、AC=1、OV=0、P=1。

(2)减1指令DEC

A ;A-1→ADECRn ;Rn-1→RnDECdirect ;(direct)-1→(direct)DEC@Ri ;(Ri)-1→(Ri)特点DAA对A中两个压缩BCD数相加之和调整为2位BCD码数。1)只能用在对BCD码数进行ADD或ADDC 操作后使用。2)影响标志位:有进位时Cy=1,表明相 加后的和等于或大于十进制数100。3、十进制调整指令例11.8试编程实现46H+84H的BCD加法程序,将结果存入50H、51H单元。

(1)BCD加法

解: MOV A,#46H ;

46H→A ADD A,#84H;46H+84H=0CAH→A DA A

;A+66H=30H→A,Cy=1,AC=1 MOV50H,A;存放十位、个位的BCD码 MOVA,#00H ADDCA,#00H

MOV51H,A SJMP$

;

结束A=010001104684+)1001100000110011001010

1300

110

高、低4位均大于9,加66H调整BCD加法过程data=01000100二进制加法十进制调整:(2)BCD减法

MCS-51单片机中没有十进制减法调整指令,因此,这里的BCD减法运算必须采用BCD补码运算法则。

已知:M1和M2中分别存有被减数80和减数25,试编程求差,并把结果存入M3单元中。

解:根据BCD减法的实施步骤,程序如下: ORG0100H CLRC ;清Cy MOVA,#9AH;A←两位BCD数的模(100) SUBBA,M2;A←求得减数的补数 ADDA,M1;A←被减数+减数的补数 DAA;对A进行加法调整 MOVM3,A;M3←BCD差 CPLC ;Cy取反,得到差的符号标志

…两位BCD数的模100BCD被减数加60调整BCD差BCD减数减数的补数

1001101000100101

11110101

01100000101010101

01110101

10000000

++BCD减法过程计算:80–25=?即:CY=1,A=55H,CY取反后:CY=0,表明结果为正数,A中的内容为所求结果。两位BCD数的模:100BCD被减数加06H调整BCD差BCD减数:80减数的补数

1001101010000000

00111111

00000110001000101

00011010

00100101++计算:25–80=?

即:CY=0,A=45H。CY取反后:CY=1,表明结果为负数,A中的内容为结果的补数。(即:25-80=-(100-45)=-55)DIVAB;A÷B=A…B,形成标志:除法指令C=0除数=0

OV=1除数≠0时OV=04、乘、除法指令MULAB;A×B=BA,形成标志:

积>255时

OV=1乘法指令C=0共18条,分为与、或、异或运算指令。ANLA,RnANLA,@RiANLA,directANLA,#dataANLdirect,AANLdirect,#data;A∧Rn→A;A∧(Ri)→A;A∧(direct)→A;A∧data→A;(direct)∧A→(direct);(direct)∧data→(direct)11.3.3逻辑运算及移位指令1、逻辑运算类指令(1)逻辑与运算指令ORLA,Rn ;A∨Rn→AORLA,direct ;A∨(direct)→AORLA,@Ri ;A∨(Ri)→AORLA,#data ;A∨data→AORLdirect,A ;(direct)∨A→(direct)ORLdirect,#data ;(direct)∨data→(direct)(2)逻辑或运算指令 编程实现将累加器A中低4位送入P2口低4位,P2口高4位不变。

例11.9解:根据逻辑与、逻辑或运算指令功能来实现:ANLA,#0FH ;A中的高4位清0,低4位不变ANLP2,#0F0H ;P2中的低4位清0,高4位不变ORLP2,A ;装配数据,A0~3→P20~3XRLA,Rn ;A⊕Rn→AXRLA,direct ;A⊕(direct)→AXRLA,@Ri ;A⊕(Ri)→AXRLA,#data ;A⊕data→AXRLdirect,A ;(direct)⊕A→(direct)XRLdirect,#data;(direct)⊕data→(direct)(3)逻辑异或运算指令已知片内RAM20H中有一数55H,欲使其高4位不变,低4位取反,然后将结果保存到外部数据存储器0020H中,试编出它的相应程序。

例11.10解: XRL 20H,#0FH

;55H⊕0FH=5AH MOV A,20H

MOV DPTR,#0020H MOVX@DPTR,ACLRACPLA;0→A;/A→A

已知:40H单元中有一数为34H,试写出对它求补的程序。

解:一个8位二进制机器数的求补可以定义为连同符号位求反加“1”。为此,相应程序为:MOVA,40H;A←34HCPLA;A←/34HINCA;A←得到34H的补数MOV40H,A;结果送回40H单元SJMP$;停止例2、累加器清零和取反指令RLA;RLCA;RRCA;3、移位指令RRA;已知:M和M+1单元中有一个16位二进制数(M为低8位),编程将其扩大到二倍。解:一个16位二进制数扩大到二倍就等于是把它进行一次算术左移。由于MCS-51单元片机的移位指令都是二进制8位的移位指令,因此16位数的移位指令必须用程序来实现。

M

M+1

0

例算法为:程序为:

ORG0030HCLRC ;清进位标志位MOVR0,#M MOVA,@R0 ;A←操作数低8位RLCA

;低8位操作数左移,低位补0MOV@R0,A ;结果送回M单元,Cy中为最高位INCR0

MOVA,@R0 ;A←操作数高8位RLCA ;高8位操作数左移,并移入低位CyMOV@R0,A ;结果送回M+1单元SJMP$

LJMPaddr16 ;addr16→PCAJMPaddr11 ;PC+2→PC,addr11→PC10~0SJMPrel ;PC+2→PC,PC+rel→PCJMP@A+DPTR;A+DPTR→PC1、无条件转移指令11.3.4控制转移类指令F800H~FFFFHF000H~F7FFHE800H~EFFFHE000H~E7FFHD800H~DFFFHD000H~D7FFHC800H~CFFFHC000H~C7FFHB800H~BFFFHB000H~B7FFHA800H~AFFFHA000H~A7FFH9800H~9FFFH9000H~97FFH8800H~8FFFH8000H~87FFH7800H~7FFFH7000H~77FFH6800H~6FFFH6000H~67FFH5800H~5FFFH5000H~57FFH4800H~4FFFH4000H~47FFH3800H~3FFFH3000H~37FFH2800H~2FFFH2000H~27FFH1800H~1FFFH1000H~17FFH0800H~0FFFH0000H~07FFH程序存储器64K地址空间

·无条件转移指令可使程序无条件地转移

·但各指令的转移范围和方式不同,其中: 长转移指令允许在64KB范围内转移,

绝对转移指令可以在2KB范围内转移,

短转移指令只能在-128~+127范围内转移。一页:256个地址单元一区:8个页,共2KB地址单元;地址高5位决定区。

64K:32个区,256个页。(1)长转移指令LJMPaddr16 ;addr16→PC三字节指令,不影响标志位,可在64KB地址范围内无条件转移。(2)绝对转移指令双字节指令,可实现在PC的高五位所限定2KB地址范围内转移。AJMPaddr11 ;PC+2→PC,addr11→PC10~0

指令格式为:

已知:

SZ:AJMPaddr11

其中,SZ为AJMPaddr11指令的标号地址,由该指令在程序存储器中位置确定,addr11为11位目的地址,试分析该指令执行后的情况以及指令码的确定方法。

解:设SZ=4100H,addr11=11010101101B,则根据上述指令格式可得绝对转移指令的指令码为:例:

110

0

0001

10101101操作码a8a9a10a7…………a0PC=01000

11010101101=46ADHPC15…PC11PC0……………..已知:SZ=4100H,addr11=11010101101,即,执行指令时有:PC=4100H+2=0100000100000010C1HADH即操作码为:转移的目的地址为:(3)短转移指令机器码:80rel双字节双周期指令,在一页地址(256)范围内转移。SJMPrel ;PC+2→PC,PC+rel→PC目的地址=PC当前值+rel

=指令操作码的源地址+2+rel

ORG2000H2000H 7401

START:MOVA,#01H2002H F8

MOVR0,A2003H 90CF01

LOOP:MOVDPTR,#2CF0H┋

┋2017H 80E7

SJMPSTART例11.11下列程序中,请计算SJMPSTART指令码中的rel,并分析目标地址的转移范围。a)地址偏移量rel的计算: 由:目的地址=源地址+2+rel

可得:

rel=目的地址-源地址-2 =2000H-2017H-2=-25rel采用补码表示,因此rel=[-25]补=E7H解:SJMP指令中地址偏移量是采用START符号表示的,指明指令执行后转入本程序开头处重新执行。b)转移地址范围的确定:转移地址通常以SJMP指令始址为参照点,但执行SJMP指令时,PC已自动加了2,而rel的取值范围是-128~+127,故可得到转移地址的实际转移范围为:

-126~+129。

1、在汇编语言程序中,addr16、addr11和rel通常用目标的符号地址表示,用户编程时无需计算其具体数值大小,汇编程序能自动计算出相应的地址或偏移量,并填入到指令的机器码中。

2、通常利用SJMP指令来实现“原地踏步”:HERE:SJMPHERE或

SJMP$其中:“$”代表PC的当前值,SJMP$表示转移到本条指令所处位置。以上指令机器码中rel的值均为FEH。注意:(4)变址寻址转移指令JMP@A+DPTR ;A+DPTR→PC机器码:73H

该类指令是一条单字节双周期无条件转移指令。常常用于查表转移(哈希查找法)在64KB地址范围内无条件转移。

JZrel ;A=0,PC+2+rel→PC ;

A≠0,PC+2→PCJNZrel ;A≠0,PC+2+rel→PC

;

A=0,PC+2→PC2、条件转移指令(1)累加器A判零转移指令

已知:外部数据存贮器中DATA1为始址的数据块以零为结束标志,试编程将之送到以DATA2为始址的内部RAM单元中。

解:程序为:

MOVR0,#DATA1;外部数据存贮器数据块始址送R0

MOVR1,#DATA2;内部RAM数据块始址送R1MAIN:MOVXA,@R0;取外部数据存贮器数据送A

JZQUIT ;若A=0,则跳转到QUIT处, ;否则往下执行

MOV@R1,A ;A中的数据送给内部RAM单元中

INCR0 ;修改外部数据存贮器地址的指针

INCR1 ;修改内部RAM地址的指针

SJMPMAIN ;循环执行QUIT: SJMP$

CJNEA,#data,rel ;不相等转移,即:A-data ;若A=data,则PC+3→PC,0→C ;若A>data,则PC+3+rel→PC,0→C ;若A<data,则PC+3+rel→PC,1→CCJNEA,direct,rel;不相等转移,即:A-data;若A=(direct),则PC+3→PC,0→C;若A>(direct),则PC+3+rel→PC,0→C;若A<(direct),则PC+3+rel→PC,1→C(2)比较条件转移指令(影响标志位)CJNERn,#data,rel ;不相等转移,即:Rn-data ;若Rn=data,则PC+3→PC,0→C ;若Rn>data,则PC+3+rel→PC,0→C ;若Rn<data,则PC+3+rel→PC,1→CCJNE@Ri,#data,rel;不相等转移,即:(Ri)-data ;若(Ri)=data,则PC+3→PC,0→C ;若(Ri)>data,则PC+3+rel→PC,0→C ;若(Ri)<data,则PC+3+rel→PC,1→CDJNZRn,rel ;

Rn-1→Rn ;若Rn=0,则PC+2→PC ;若Rn≠0,则PC+2+rel→PC(3)减1条件转移指令DJNZdirect,rel ;

(direct)-1→(direct) ;若(direct)=0,则PC+3→PC ;若(direct)≠0,则PC+3+rel→PC

试编写程序,将片外数据存储器1000H单元开始的10H个数,送到片内数据存储器20H单元开始的区间中。

例11.12

解:程序为:

ORG0030H

MOVR2,#10H

;传送个数→R2

MOVR0,#20H

;R0指向目标区间起始地址

MOVDPTR,#1000H

;DPTR指向源数据起始地址START:MOVXA,@DPTR

;取一个数据

MOV@R0,A

;数据存入片内RAM单元

INC R0

;目标地址指针加1

INC DPTR

;源地址指针加1

DJNZR2,START

;判断传送个数

SJMP $

;退出循环,停止程序运行条件转移指令均为相对转移指令,转移范围都在以PC当前值为基准的-128~+127范围内,因此指令的转移范围有限。条件转移指令计算转移地址的方法相同,即:

转移地址=PC当前值+rel地址偏移量rel在源程序中常用标号替代,程序汇编时由汇编程序自动换算成8位偏移量。注意:(1)调用指令3、子程序调用和返回指令a)长调用指令LCALLaddr16;PC+3→PC;SP+1→SP,PC7~0→(SP);SP+1→SP,PC15~8→(SP);addr16→PC

三字节指令,在64KB地址范围内调用子程序。b)短调用指令ACALLaddr11;PC+2→PC;SP+1→SP,PC7~0→(SP);SP+1→SP,PC15~8→(SP);addr11→PC10~0

机器码:a10a9a810001a7a6a5a4a3a2a1a0

双字节指令,不影响标志位,在2KB地址范围内寻址,以调用子程序。页数决定于addr11的高3位,页内地址决定于addr11的低8位。

已知:MAIN=0200H,试问执行如下指令后,SP及堆栈中数据如何变化?PC中内容是什么?

MOVSP,#65H MAIN:LCALL2000H

例解:执行上述指令后, SP=67H、PC=2000H (66H)=03H、(67H)=02H。(2)返回指令RET;(SP)→PC15~8,SP-1→SP;(SP)→PC7~0,SP-1→SP

调用子程序后必须返回主程序,因此,每段子程序的最后一条指令必须是返回指令RET。其功能是将调用子程序时压入堆栈的断点地址送回PC,使程序返回到主程序断点处继续往下执行。a)子程序返回指令

b)中断返回指令RETI;(SP)→PC15~8,SP-1→SP;(SP)→PC7~0

温馨提示

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

评论

0/150

提交评论