《第3章:8051指系统2.ppt》由会员分享,可在线阅读,更多相关《第3章:8051指系统2.ppt(31页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、3.2 数据传送指令数据传送指令 3.2.1 内部内部RAM数据传送指令数据传送指令 3.2.2 外部外部RAM传送指令传送指令 3.2.3 查表指令查表指令 3.2.4 交换指令交换指令 3.2.5 堆栈操作指令堆栈操作指令 3.2.6 数据传送类指令应用实例数据传送类指令应用实例 图3-6 MCS-51单片机片数据传送图 在在MCS-51单片机系在单片机系在MCS-51指令系统中,数据传送指令系统中,数据传送类指令是运用最频繁的一类指令。由于单片机的逻辑空类指令是运用最频繁的一类指令。由于单片机的逻辑空间分为内部间分为内部RAM、外部、外部RAM和和ROM,数据的传送也都,数据的传送也都是
2、在这是在这3者之间进行,传送路径如图者之间进行,传送路径如图3-6所示。列中,所示。列中,8031、8032内部没有程序存储器,内部没有程序存储器,8051/8751/AT89C51内部有内部有4K的程序存储器,的程序存储器,8052/8752/AT89C52内部有内部有8K的程序存储器。的程序存储器。从图从图3-6中可知:中可知:(1)片内)片内RAM的单元数据可以相互传送,用的单元数据可以相互传送,用MOV指指令。令。(2)外部)外部RAM只能与累加器只能与累加器A进行数据传送,外部进行数据传送,外部RAM送内送内RAM或者内或者内RAM送外部送外部RAM必须经过累必须经过累加器加器A,用
3、,用MOVX指令。指令。(3)从)从ROM只能读取数据,并且只能到只能读取数据,并且只能到A,如果要,如果要将将ROM数据送内数据送内RAM或者外部或者外部RAM,也必须经过,也必须经过累加器累加器A。3.2.1 内部内部RAM数据传送指令数据传送指令内部内部内部内部RAMRAM数据传送指令共有数据传送指令共有数据传送指令共有数据传送指令共有1515条,用于条,用于条,用于条,用于80518051单片单片单片单片机片内数据存储器和寄存器之间的数据传送。机片内数据存储器和寄存器之间的数据传送。机片内数据存储器和寄存器之间的数据传送。机片内数据存储器和寄存器之间的数据传送。采用的寻址方式有:采用的
4、寻址方式有:采用的寻址方式有:采用的寻址方式有:立即数寻址立即数寻址立即数寻址立即数寻址 直接寻址直接寻址直接寻址直接寻址 寄存器寻址寄存器寻址寄存器寻址寄存器寻址 寄存器间接寻址寄存器间接寻址寄存器间接寻址寄存器间接寻址数据传输形式如右图数据传输形式如右图数据传输形式如右图数据传输形式如右图 所示。所示。所示。所示。3.2.1 内部内部RAM数据传送指令数据传送指令1.以累加器以累加器A为目的操作数的指令为目的操作数的指令 汇编指令格式汇编指令格式 机器指令格式机器指令格式 操作操作 MOV A,Rn E8HEFH A (Rn)MOV A,direct E5H direct A (direc
5、t)MOV A,Ri E6HE7H A (Ri)MOV A,#data 74H data A#data注意:上述操作不影响源字节和任何别的寄存器内容,只影响注意:上述操作不影响源字节和任何别的寄存器内容,只影响PSW的的P标志位。标志位。【例例3-1】已知已知(23H)=50H,(50H)=45H,R0=23H,指出每条指,指出每条指令执行后相应单元内容的变化。令执行后相应单元内容的变化。MOV A,50H;(50)A,A45H。MOV A,R0;(R0)A,A50H。MOV A,R0;R0A,A23H。MOV A,#52H;52HA,A52H。3.2.1 内部内部RAM数据传送指令数据传送指
6、令2.以寄存器以寄存器Rn为目的操作数的指令为目的操作数的指令 汇编指令格式汇编指令格式 机器指令格式机器指令格式 操操 作作 MOV Rn,A F8HFFH Rn (A)MOV Rn,direct A8HAFH direct Rn (direct)MOV Rn,#data 78H7FH data Rn#data【例例3-2】将将R3中的内容送中的内容送R2。解解:MOV A,R3;R3AMOV R2,A;AR2很多初学者常写出很多初学者常写出MOV R2,R3的错误指令,所以的错误指令,所以在这里必须强调,在书写指令时,必须按照规定的指在这里必须强调,在书写指令时,必须按照规定的指令格式写,
7、不能凭自己的想象编造,否则单片机无法令格式写,不能凭自己的想象编造,否则单片机无法执行。同时,大家可以记住,执行。同时,大家可以记住,在同一条指令中,不可在同一条指令中,不可能同时出现两个能同时出现两个Rn或或Ri。即:即:8051指令系统中没有指令系统中没有“MOV Rn,Ri”和和“MOV Rn,Rn”传送指令,也没传送指令,也没有有“MOV Ri,Ri”指令。指令。【例例3-3】已知已知A=34H,(40H)=52H,指出每条指令执行,指出每条指令执行后相应单元内容的变化。后相应单元内容的变化。MOV R0,A ;AR0,R0=34HMOV R3,40H ;(40H)R3,R3=52HM
8、OV R4,#40H ;40HR4,R4=40H3.2.1 内部内部RAM数据传送指令数据传送指令3.以直接地址为目的操作数的指令以直接地址为目的操作数的指令 汇编指令格式汇编指令格式 机器指令格式机器指令格式 操作操作 MOV direct,A F5H direct direct (A)MOV direct,Rn 88H8FH direct direct (Rn)MOV direct2,direct1 85H direct1 direct2 direct2 (direct1)MOV direct,Ri 86H87H direct direct (Ri)MOV direct,#data 75H
9、 direct data direct#data 这这5条指令不影响标志位。条指令不影响标志位。注意:注意:“MOV direct2,direct1”指令在译成机器码时,源地址在前,指令在译成机器码时,源地址在前,目的地址在后。如目的地址在后。如“MOV 50H,90H”的机器码为的机器码为“85 90 50”。【例例3-4】已知已知A60H,R0=38H,(38H)=83H,(40H)=7FH,指出每条指令执行后相应单元内容的变,指出每条指令执行后相应单元内容的变化。化。MOV 41H,A;A41H,(41H)=60HMOV 41H,R0;(R0)41H,(41H)=83HMOV 41H,R
10、0;R041H,(41H)=38HMOV 41H,40H;(40H)41H,(41H)=7FHMOV 41H,#0F8H;F8H41H,(41H)=F8H最后结果:最后结果:(41H)=F8H。注意:编写程序时,若操作数最高位大于注意:编写程序时,若操作数最高位大于9,则在最,则在最高位前加高位前加0,否则编译会出错。,否则编译会出错。3.2.1 内部内部RAM数据传送指令数据传送指令4.间接地址为目的操作数的指令间接地址为目的操作数的指令 汇编指令格式汇编指令格式 机器指令格式机器指令格式 操操 作作 MOV Ri,A F6HF7H (Ri)(A)MOV Ri,direct A6HA7H d
11、irect (Ri)(direct)MOV Ri,#data 76H77H data (Ri)data注意:注意:(Ri)表示以表示以Ri中的内容为地址所指定的中的内容为地址所指定的RAM单元。单元。5.十六位数据传送指令十六位数据传送指令 汇编指令格式汇编指令格式 机器指令格式机器指令格式 操操 作作 MOV DPTR,#data16 90H dataH dataL DPH dataH,DPL dataL注意:这是唯一的注意:这是唯一的16位立即数传送指令,这条指令不影响标志位。位立即数传送指令,这条指令不影响标志位。说明:说明:(1)该指令的功能是将)该指令的功能是将16位立即数送入位立即
12、数送入DPTR,其,其中中DPH存放高存放高8位,位,DPL存放低存放低8位,也就是说,指位,也就是说,指令令MOV DPTR,#5678H可以用下面两条指令来代可以用下面两条指令来代替:替:MOV DPH,#56HMOV DPL,#78H(2)DPTR一般用作一般用作16位间接寻址,如果是位间接寻址,如果是MOVX指指令,则寻片外令,则寻片外RAM地址,如果是地址,如果是MOVC指令,则寻指令,则寻ROM地址。地址。3.2.2 外部外部RAM传送指令传送指令 汇编指令格式汇编指令格式 机器指令格式机器指令格式 操操 作作 MOVX DPTR,A F0H 外外(DPTR)(A)MOVX A,D
13、PTR E0H A 外外(DPTR)MOVX Ri,A F2HF3H 外外(Ri)(A)MOVX A,Ri E2HE3H A 外外(Ri)注意:注意:8051没有专门的输入没有专门的输入/输出指令,在访问外部的设备时,输出指令,在访问外部的设备时,可以采用这种方式与外部设备的端口打交道。可以采用这种方式与外部设备的端口打交道。说明:说明:(1)对外部)对外部RAM的访问必须通过的访问必须通过累加器累加器A。(2)对外部)对外部RAM的访问必须采用的访问必须采用寄存器间接寻址方式寄存器间接寻址方式,寻址,寻址寄存器有两种。寄存器有两种。8位寄存器位寄存器R0、R1,寻址范围为片外,寻址范围为片外
14、RAM低低8位地址空间位地址空间(00HFFH),其高),其高8位地址由位地址由P2口状态确定。口状态确定。16位寄存器位寄存器DPTR,寻址范围为片外,寻址范围为片外RAM 64K地址空间地址空间(0000HFFFFH)。)。【例例3-7】要求编写指令序列,实现以下功能:要求编写指令序列,实现以下功能:将片外将片外RAM 2000H单元内容传送到片内单元内容传送到片内RAM 20H单元单元中。中。将片外将片外RAM 2120H单元内容送到片外单元内容送到片外RAM 3210H单元单元中。中。解:解:MOV DPTR,#2000HMOVXA,DPTRMOV20H,AMOVDPTR,#2120H
15、MOVXA,DPTRMOVDPTR,#3210HMOVXDPTR,A3.2.3 ROM指令(查表指令)(指令(查表指令)(2条)条)MOVC 目的操作数,源操作数我们知道,我们知道,ROM中存放的是程序代码,一般不需要中存放的是程序代码,一般不需要人为去读,但有时候,在程序中也包含某些重要数据人为去读,但有时候,在程序中也包含某些重要数据(也称表格),如显示字型码、常数等。这些数据在(也称表格),如显示字型码、常数等。这些数据在程序运行过程中需要被读出来,参与程序的处理过程。程序运行过程中需要被读出来,参与程序的处理过程。比如要实现函数,比如要实现函数,x为输入量,是为输入量,是010的整数,
16、如果的整数,如果采用编程方法实现这个函数的运算,则比较复杂。我采用编程方法实现这个函数的运算,则比较复杂。我们可以利用其他工具先算出们可以利用其他工具先算出Y(0)Y(10)的值,把它的值,把它依次存放在依次存放在ROM中,然后根据中,然后根据x的值去找出的值去找出Y(x)的值,的值,这种方法就称为查表,也是这种方法就称为查表,也是2条读条读ROM指令的主要功指令的主要功能。能。MOVC A,A+DPTR;(A+DPTR)AMOVC A,A+PC ;PC+1PC,(A+PC)AROM指令(查表指令)指令(查表指令)说明:说明:(1)这两条指令的寻址方式都为变址寻址方式,都)这两条指令的寻址方式
17、都为变址寻址方式,都是单字节指令,都只影响标志位是单字节指令,都只影响标志位P。(2)MOVC A,A+DPTR的寻址以的寻址以DPTR为基址,为基址,可以寻址整个可以寻址整个64 KB的的ROM空间空间。(3)MOVC A,A+PC的寻址以当前指令的的寻址以当前指令的PC值为值为基址寄存器,基址寄存器,其寻址范围为该指令后其寻址范围为该指令后256 B的的ROM空空间。间。(4)在实际应用中,)在实际应用中,MOVC A,A+DPTR寻址范寻址范围广,不用修正围广,不用修正A值,比较方便,采用较多。值,比较方便,采用较多。(5)以上以上2条指令执行后,不能改变条指令执行后,不能改变PC或或D
18、PTR的的内容内容【例例3-8】在单片机应用系统中,常用在单片机应用系统中,常用LED数码管显示数码,数码管显示数码,但显示数字(但显示数字(9)与显示数字编码并不相同,需要将显示数)与显示数字编码并不相同,需要将显示数字转换为显示字型(段)码,通常是用查表的方法。字转换为显示字型(段)码,通常是用查表的方法。现要求将现要求将30H中的显示数字转换为显示字型(段)码并存入中的显示数字转换为显示字型(段)码并存入30H。已知共阴字段码表首址为。已知共阴字段码表首址为TAB。解:编程如下。解:编程如下。CHANG:MOVDPTR,#TAB ;置共阴字段码表首址;置共阴字段码表首址 MOV A,30
19、H ;读显示数字;读显示数字 MOVC A,A+DPTR ;查表,转换为显示字;查表,转换为显示字段码段码 MOV30H,A ;存显示字段码;存显示字段码 RETTAB:DB 3FH,06H,5BH,4FH,66H;04共阴字段码表共阴字段码表 DB 6DH,7DH,07H,7FH,6FH;59共阴字段码表共阴字段码表电路原理图电路原理图 3.2.4 交换指令 1.字节交换指令字节交换指令 汇编指令格式汇编指令格式 机器指令格式机器指令格式 操操 作作 XCH A,Rn C8CFH (A)(Rn)XCH A,direct C5H (A)(direct)XCH A,Ri C6HC7H (A)(R
20、i)注意:该操作只影响标志位注意:该操作只影响标志位P。2.半字节交换指令半字节交换指令 汇编指令格式汇编指令格式 机器指令格式机器指令格式 操操 作作 XCHD A,Ri D6HD7H (A)03 (Ri)03 注意:该操作只影响标志位注意:该操作只影响标志位P。3.2.4 交换指令 3.3.累加器半字节交换指令累加器半字节交换指令累加器半字节交换指令累加器半字节交换指令 汇编指令格式汇编指令格式汇编指令格式汇编指令格式 机器码格式机器码格式机器码格式机器码格式 操操操操 作作作作 SWAP ASWAP A C4H C4H (A)0 (A)03 3 (A)4(A)47 7 注意:该操作不影响
21、标志位注意:该操作不影响标志位注意:该操作不影响标志位注意:该操作不影响标志位P P。3.2.5 堆栈操作指令堆栈操作指令 1.入栈指令入栈指令 汇编指令格式汇编指令格式 机器指令格式机器指令格式 操操 作作 PUSH direct C0H direct SP (SP)+1,(SP)(direct)注意:堆栈指针注意:堆栈指针SP先加先加1,并指向栈顶的上一个空单元,然后再,并指向栈顶的上一个空单元,然后再将直接地址将直接地址(direct)寻址的单元内容压入当前寻址的单元内容压入当前SP所指示的堆所指示的堆栈单元中。该操作不影响标志位栈单元中。该操作不影响标志位P。2.出栈指令出栈指令 汇编
22、指令格式汇编指令格式 机器指令格式机器指令格式 操操 作作 POP direct D0H direct direct (SP),SP (SP)-1注意:先将堆栈指针注意:先将堆栈指针(SP)所指示的内部所指示的内部RAM(栈顶栈顶)单元中内容送单元中内容送入由直接地址寻址的单元中,然后再将栈指针入由直接地址寻址的单元中,然后再将栈指针(SP)减减1并回送并回送SP。该操作不影响标志位。该操作不影响标志位P。假如:假如:PUSH 30H,(30H)=2BH,SP=0FH,则其操,则其操作过程如图所示。作过程如图所示。E0H 00H 40H ABH 4CH 96H 66H 23H 07H 08H
23、09H 0AH 0BH 0CH 0DH 0EH 11H 0FH 10H地址 栈顶 栈底 SP 栈底 栈顶地址 10H 0FH 11H 0EH 0DH 0CH 0BH 0AH 09H 08H 07H 23H 66H 96H 4CH ABH 40H 00HE0H SP SPE0H 00H 40H ABH 4CH 96H 66H 23H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 11H 0FH 10H地址 栈顶 栈底 2BH 2BH (a)SP原始状态(b)SP1 指向栈顶空单元 SP,(c)direct中数据压入堆栈例如:例如:POP 30H,SP=0FH,则其出栈操作过程如
24、图,则其出栈操作过程如图所示。所示。(b)栈顶单元内容 SP,指向栈顶地址指向栈顶地址(b)SP-1(a)SP原始状态原始状态栈底栈底地址 10H 0FH 11H 0EH 0DH 0CH 0BH 0AH 09H 08H 07H 23H 66H 96H4CH作废 ABH 40H 00H 00H 40H ABH 4CH 96H 66H 23H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 11H 0FH 10H地址栈底 SP栈底栈底地址 0BH 0AH 09H 08H 07H栈顶栈顶栈顶栈顶 SP SP(direct)4CHE0HE0H栈顶栈顶 10H 0FH 11H 0EH 0
25、DH 0CH 4CH 96H 66H 23H 40H ABH 00HE0H结论:结论:1)PUSH 与与 POP 操作过程刚好相反;操作过程刚好相反;2)进、出栈规则:先进后出,后进先出。应注意指进、出栈规则:先进后出,后进先出。应注意指令书写先后顺序;令书写先后顺序;3)可用于可用于“保护现场,恢复现场保护现场,恢复现场”。【例例3-8】将片内将片内RAM 30H单元与单元与40H单元单元中的内容互换。中的内容互换。解:解:方法方法1(直接地址传送法):(直接地址传送法):MOV31H,30HMOV30H,40HMOV40H,31HSJMP$方法方法3(字节交换传送法)(字节交换传送法):X
26、CH A,30HXCH A,40HXCH A,30HSJMP$方法方法4(堆栈传送法)(堆栈传送法)PUSH 30HPUSH 40HPOP 30HPOP 40HSJMP$方法方法2(间接地址传送法)(间接地址传送法):MOVR0,#40HMOVR1,#30HMOVA,R0MOVB,R1MOVR1,AMOVR0,BSJMP$例例3_9:使用不同的指令将累加器使用不同的指令将累加器A的内容送至内部的内容送至内部RAM的的26H单元。单元。解:在访问内部解:在访问内部RAM时,可以有多种寻址方式供选择,在实际时,可以有多种寻址方式供选择,在实际应用中要注意根据实际情况选择合适的寻址方式来进行数据应用
27、中要注意根据实际情况选择合适的寻址方式来进行数据传送。可以通过下面指令采用不同寻址方式实现。传送。可以通过下面指令采用不同寻址方式实现。MOV26H,A;目的操作数采用直接寻址,目的操作数采用直接寻址,源操作数采用寄存器寻址源操作数采用寄存器寻址 MOVR0,#26H MOVR0,A;目的操作数采用寄存器间接寻址,目的操作数采用寄存器间接寻址,源操作数采用寄存器寻址源操作数采用寄存器寻址 MOV26H,ACC;采用直接寻址采用直接寻址 MOV26H,0E0H;采用直接寻址采用直接寻址 PUSH ACC;利用栈操作,直接寻址利用栈操作,直接寻址 POP 26H例例3_10:(A)=20H,(B)
28、=30H,分析执行下面指令以后的结果。,分析执行下面指令以后的结果。PUSH ACC PUSH B POP ACC POP B解:根据堆栈的解:根据堆栈的“先入后出、后入先出先入后出、后入先出”操作原则进行分析,操作原则进行分析,执行上面指令以后结果为:执行上面指令以后结果为:(A)=30H,(B)=20H。程序执行结果和初始状态比较,两寄存器内容进行了互换,程序执行结果和初始状态比较,两寄存器内容进行了互换,正是由正是由“先入后出先入后出”的存储原则造成的。的存储原则造成的。在子程序调用时,堆栈经常用来保护现场,利用在子程序调用时,堆栈经常用来保护现场,利用PUSH保护保护现场,利用现场,利
29、用POP恢复现场。恢复现场。恢复现场时,一定要注意恢复现场时,一定要注意POP指指令的顺序要和令的顺序要和PUSH指令对称,后压入的数据先弹出,先压指令对称,后压入的数据先弹出,先压入的数据后弹出,使得现场正确恢复到原来状态。入的数据后弹出,使得现场正确恢复到原来状态。例例3_11 3_11 在程序存储器中有一平方表,从在程序存储器中有一平方表,从2000H2000H单元开始存放,如图所示,试通过单元开始存放,如图所示,试通过查表指令查找出查表指令查找出6 6的平方。的平方。解:采用解:采用DPTRDPTR作为基址寄存器的查表程序作为基址寄存器的查表程序比较简单,查表范围大,也容易理解。比较简
30、单,查表范围大,也容易理解。只要预先使用一条只要预先使用一条1616位数据传送指令,把位数据传送指令,把表的首地址表的首地址2000H2000H送入送入DPTRDPTR,然后进行,然后进行查表就可以了。查表就可以了。相应的程序如下:相应的程序如下:MOV A,#6MOV A,#6 ;设定备查的表项设定备查的表项 MOV DPTR,#2000HMOV DPTR,#2000H ;设置设置DPTRDPTR为表始址为表始址 MOVC A,A+DPTRMOVC A,A+DPTR ;将将A A的平方值查表后的平方值查表后送送A A 如果需要查找其他数的平方,只需要将如果需要查找其他数的平方,只需要将累加器
31、累加器A A的内容的内容(变址变址)改一下即可。改一下即可。2000H2000H0 02001H2001H1 12002H2002H4 42003H2003H9 92004H2004H16162005H2005H25252006H2006H36362007H2007H49492008H2008H64642009H2009H8181A和和ACC的实质是一样的,对应地址都是的实质是一样的,对应地址都是0E0H,只是汇编在使用时,在格式上取了两只是汇编在使用时,在格式上取了两个名字。个名字。你看看它们的使用方法,有的地你看看它们的使用方法,有的地方用方用A,有的地方用,有的地方用ACC,会发现有一定的,会发现有一定的规律。规律。当其要进行位表示时,必须用当其要进行位表示时,必须用ACC,比如要写成比如要写成ACC.7,而不能写成,而不能写成A.7 但当但当其作为其作为8位二进制数时,位二进制数时,ACC和和A都能用都能用 但但还是有区别还是有区别 比如比如 INC ACC和和INC A 都能用都能用.
限制150内