MCS-51单片机指令系统教程.ppt

上传人:少林足球 文档编号:4099702 上传时间:2019-10-16 格式:PPT 页数:120 大小:675KB
返回 下载 相关 举报
MCS-51单片机指令系统教程.ppt_第1页
第1页 / 共120页
MCS-51单片机指令系统教程.ppt_第2页
第2页 / 共120页
MCS-51单片机指令系统教程.ppt_第3页
第3页 / 共120页
MCS-51单片机指令系统教程.ppt_第4页
第4页 / 共120页
MCS-51单片机指令系统教程.ppt_第5页
第5页 / 共120页
点击查看更多>>
资源描述

《MCS-51单片机指令系统教程.ppt》由会员分享,可在线阅读,更多相关《MCS-51单片机指令系统教程.ppt(120页珍藏版)》请在三一文库上搜索。

1、MCS-51单片机指令系统,2.1 概述,2.2 寻址方式,2.3 数据传送指令,2.4 算逻运算和移位指令,2.5 控制转移和位操作指令,2.1:MCS-51指令系统的概述,MCS-51共有111条指令,指令的长度和执行时间因不同的指令而各不相同。 2.1.1 指令格式 2.1.2 指令的三种表示形式 2.1.3 指令的字节数 2.1.4 指令的分类,继续,2.1.1 指令格式:,指令格式:既指令的结构形式。,操作码,操作数或操作数地址,由操作码和操作数(或操作数地址)构成指令的结构。,举例:MOV A,#0FFH ADD A,R0,返回,指令的表示形式是识别指令的标志。 1,二进制的表示形

2、式:(以“累加器的内容+08H”为例) 00100100B 操作码 OP (加法) 00001000B 操作数DATA(08H) 特点: 能被CPU直接识别、运行的形式。也称机器码、汇编语 言的目标代码。 缺点:不便于阅读、记忆和调试修改。,2.1.2 指令的三种表示形式:,2,十六进制表示方式: 它是对二进制形式的一种简化。 00100100B 24H 00001000B 08H 在实验室等少数环境下,可以将这种形式作为输入程序的一种辅助手段。但是,这种形式的指令格式必须由对应的监控程序把它们翻译成二进制的“机器码”后存入程序存储器并运行。,二进制表示的形式 十六进制表示的形式,3,指令的“

3、助记符”方式(也称“汇编格式”): 00100100B 24H 00001000B 08H ADD A,#08H 1,这是一种由英文单词或字母、数字来表征指令功能的 形式。是一种便于阅读、书写和交流的表示形式。 2,这种 “汇编”格式的指令必须把它“翻译”为二进制形式 “机器码”后才能为CPU所识别和执行。 3,三种不同的表示方法适用于不同的场合。 本章内容都以汇编的形式介绍指令系统。,二进制表示形式 十六进制表示 汇编格式,返回,2.1.3 指令的字节数,在MCS-51单片机的指令系统中,因指令操作码和操作数的不同,指令(在存储器中)长度也各不相同。 分为单字节、双字节和三字节。 单字节指令

4、(49条):分无操作数、有操作数两种。 无操作数:如 INC DPTR 10100011B INC A 00000100B 【特点】:操作数隐含在操作码中。 含有操作数寄存器名称的单字节指令: 如:MOV A,R0 11101000B MOV A,R1 11101001B 【特点】:寄存器名以三位数代码的形式在指令的后三位。,双字节指令(46条): 指令的操作码和操作数各占一个字节。 如: MOV A,#data 01110100B data 很明显:8位的操作数本身占据一个字节。,n,n+1,mov a,#data,双字节指令在程序存储器的存放示意图,三字节指令(16条): 指令中的操作数为

5、双字节。如: MOV DPTR,#data16 1001000B,data15-8,data7-0 或者:指令中分别包含1个字节的操作数和1个字节的操作数地址。如: MOV direct,#data 举例:MOV 20H,#0FFH,MOV dptr,#data16,MOV direct,#data,三字节指令在存储器中存放的方式示意图,指令的字节数与指令的运行时间,指令的字节多是否意味着指令周期就长?,从表中可见,指令的字节数与指令周期不是对等的关系,返回,2.1.4 指令的分类,MCS-51单片机的指令如果按功能划分可以分为五类: 1,数据传送类指令:完成数据在单片机内部之间的传送。 分为

6、8位数和16位两种。除了奇偶位外,指令的执行对 PSW无影响。 2,算术运算指令:用于操作数之间的加、减、乘除运算。 【特点】:多数情况下:操作数之一在累加器A中,结果也保留在A中,运算结果要影响PSW(进位标志、奇偶和溢出标志等)。 3,逻辑操作和循环移位指令:操作数之间的逻辑加、逻辑与、取反和异或等操作。多数情况下一个操作数在A中,结果也存于A。移位指令分为左移、右移和带进位和不带进位几种情况。与算术类指令相比逻辑类指令基本不影响PSW的内容。,4,控制转移类指令:条件转移、无条件转移,调用和返回。 【 特点】:通过修改程序指针PC的内容,使CPU转到另一处执行,从而改变程序的流向。 5,

7、位操作指令:位传送、位置位、位运算和位控制转移等操作。 【 特点】:按位操作而不是按字节的操作。位控转移的判断不是检测某一个字节而是对某一个位进行检测并决定是否进行程序转移。 这类指令基本不影响PSW的内容。,返回,2.2 寻址方式,在指令的操作数位置上,用于表征、寻找操作数的方式定义为“寻址方式”。 正确的理解、掌握寻址方式,是学习、使用指令的关键。 在MCS-51单片机中,共使用了七种寻址方式。 它们分别是: 1,寄存器寻址 5,变址寻址; 2,直接寻址 6,相对寻址; 3,立即数寻址 7,位寻址。 4,寄存器间接寻址,继续,2.2.1寄存器寻址,当所需要的操作数在内部某一个寄存器Rn中时

8、,将此寄存器名Rn直接写在指令的操作数的位置上。如: MOV A,R7 ;将寄存器R7中的内容送累加器A中。 MOV 20H,R0 ;将寄存器R0中的数据送内存20H单元 INC R1 ;将寄存器R1中的内容加一 ADD A,R3 ;A的内容与寄存器R3的内容相加送A 寄存器寻址方式的指令大多是单字节指令。指令本身并不带有操数,而是含有存放操作数的寄存器的3位代码。以MOV A,Rn为例,使用R7寄存器,所以rrr=111,既指令的机器码为:0EFH,1 1 1 0 1 r r r,操作码,寄存器代码,返回,E8HEFH,MOV A,Rn,2.2.2 直接寻址,指令本身含有操作数的8位或16位

9、地址。既指令直接给出了操作数的地址。如: MOV A,30H ;将RAM30H单元内容送累加器 这里30H是操作数在RAM中的地址。 很明显,直接寻址的指令长度是两个或三个字节。,n,n+1,30H,累加器A,直接寻址示意图,使用直接寻址应注意的三个问题:,1,指令助记符中direct是用16进制数表示的操作数地址。 当地址恰好在SFR区域时,指令也可以用寄存器名来表示。 如: MOV A,80H 可以写成 MOV A,P0 后者用SFR中寄存器的名字取代它的物理地址80H。很明显,后者更容易阅读和交流,所以我们提倡使用SFR中寄存器名称来代替直接地址。 如:MOV A,SBUF ;串口数据缓

10、冲器数据送A MOV IE,#00H ;初始化中断允许寄存器 MOV TH1,#0FEH ;为定时器1赋初值 尽管使用SFR的寄存器名称来取代直接地址,可以带来程序的可读性,但是在汇编时,仍要将寄存器名字转换为直接地址。,2,当直接地址时在工作寄存器区中时,可以使用两种寻址方式来访问。 如: MOV A,00H ;将RAM中00H单元数据送累加器A MOV A,R0 ;将工作寄存器R0的内容送累加器A 这里使用了不同的寻址方式,其指令的结构也不相同。 前者是:11100101(0E5H)、00000000(00H) 双字节。 后者的机器码是:11101000(0E8H) 单字节; 在物理结构上

11、,R0与RAM的00H单元恰好是同一单元,所以不同的指令而执行结果是一样的。 类似的还有累加器A: INC A 寄存器寻址方式(单字节); INC ACC 直接寻址方式(双字节); INC 0E0H 直接寻址方式(双字节)。,3,在指令系统中:字节地址与位地址是完全不同的概念。 前者用direct表示,而后者用bit 表示,但在指令中都是用16进制表示的数。 如: MOV A,20H ;将RAM的20H单元内容送A MOV C,20H ;将位寻址区中的位地址为20H位内容送 PSW 中的Cy中。,片内 RAM(20H-2FH)中的位寻址区结构图,2FH,20H,字节地址,返回,24H,位地址,

12、返回前一次,2.2.3立即寻址,指令本身直接含有所需要的8位或16位的操作数。 将此数称为“立即数”(使用#标明)。如: MOV A,#30H ;将(8位)立即数送累加器A MOV DPTR,#2000H ;16位立即数送DPTR积存器 【注意】:MOV A,#30H MOV A,30H 两者的区别。 立即数寻址的指令长度为2或3个字节。,n,n+1,ROM,累加器A,MOV A,#30H 指令执行流程,ROM,DPTR,MOV DPTR,#2000H指令的存储和执行,返回,2.2.4 寄存器间接寻址,指令中含有保存操作数地址的寄存器Ri。 MOV A,Ri ( i=0、1) CPU首先根据指

13、令中寄存器名Ri找到操作数地址,然后再从该地址中找到操作数 x。 如:MOV R0,#30H ;立即数送R0寄存器 MOV A,R0 ;从RAM的H单元取数送累加器A 【注意】MOV A,R0 和 MOV A,R0 指令的区别。,30H,R0,00H,累加器A,1,2,3,使用寄存器间址指令时应注意的三个问题:,1,间址寄存器Ri只能使用R0、R1寄存器(i=0、1)。 2,间址方式不仅用于片内RAM,同样也适用于片外RAM。 对于片内RAM使用Ri寄存器,寻址范围为00HFFH。 对于片外RAM,可以使用Ri,也可以使用DPTR做间址寄存器。两者区别在于后者寻址范围为0000HFFFFH,两

14、者都可以RAM和ROM。 3,间址方式的指令不能访问SFR中的单元。如下面的程序是错误的: MOV R1,#80H MOV A,R1 (因为80H为SFR的物理地址),MCS-51 片内 、片外 数据存储器示意图,特殊功能 寄存器 SFR,通用数据 存储器,80H 7FH,00H,FFH,片内数据存储器 片外数据存储器 256B个字节 64KB个字节,片外数据 存储器 64KB,0000H,FFFFH,注意: 1,访问片内RAM20H存储单元; MOV A,20H 2,访问片外RAM存储单元; MOV R0,#20H MOVX A,R0 3,尽管片内与片外的RAM单元 的00H-FFH地址相重

15、叠但由 于指令的不同不会发生地址 混乱。,返回,2.2.5 变址寻址,指令使用DPTR或PC中的内容作为基地址,再与累加器A的内容相加,其和作为操作数地址。如: MOVX A,A+PC ;PC内容与A的内容相加得操作数地址 并将此操作数送A MOVX A,A+DPTR;DPTR内容与A的内容相加得操作数 地址并将此操作数送A 使用变址指令时,要事先分别为A、DPTR赋值,以便获得操作数得地址。,变址指令只适用于对ROM存储器得访问,如查表等。 【举例】:已知ROM中0302H 单元有一个数x,现要把它送到累加器A中,试编程。 MOV DPTR,#0300H ;立即数送DPTR MOV A,#0

16、2H ;立即数送累加器A MOVC A,A+DPTR ;从ROM的00302单元取数送A,变址寻址示意图,02H,0300H,ALU,0302H,累加器A,DPTR,0300H + 02H 0302H,MOVC A,A+DPTR,返回,2.2.6 相对寻址,转移指令中使用的一种寻址方式。MCS-51单片机的指令系统中,有两类转移指令:相对转移( 2个或3个字节) 绝对转移(3个字节)。 在绝对转移指令中,指令直接给出转移的目标地址(2字节地址),执行时将目标地址直接送给PC,从而控制程序转移; 而相对转移指令在执行中是将PC值与指令中的8位偏移量进行相加,形成指令要转移的目标地址。 SJMP

17、rel 由指令中有一个8位偏移量 rel 为带符号位的补码,所以控制程序转移的范围为+127-128。,54H,2002H,ALU,2056H,累加器A,PC,2002H + 54H 2056H,操作码,偏移量,例如:SJMP 54H ;(80H、54H),2000H,2002H,(LOOP1),相对寻址使用中应注意的问题,与绝对寻址相比,相对寻址具有很好的“浮动性”,因此是编程人员普遍使用的一种寻址方式。 使用时,要注意3点: 1,CPU进行地址计算时,PC取值是执行本指令后的地址值。以上面的例子说明: 指令本身的首地址是2000H,执行完后变为2002H(既下一条指令的首地址)。 如果使用

18、三字节的相对转移指令,则PC=PC+3。,返回上一页,2,偏移量的计算: rel=目标地址-源地址-2 (2字节指令) 或: rel=目标地址-源地址-3 (3字节指令) 结果用补码的形式书写。 为了减少计算偏移量的计算,汇编程序允许使用“符号地址”的方式代替偏移量。如: SJMP loop1 汇编程序在翻译时,自动计算并将结果替换符号地址。 3, 如果转移地址的范围超过相对寻址的范围(如:-127+128)时,就要采用别的方式法,否则在编译时,提示出错。,返回,2.2.7 位寻址,在位寻址指令(位操作指令)中使用的位地址。 在一般的情况下,系统的数据都是按字节(8位)来存放、处理。 单片机在

19、控制、检测的应用中,系统的输入、输出数据有很多属于开关量信号。这些开关量信号以 bit - “位”的形式进行各种运算、处理和存储的。,MCS-51 单片机 控制、检测 系统,驱动器,电动机,外设1,外设2,状态信号,状态信号,控制信号,在MCS-51单片机的硬件设计上充分考虑了这种“布尔”变量的处理,不仅在指令系统中设计了“位操作”指令,而且在片内RAM区中还专门开辟了一个 “位寻址区”。这样,布尔变量可以向字节数据一样进行存储、寻址。 除了位寻址区外,RAM中的大多SFR都可以按位寻址,换句话,SFR除了有自己的字节地址外,在寄存器内的每一位还有其位地址。,【举例】:SETB 20H ;将位

20、地址为20H的位置一 SETB 90H ;将P1口的d0位置一 同字节寻址中的直接寻址一样,为了增加程序的可读性,凡在SFR中的位地址都可以使用符号地址来替代。如第二例中,完全可以使用下面的指令格式: MOV P1.0 ;将P0口的d0位置一 类似还有:MOV C,ACC.7 ;将累加器中的d7位送PSW的cy 这种指令在汇编程序进行翻译时,还是要先将符号地址转换为真正的位地址。,返回,2.3 数据传送指令,2.3.0 传送指令的特点 2.3.1 内部数据传送类指令 2.3.2 外部数据传送类指令 2.3.3 堆栈操作指令 2.3.4 数据交换指令,继续,数据传送是编程中使用最多、最主要的操作

21、。它的功能是将数据在累加器、片内的RAM、SFR及片外ROM、RAM之间进行传送。 在传送类指令中,必须指定被传送数据的源地址和目标地址。在传送过程中,源地址的内容不被改变。 传送类指令除了以累加器A为目标的传送对PSW的P有影响外,其余的传送类指令对PWS一概无影响。,【举例】:MOV A,R0 ;将R0寄存器中的数据送 累加器A中(注意寻址方式),指令通式:MOV ,2.3.0 传送指令的特点,返回,2.3.1 内部数据传送类指令,特点:指令的源操作数和目的操作数都在单片机内部。,1,立即寻址型传送指令,2,直接寻址型传送指令,3,寄存器寻址型传送指令,4,寄存器间址型传送指令,5,内部数

22、据传送类指令的使用,继续,1,立即寻址型传送指令,【特点】:原操作数字节是立即数,处在指令的第二或第三字节,所以这类指令都是多字节指令。这类指令有如下4条。 MOV A,#data ; A data (双字节指令) MOV Rn,#data ; Rn data (双字节指令) MOV Ri,#data ; (Ri) data (双字节指令) MOV direct,#data ; direct data (三字节指令) 这类指令多用于程序的初始化。如: MOV R0,#20H MOV A,#00H,立即寻址指令举例,已知:R0=20H,试问单片机执行如下指令后,累加器A、 R7、20H和21H单

23、元中的内容是什么。 MOV A,#18H ;立即数18H送累加器A MOV R7,#28H ;立即数28H送寄存器R7 MOV R0,#38H ;立即数38H送内存20H单元 MOV 21H,#48H ;立即数48H送内存21H单元,返回,2,直接寻址型传送指令,【特点】:指令中至少含有一个源操作数或目的操作数的地址。很明显,这也是2个或3个字节的指令格式,其中直接地址在第2或第3个字节上。这类指令有如下5条: MOV A,direct MOV direct,A MOV Rn,direct MOV Ri,direct MOV direct2,direct1 【注意】:direct为内部寄存器、

24、RAM和SFR的地址,换句话说:direct适用于片内所有的地址(寄存器、SFR和RAM)。,直接寻址指令举例,MOV A,30H ;内存RAM30h单元数据送A MOV 50H,A ;A中内容送RAM的50h单元 MOV R6,31H ;RAM的30h 内容送R6寄存器 MOV Ri,30H ;RAM30h内容送Ri指定的RAM单元 MOV P1,32H ;RAM32h内容送P1口(p1:符号地址) MOV 90H,32H ;(同上,试比较两种表示方法),返回,3,寄存器寻址型传送指令,指令中含有存放操作数的寄存器名Rn 其中(n0,1,2,3,4,5,6,7)。 共有如下三条: MOV A

25、,Rn MOV Rn,A MOV direct,Rn,返回,4,寄存器间接寻址型传送指令,指令特点:指令中Ri中存放的不是操作数本身,而是操作数在RAM中的地址(i=0、1)。 格式如下: MOV A,Ri MOV Ri,A MOV direct,Ri 【注意】;Ri中存放操作数的地址是有所选择的,只有非SFR的RAM单元才能使用这种寻址方式。,寄存器间接寻址指令举例,已知(40h)=11h,(41h)=22h,R0=40h和R1=41h。试问,下面的指令执行后,累加器A、40h、41h和42h单元中的内容是什么。 MOV A,R0 ;RAM40h单元内容11h送A MOV R1,A ;A中的

26、11h送RAM的41h单元 MOV 42H,R1 ;RAM的41h单元内容11h送 RAM42h中,返回,5,内部数据传送类指令的使用,1,在使用传送指令时,可以根据实际情况选用恰当寻址方式。上面给出的各种类型的传送指令是INTEL公司在设计MCS-51的硬件时就已经确定下来。编程人员只能像查字典一样去查找、使用。不能根据主观意愿去“创造”指令。 例如:要将R0中的数据传送到R1中。如何使用指令去完成上面的操作? mov r1,r0 是否可以?回答是否定的!因为在MCS-51的指令系统中没有此条指令!只能使用: 1,mov a,r0 或: 2, mov 01h,00h mov r1,a 因此,

27、必须从MCS-51的指令表中选择使用指令。,MCS-51内部数据传送类指令方式图,累加器A,direct 直接寻址,Ri间址,Rn寄存器,Data立即数,返回上一次,2,以累加器A为目的寄存器的传送指令会影响PSW中的 奇偶位P,而其余的指令对PSW均无影响。 3,要会正确地估计指令的字节。凡是指令中包含有立即 数、直接地址的指令,都应当在原有的基础上加1。 【举例】: mov a,Ri ( )个字节 mov a,direct ( )个字节 mov direct,data ( )个字节 mov direct2,direct1 ( )个字节,4,对于同一问题可以有不同的编程方法。使用不同的方法虽

28、然都可以实现题目的要求,但从指令长度、运行时间和可阅读性上等综合因素考虑,不同的方法就有合理和不合理、优化和繁杂之分。所以,在学习指令系统和编程时开始就要养成一个好的、合理的编程习惯。 5,注意给程序进行正确的注释,这对于阅读、编写和修改程序都是非常重要的。下面就是一些注释的例子: MOV A,30H ;(30h) A MOV A,R0 ; R0 A MOV 40H,30H ;(30h) 40h MOV A,Ri ; ( Ri ) A,内部传送类指令举例,试编出把30h和40h单元内容进行交换。 MOV A,30H ;(30h) A MOV 30H,40H ;(40h) 30h MOV 40H

29、,A ; A 40h,累加器A,30H,40H,返回,2.3.2 外部数据传送类指令,1,16位数传送指令,2,外部ROM的字节传送,3,外部RAM的字节传送指令,继续,1,16位数传送指令,MCS-51指令系统中唯一的一条16位数据传送类指令。 MOV DPTR,#data16 DPTR是单片机内部SFR中的两个寄存器DPH、DPL组合而成。其中DPH为高八位,DPL为低八位。 DPTR是一个专门用于访问外部存储器的间址寄存器。寻址能力为 64K (065535)。,返回,2,外部ROM的字节传送指令,这类指令有两条,都属于变址寻址指令。 MOVC A,A+DPTR ;A (A+DPTR)

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

31、2000h,累加器A中的内容恰好是查表的偏移量。首先将表的起始地址2000h送入DPTR中。 MOV DPTR,#2000H ;指针赋值 MOVC A,A+DPTR ;平方值送A,2000h,2009h,2008h,2007h,2006h,2005h,2004h,2003h,2002h,2001h,2,采用PC作基址寄存器: 与DPTR不同,使用PC作为基地址时,必须对累 加器A的数据进行修正,以保证a+pc恰好找到 待查的平方值地址。 ORG 1FFBH 1FFBH 74 data ADD A,#data ;data=02h 1FFDH 83H MOVC A,A+PC ;PC=1FFE 1F

32、FEH 80FEH SJMP $ 2000H 00H DB 0 ;平房表首址 2001H 01H DB 1 2002H 04H DB 4 2003H 09H DB 9 2004H 10H DB 16 2005H 19H DB 25 : : : 2009H 51H DB 81 END data为MOVC指令首地址与表头地址之间的单元数。,2000h,2009h,2008h,2007h,2006h,2005h,2004h,2003h,2002h,2001h,1FFFh,1FFEh,1FFDh,1FFCh,1FFBh,返回,3,外部RAM的字节传送指令,实现外部RAM和累加器A之间的数据传送。只有寄

33、存器间接寻址的指令。 MOVX A,Ri 使用Ri寄存器间址寻址范围0255h MOVX Ri,A 在硬件电路中P0口输出8位地址数据。 MOVX A,DPTR 使用DPTR间址,寻址范围065535h MOVX DPTR,A 在硬件电路中,使用P0口输出低8位, P2口输出高8位外部RAM地址。,外部RAM的字节传送指令举例,已知外部RAM的88H单元有一个数x,试编程将x送外部RAM的1818H单元。 【解】:外部RAM中的数据是不能直接传送的,因此必须使用两次 MOVX 指令完成此操作。 ORG 2000H MOV R0,#88H ;为8位指针赋值 MOV DPTR,#1818H ;为1

34、6位指针赋值 MOVX A,R0 ;取 x 到累加器A MOVX DPTR,A ;x 送RAM的1818h单元 SJMP $ ;停机 END,返回,2.3.3 堆栈操作指令,堆栈操作是一种特殊的数据传送指令。 堆栈:一个用来保存程序断点、数据的特殊的存储区域。在MCS-51单片机中,栈区是占用片内RAM的存储空间,具体栈位置由指针SP来确定(系统上电时,SP=07h)。 1,进栈操作: push direct ;sp+1sp,(direct)(sp) 2,出栈操作: pop direct ;(sp)(direct),sp -1sp 【注意】: 寻址方式为直接寻址,所以 push a 是错误的,

35、应当是push acc或push 0e0h,同理:push r0也是错误的。 进栈是堆栈向上“生长”的过程,即sp+1;出栈则相反。 系统上电时,sp=07h。SP的值可以根据需要进行修改,以适应具体编程的需要。在确定栈区位置时要考虑对数据区的影响,以避免数据区与栈区冲突。,堆栈操作指令举例(一),下面是一个BCD码转换为二进制的子程序BCDB中有关堆栈操作的例子。在这里,进栈操作是为了保护主程序中相关寄存器中的数据,因为子程序要使用这些寄存器。 org 0800h bcdb: push psw push acc push b : : pop b pop acc pop psw ret,SP,

36、堆栈操作指令举例(二),堆栈操作指令除了可以在子程序的设计中,对主程序的数据进行保护。还可以根据堆栈操作的特点完成一些特殊的操作。 【举例】:设片内RAM的30h单元存有x,40h单元存有y。试将两个单元内容互换。 push 30h push 40h pop 30h pop 40h,SP=07h,40h,30h,继续,2.3.4 数据交换指令,为提供一种方便的累加器和寄存器或RAM之间的数据交换。避免了使用一般mov 传送指令完成交换时的不便。 格式:xch a,Rn ;a Rn xch a,direct ;a (direct) xch a,Ri ;a (Ri) xchd a,Ri ;a30(

37、Ri)30 举例:已知,片外RAM20h单元、内部RAM20h单元分别有数x和y,试编程互将两数相交换。 mov R1,#20h ;指针赋初值 movx a,R1 ;xa xch a,R1 ;交换 a(20h),ya movx R1,a ;y(20h)片外RAM,数据交换指令举例(一),举例:已知,片外RAM20h单元、内部RAM20h单元分别有数x和y,试编程互将两数相交换。 mov R1,#20h ;指针赋初值 movx a,R1 ;xa xch a,R1 ;交换 a(20h),ya movx R1,a ;y(20h)片外RAM,(y) x,20h,20h,累加器A,1,2,3,数据交换指

38、令举例(二),已知RAM50h单元有一个09的数,试编程将它变成相应的ASCII码。 【解】:09的ASCII码是30h39h,两者相差30h。 方法一:对50h单元的数据高四位组装一个30h。 mov r0,#50h ;指针赋值 mov a,#30h ;30hA xchd a,r0 ; A30(r0)30,在A中组成ASCII码 mov r0,a ;A中的ASCII送回50h单元,50h,00110101,A=30h,交换后A=35h,1,2,继续,2.4 算逻运算和移位指令,功能:完成算术运算、逻辑运算和循环移位三大功能。 特点:大多指令都要由累加器A来存放一个源操作数,并把操作结果放回累

39、加器A中。,2.4.1: 算术运算指令,2.4.2: 逻辑运算指令,2.4.3: 移位指令,继续,2.4.1: 算术运算指令,不带进位的加法指令 ( ADD ) 1,加法指令: 带进位的加法指令 ( ADC ) 加1指令 ( INC ) (编程举例) 2,减法指令: 带进位的减法指令 ( SUBB ) 减1指令 ( DEC ) 3,十进制调整指令: ( DA A ) 4,乘法和除法指令: (MUL DIV),加法指令(一):不带进位的加法指令,格式: ADD A,Rn ;A+RnA ADD A,direct ;A+(direct)A ADD A,Ri ;A+(Ri)A ADD A,#data

40、;A+dataA 【注意】: 1,参加运算的数据都应当是8位的,结果也是8位并影响PSW。 2,根据编程者的需要,8位数据可以是无符号数(0255),也可以是有符号数(-127+128)。 3,不论编程者使用的数据是有符号数还是无符号数,CPU都将它们视为有符号数(补码)进行运算并影响PSW。,不带进位的加法指令举例(一),试分析执行下列指令后累加器A和PSW中各标志的变化。 MOV A,#19H Cy=0; ADD A,#66H AC=0 OV=CPCS=0 25 A= 0 0 0 1 1 0 0 1 B P=1 + 102 data= 0 1 1 0 0 1 1 0 B 127 0 0 1

41、 1 1 1 1 1 1 B 1,若两数都是无符号数,则因Cy=0无溢出,25+102=127。 2,若两个数是有符号数,则因OV=0无溢出。,cy,0 0 0 CP CS AC,不带进位的加法指令举例(二),试分析执行下列指令后累加器A和PSW中各标志的变化。 MOV A,#5AH Cy=0; ADD A,#6BH AC=0; OV=CPCS=1 90 A= 0 1 0 1 1 0 1 0 B P=0 + 107 data=0 1 1 0 1 0 1 1 B 197 0 1 1 0 0 0 1 0 1 B CP CS AC 1,若两数是无符号数,因Cy=0无溢出:90+107=197 2,若

42、两数是有符号数,因OV=1,故有溢出,两个正数相加后变为负数,很明显结果是不正确的。,加法指令(二):带进位的加法指令,格式: ADDC A,Rn ;A+Rn+CyA ADDC A,direct ;A+(direct) +CyA ADDC A,Ri ;A+(Ri) +CyA ADDC A,#data ;A+data+CyA 【注意】:这里的Cy是指令执行前的Cy; 对PSW的影响同ADD指令。,加1指令,格式: INC A ;累加器A加一 INC Rn ;Rn+1Rn INC direct ;内存单元数据加一 INC Ri ;内存单元数据加一 INC DPTR ;dptr+1dptr 【注意】

43、: 1,除了第一条对PSW的P有影响外,其余对PSW均无影响。 2,由于上面的原因,INC指令不能作为一般的数据算术运算 使用,INC主要用于修改数据指针等控制、循环语句中使用。,返回本节目录,编程举例,已知M1、M2单元中存有两个16位无符号数x1、x2(低位在前)。试写出x1+x2,并将结果放入M1、M1+1单元(低8位在M1单元)。设两数之和不会超过16位(65535)。 【 解】: MOV R0,#M1 ;x1指针赋初值 MOV R1,#M2 ;x2指针赋初值 MOV A,R0 ;取x1低8位送A ADD A,R1 ;x1与x2低8位相加 MOV R0,a ;低8位和送m1单元 INC

44、 R0 INC R1 ;修改指针 MOV A,R0 ;取x1的高8位送A ADDC A,R1 ;x1与x2的高8位和Cy相加 MOV R0,A ;结果送M1+1单元,M1,M1+1,M2,M2+1,返回本节目录,减法指令(带进位的减法指令),在MCS-51单片机的指令系统中,只有: 带进位的减法 SUBB 减一 DEC 两种指令。 1减法指令: 格式:SUBB A,Rn ;A Rn Cy A SUBB A,direct ;A (direct) Cy A SUBB A,Ri ;A (Ri) Cy A SUBB A,#data ;A data Cy A,使用减法指令要注意的几个问题,1,在单片机内

45、部,减法指令实际上是采用补码的加法实现的。但要判定减法结果编程者可以按二进制减法法则验证。 2,无论相减两数是无符号数还是有符号数,减法操作总是按有符号数来处理、影响PSW中相关的标志(详见举例)。 3,在MCS-51的指令系统中没有不带Cy的减法,所以在使用SUBB指令前必须使用一条清除Cy的指令:CLR C。,减法指令应用举例,试分析执行下列指令后累加器A和PSW中各标志的变化。 CLR C MOV A,#52H 01010010B = 82 SUBB A,#0B4H 10110100B = - 76 82 a= 0 1 0 1 0 0 1 0 -76 data= 1 0 1 1 0 1

46、0 0 158 1 1 0 0 1 1 1 1 0 =-62H= -98 手工计算 CP CS AC 1 0 1 【分析】:CPU的计算得-98,很明显答案是错误的。原因是OV=1,既产生了溢出。所以,对于符号数的减法在运算后一定要检测OV=1?,返回本节目录,减一指令,格式: DEC A ;累加器A减一 DEC Rn ;Rn-1Rn DEC direct ;内存单元数据减一 DEC Ri ;内存单元数据减一 【注意】: 1,除了第一条对PSW的P有影响外,其余对PSW均无影响。 2,由于上面的原因,DEC指令一般不作为数据算术运算使用(因为不能对PSW的OV等位产生影响,它主要用于修改数据指针在控制、循环语句中使用)。,返回本节目录,十进制调整指令,在CPU进行BCD码运算时,必须在运算后进行十进制调整,这是因为,CPU在运算时,并不知道数据是二进制还是BCD码。 格式:DA A ;若AC=1或A30 9,则A+06hA ;若Cy =1或A74 9,则A+60hA 【注意】:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1