收藏 分享(赏)

51单片机汇编语言指令教程汇集.ppt

上传人:scg750829 文档编号:4242627 上传时间:2018-12-18 格式:PPT 页数:120 大小:453KB
下载 相关 举报
51单片机汇编语言指令教程汇集.ppt_第1页
第1页 / 共120页
51单片机汇编语言指令教程汇集.ppt_第2页
第2页 / 共120页
51单片机汇编语言指令教程汇集.ppt_第3页
第3页 / 共120页
51单片机汇编语言指令教程汇集.ppt_第4页
第4页 / 共120页
51单片机汇编语言指令教程汇集.ppt_第5页
第5页 / 共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,#0FFHADD A,R0,返回,指令的表示形式是识别指令的标志。1,二进制的表示

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

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

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

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

6、,算术运算指令:用于操作数之间的加、减、乘除运算。 【特点】:多数情况下:操作数之一在累加器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中时,将此寄存器名Rn直接写在指令的操作数的位置上。如:MOV A,R7 ;将寄存

8、器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位地址。既指令直接给出了操作数的地址。如:MOV A,30H ;将RAM30H单元内容送

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

10、赋初值尽管使用SFR的寄存器名称来取代直接地址,可以带来程序的可读性,但是在汇编时,仍要将寄存器名字转换为直接地址。,2,当直接地址时在工作寄存器区中时,可以使用两种寻址方式来访问。 如:MOV A,00H ;将RAM中00H单元数据送累加器AMOV A,R0 ;将工作寄存器R0的内容送累加器A这里使用了不同的寻址方式,其指令的结构也不相同。前者是:11100101(0E5H)、00000000(00H) 双字节。后者的机器码是:11101000(0E8H) 单字节;在物理结构上,R0与RAM的00H单元恰好是同一单元,所以不同的指令而执行结果是一样的。类似的还有累加器A: INC A 寄存器

11、寻址方式(单字节);INC ACC 直接寻址方式(双字节);INC 0E0H 直接寻址方式(双字节)。,3,在指令系统中:字节地址与位地址是完全不同的概念。前者用direct表示,而后者用bit 表示,但在指令中都是用16进制表示的数。如:MOV A,20H ;将RAM的20H单元内容送AMOV C,20H ;将位寻址区中的位地址为20H位内容送PSW 中的Cy中。,片内 RAM(20H-2FH)中的位寻址区结构图,2FH,20H,字节地址,返回,24H,位地址,返回前一次,2.2.3立即寻址,指令本身直接含有所需要的8位或16位的操作数。将此数称为“立即数”(使用#标明)。如:MOV A,#

12、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首先根据指令中寄存器名Ri找到操作数地址,然后再从该地址中找到操作数 x。如:MOV R0,#30H ;立即数送R0寄存器MOV A,R0 ;从RAM的

13、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,两者都可以RAM和ROM。3,间址方式的指令不能访问SFR中的单元。如下面的程序是错误的:MOV R1,#80HMOV A,R1 (因为80H为SFR的物

14、理地址),MCS-51 片内 、片外 数据存储器示意图,特殊功能 寄存器 SFR,通用数据 存储器,80H 7FH,00H,FFH,片内数据存储器 片外数据存储器 256B个字节 64KB个字节,片外数据 存储器 64KB,0000H,FFFFH,注意:1,访问片内RAM20H存储单元; MOV A,20H2,访问片外RAM存储单元; MOV R0,#20H MOVX A,R03,尽管片内与片外的RAM单元 的00H-FFH地址相重叠但由 于指令的不同不会发生地址 混乱。,返回,2.2.5 变址寻址,指令使用DPTR或PC中的内容作为基地址,再与累加器A的内容相加,其和作为操作数地址。如:MO

15、VX A,A+PC ;PC内容与A的内容相加得操作数地址并将此操作数送AMOVX A,A+DPTR;DPTR内容与A的内容相加得操作数地址并将此操作数送A使用变址指令时,要事先分别为A、DPTR赋值,以便获得操作数得地址。,变址指令只适用于对ROM存储器得访问,如查表等。【举例】:已知ROM中0302H 单元有一个数x,现要把它送到累加器A中,试编程。MOV DPTR,#0300H ;立即数送DPTRMOV A,#02H ;立即数送累加器AMOVC A,A+DPTR ;从ROM的00302单元取数送A,变址寻址示意图,02H,0300H,ALU,0302H,累加器A,DPTR,0300H +

16、02H 0302H,MOVC A,A+DPTR,返回,2.2.6 相对寻址,转移指令中使用的一种寻址方式。MCS-51单片机的指令系统中,有两类转移指令:相对转移( 2个或3个字节)绝对转移(3个字节)。在绝对转移指令中,指令直接给出转移的目标地址(2字节地址),执行时将目标地址直接送给PC,从而控制程序转移;而相对转移指令在执行中是将PC值与指令中的8位偏移量进行相加,形成指令要转移的目标地址。SJMP rel 由指令中有一个8位偏移量 rel 为带符号位的补码,所以控制程序转移的范围为+127-128。,54H,2002H,ALU,2056H,累加器A,PC,2002H + 54H 205

17、6H,操作码,偏移量,例如:SJMP 54H ;(80H、54H),2000H,2002H,(LOOP1),相对寻址使用中应注意的问题,与绝对寻址相比,相对寻址具有很好的“浮动性”,因此是编程人员普遍使用的一种寻址方式。使用时,要注意3点:1,CPU进行地址计算时,PC取值是执行本指令后的地址值。以上面的例子说明:指令本身的首地址是2000H,执行完后变为2002H(既下一条指令的首地址)。如果使用三字节的相对转移指令,则PC=PC+3。,返回上一页,2,偏移量的计算:rel=目标地址-源地址-2 (2字节指令)或: rel=目标地址-源地址-3 (3字节指令)结果用补码的形式书写。为了减少计

18、算偏移量的计算,汇编程序允许使用“符号地址”的方式代替偏移量。如:SJMP loop1 汇编程序在翻译时,自动计算并将结果替换符号地址。3, 如果转移地址的范围超过相对寻址的范围(如:-127+128)时,就要采用别的方式法,否则在编译时,提示出错。,返回,2.2.7 位寻址,在位寻址指令(位操作指令)中使用的位地址。在一般的情况下,系统的数据都是按字节(8位)来存放、处理。单片机在控制、检测的应用中,系统的输入、输出数据有很多属于开关量信号。这些开关量信号以 bit - “位”的形式进行各种运算、处理和存储的。,MCS-51 单片机 控制、检测 系统,驱动器,电动机,外设1,外设2,状态信号

19、,状态信号,控制信号,在MCS-51单片机的硬件设计上充分考虑了这种“布尔”变量的处理,不仅在指令系统中设计了“位操作”指令,而且在片内RAM区中还专门开辟了一个 “位寻址区”。这样,布尔变量可以向字节数据一样进行存储、寻址。除了位寻址区外,RAM中的大多SFR都可以按位寻址,换句话,SFR除了有自己的字节地址外,在寄存器内的每一位还有其位地址。,【举例】:SETB 20H ;将位地址为20H的位置一SETB 90H ;将P1口的d0位置一同字节寻址中的直接寻址一样,为了增加程序的可读性,凡在SFR中的位地址都可以使用符号地址来替代。如第二例中,完全可以使用下面的指令格式:MOV P1.0 ;

20、将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 数据交换指令,继续,数据传送是编程中使用最多、最主要的操作。它的功能是将数据在累加器、片内的RAM、SFR及片外ROM、RAM之间进行传送。 在传送类指令中,必须指定被传送数据的源地址和目标地址。在传送过程中,源地址的内容不被改变。 传送类指令除了以累加器A为目标的传送对PSW的P有

21、影响外,其余的传送类指令对PWS一概无影响。,【举例】:MOV A,R0 ;将R0寄存器中的数据送累加器A中(注意寻址方式),指令通式:MOV ,2.3.0 传送指令的特点,返回,2.3.1 内部数据传送类指令,特点:指令的源操作数和目的操作数都在单片机内部。,1,立即寻址型传送指令,2,直接寻址型传送指令,3,寄存器寻址型传送指令,4,寄存器间址型传送指令,5,内部数据传送类指令的使用,继续,1,立即寻址型传送指令,【特点】:原操作数字节是立即数,处在指令的第二或第三字节,所以这类指令都是多字节指令。这类指令有如下4条。MOV A,#data ; A data (双字节指令) MOV Rn,

22、#data ; Rn data (双字节指令) MOV Ri,#data ; (Ri) data (双字节指令) MOV direct,#data ; direct data (三字节指令)这类指令多用于程序的初始化。如:MOV R0,#20HMOV A,#00H,立即寻址指令举例,已知:R0=20H,试问单片机执行如下指令后,累加器A、R7、20H和21H单元中的内容是什么。MOV A,#18H ;立即数18H送累加器AMOV R7,#28H ;立即数28H送寄存器R7MOV R0,#38H ;立即数38H送内存20H单元MOV 21H,#48H ;立即数48H送内存21H单元,返回,2,直

23、接寻址型传送指令,【特点】:指令中至少含有一个源操作数或目的操作数的地址。很明显,这也是2个或3个字节的指令格式,其中直接地址在第2或第3个字节上。这类指令有如下5条:MOV A,directMOV direct,AMOV Rn,directMOV Ri,directMOV direct2,direct1【注意】:direct为内部寄存器、RAM和SFR的地址,换句话说:direct适用于片内所有的地址(寄存器、SFR和RAM)。,直接寻址指令举例,MOV A,30H ;内存RAM30h单元数据送AMOV 50H,A ;A中内容送RAM的50h单元MOV R6,31H ;RAM的30h 内容送

24、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,RnMOV Rn,AMOV direct,Rn,返回,4,寄存器间接寻址型传送指令,指令特点:指令中Ri中存放的不是操作数本身,而是操作数在RAM中的地址(i=0、1)。格式如下:MOV A,RiMOV Ri,AMOV direct,Ri【注意】;Ri中存放操作数的地址是

25、有所选择的,只有非SFR的RAM单元才能使用这种寻址方式。,寄存器间接寻址指令举例,已知(40h)=11h,(41h)=22h,R0=40h和R1=41h。试问,下面的指令执行后,累加器A、40h、41h和42h单元中的内容是什么。MOV A,R0 ;RAM40h单元内容11h送AMOV R1,A ;A中的11h送RAM的41h单元MOV 42H,R1 ;RAM的41h单元内容11h送 RAM42h中,返回,5,内部数据传送类指令的使用,1,在使用传送指令时,可以根据实际情况选用恰当寻址方式。上面给出的各种类型的传送指令是INTEL公司在设计MCS-51的硬件时就已经确定下来。编程人员只能像查

26、字典一样去查找、使用。不能根据主观意愿去“创造”指令。例如:要将R0中的数据传送到R1中。如何使用指令去完成上面的操作?mov r1,r0 是否可以?回答是否定的!因为在MCS-51的指令系统中没有此条指令!只能使用:1,mov a,r0 或: 2, mov 01h,00hmov r1,a因此,必须从MCS-51的指令表中选择使用指令。,MCS-51内部数据传送类指令方式图,累加器A,direct 直接寻址,Ri间址,Rn寄存器,Data立即数,返回上一次,2,以累加器A为目的寄存器的传送指令会影响PSW中的奇偶位P,而其余的指令对PSW均无影响。3,要会正确地估计指令的字节。凡是指令中包含有

27、立即数、直接地址的指令,都应当在原有的基础上加1。【举例】: mov a,Ri ( )个字节mov a,direct ( )个字节mov direct,data ( )个字节mov direct2,direct1 ( )个字节,4,对于同一问题可以有不同的编程方法。使用不同的方法虽然都可以实现题目的要求,但从指令长度、运行时间和可阅读性上等综合因素考虑,不同的方法就有合理和不合理、优化和繁杂之分。所以,在学习指令系统和编程时开始就要养成一个好的、合理的编程习惯。5,注意给程序进行正确的注释,这对于阅读、编写和修改程序都是非常重要的。下面就是一些注释的例子:MOV A,30H ;(30h) AM

28、OV A,R0 ; R0 AMOV 40H,30H ;(30h) 40hMOV A,Ri ; ( Ri ) A,内部传送类指令举例,试编出把30h和40h单元内容进行交换。MOV A,30H ;(30h) AMOV 30H,40H ;(40h) 30h MOV 40H,A ; A 40h,累加器A,30H,40H,返回,2.3.2 外部数据传送类指令,1,16位数传送指令,2,外部ROM的字节传送,3,外部RAM的字节传送指令,继续,1,16位数传送指令,MCS-51指令系统中唯一的一条16位数据传送类指令。MOV DPTR,#data16DPTR是单片机内部SFR中的两个寄存器DPH、DPL

29、组合而成。其中DPH为高八位,DPL为低八位。DPTR是一个专门用于访问外部存储器的间址寄存器。寻址能力为 64K (065535)。,返回,2,外部ROM的字节传送指令,这类指令有两条,都属于变址寻址指令。MOVC A,A+DPTR ;A (A+DPTR)MOVC A,A+PC ;PC PC+1, A (A+PC) 该指令也称为“查表”指令。在ROM中建立一个数据表,可以使用DPTR、PC作为数据表格的基地址。在第一条指令中:用DPTR作为基地址。使用前,先将数据表的首地址送入DPTR中,累加器A作为偏移量。由两者数据相加得到待查的表中数据地址并取出。第二条指令是以程序计数器PC为基地址。由

30、于PC的内容与该指令在ROM中的位置有关,所以一旦该指令在程序中的位置确定,其PC的值也就确定。,外部ROM的字节传送指令举例,已知累加器A中存有09范围内的数,试用查表指令编写出查找出该数平方的程序。 1,采用DPTR作基址寄存器:设平方表的首地址为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

31、作为基地址时,必须对累 加器A的数据进行修正,以保证a+pc恰好找到 待查的平方值地址。ORG 1FFBH 1FFBH 74 data ADD A,#data ;data=02h 1FFDH 83H MOVC A,A+PC ;PC=1FFE 1FFEH 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 81END data为MOVC指令首地址与表头地址之间的单元数。,2000h,2009

32、h,2008h,2007h,2006h,2005h,2004h,2003h,2002h,2001h,1FFFh,1FFEh,1FFDh,1FFCh,1FFBh,返回,3,外部RAM的字节传送指令,实现外部RAM和累加器A之间的数据传送。只有寄存器间接寻址的指令。MOVX A,Ri 使用Ri寄存器间址寻址范围0255hMOVX Ri,A 在硬件电路中P0口输出8位地址数据。MOVX A,DPTR 使用DPTR间址,寻址范围065535h MOVX DPTR,A 在硬件电路中,使用P0口输出低8位,P2口输出高8位外部RAM地址。,外部RAM的字节传送指令举例,已知外部RAM的88H单元有一个数x

33、,试编程将x送外部RAM的1818H单元。 【解】:外部RAM中的数据是不能直接传送的,因此必须使用两次 MOVX 指令完成此操作。ORG 2000H MOV R0,#88H ;为8位指针赋值MOV DPTR,#1818H ;为16位指针赋值MOVX A,R0 ;取 x 到累加器AMOVX DPTR,A ;x 送RAM的1818h单元SJMP $ ;停机END,返回,2.3.3 堆栈操作指令,堆栈操作是一种特殊的数据传送指令。 堆栈:一个用来保存程序断点、数据的特殊的存储区域。在MCS-51单片机中,栈区是占用片内RAM的存储空间,具体栈位置由指针SP来确定(系统上电时,SP=07h)。1,进

34、栈操作: push direct ;sp+1sp,(direct)(sp)2,出栈操作: pop direct ;(sp)(direct),sp -1sp 【注意】: 寻址方式为直接寻址,所以 push a 是错误的,应当是push acc或push 0e0h,同理:push r0也是错误的。 进栈是堆栈向上“生长”的过程,即sp+1;出栈则相反。 系统上电时,sp=07h。SP的值可以根据需要进行修改,以适应具体编程的需要。在确定栈区位置时要考虑对数据区的影响,以避免数据区与栈区冲突。,堆栈操作指令举例(一),下面是一个BCD码转换为二进制的子程序BCDB中有关堆栈操作的例子。在这里,进栈操

35、作是为了保护主程序中相关寄存器中的数据,因为子程序要使用这些寄存器。org 0800hbcdb: push pswpush accpush b:pop bpop accpop pswret,SP,堆栈操作指令举例(二),堆栈操作指令除了可以在子程序的设计中,对主程序的数据进行保护。还可以根据堆栈操作的特点完成一些特殊的操作。 【举例】:设片内RAM的30h单元存有x,40h单元存有y。试将两个单元内容互换。push 30hpush 40hpop 30hpop 40h,SP=07h,40h,30h,继续,2.3.4 数据交换指令,为提供一种方便的累加器和寄存器或RAM之间的数据交换。避免了使用一

36、般mov 传送指令完成交换时的不便。 格式:xch a,Rn ;a Rnxch a,direct ;a (direct)xch a,Ri ;a (Ri)xchd a,Ri ;a30(Ri)30 举例:已知,片外RAM20h单元、内部RAM20h单元分别有数x和y,试编程互将两数相交换。mov R1,#20h ;指针赋初值movx a,R1 ;xaxch a,R1 ;交换 a(20h),yamovx R1,a ;y(20h)片外RAM,数据交换指令举例(一),举例:已知,片外RAM20h单元、内部RAM20h单元分别有数x和y,试编程互将两数相交换。mov R1,#20h ;指针赋初值movx

37、a,R1 ;xaxch a,R1 ;交换 a(20h),yamovx R1,a ;y(20h)片外RAM,(y) x,20h,20h,累加器A,1,2,3,数据交换指令举例(二),已知RAM50h单元有一个09的数,试编程将它变成相应的ASCII码。【解】:09的ASCII码是30h39h,两者相差30h。方法一:对50h单元的数据高四位组装一个30h。 mov r0,#50h ;指针赋值mov a,#30h ;30hAxchd a,r0 ; A30(r0)30,在A中组成ASCII码mov r0,a ;A中的ASCII送回50h单元,50h,00110101,A=30h,交换后A=35h,1

38、,2,继续,2.4 算逻运算和移位指令,功能:完成算术运算、逻辑运算和循环移位三大功能。 特点:大多指令都要由累加器A来存放一个源操作数,并把操作结果放回累加器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),加法指令(一):不带进位的加法指令,格式:

39、 ADD A,Rn ;A+RnAADD A,direct ;A+(direct)AADD A,Ri ;A+(Ri)AADD A,#data ;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=02

40、5 A= 0 0 0 1 1 0 0 1 B P=1 + 102 data= 0 1 1 0 0 1 1 0 B127 0 0 1 1 1 1 1 1 1 B1,若两数都是无符号数,则因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=190 A= 0 1 0 1 1 0 1 0 B P=0+ 107 data=0 1 1 0 1 0 1 1 B197 0 1 1

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

42、元数据加一INC Ri ;内存单元数据加一INC DPTR ;dptr+1dptr 【注意】: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

43、ADD A,R1 ;x1与x2低8位相加 MOV R0,a ;低8位和送m1单元 INC 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 ASUBB A,Ri ;A (Ri) Cy ASUBB A,#d

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

45、 0 1 0 0 1 0 -76 data= 1 0 1 1 0 1 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-1RnDEC direct ;内存单元数据减一DEC Ri ;内存单元数据减一【注意】:1,除了第一条对PSW的P有影响外,其余对PSW均无影响。2,由于上面的原因,DEC指令一般不作为数据算术运算使用(

46、因为不能对PSW的OV等位产生影响,它主要用于修改数据指针在控制、循环语句中使用)。,返回本节目录,十进制调整指令,在CPU进行BCD码运算时,必须在运算后进行十进制调整,这是因为,CPU在运算时,并不知道数据是二进制还是BCD码。格式:DA A ;若AC=1或A30 9,则A+06hA;若Cy =1或A74 9,则A+60hA【注意】: 1,DA A指令必须紧跟在加法指令之后; 2,DA A指令只适用于加法指令的调整。,十进制调整指令应用举例(一),1,BCD加法运算:试写出完成85+59的BCD码的加法程序。MOV A,#85HADD A,#59HDA ASJMP $85 a= 1 0 0 0 0 1 0 1B + 59 dtat= 0 1 0 1 1 0 0 1B 144 1 1 0 1 1 1 1 0B 低4位9,所以加06h+ 0 0 0 0 0 1 1 0B1 1 1 0 0 1 0 0B 高4位9,所以加60h0 1 1 0 0 0 0 0B1 0 1 0 0 0 1 0 0B 结果为144h(1包含在Cy)【注意】: 144H是用16进制数来表示十进制,既BCD码。,

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

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报