MCS51单片机指令系统教程

上传人:cl****1 文档编号:587422473 上传时间:2024-09-05 格式:PPT 页数:120 大小:675.05KB
返回 下载 相关 举报
MCS51单片机指令系统教程_第1页
第1页 / 共120页
MCS51单片机指令系统教程_第2页
第2页 / 共120页
MCS51单片机指令系统教程_第3页
第3页 / 共120页
MCS51单片机指令系统教程_第4页
第4页 / 共120页
MCS51单片机指令系统教程_第5页
第5页 / 共120页
点击查看更多>>
资源描述

《MCS51单片机指令系统教程》由会员分享,可在线阅读,更多相关《MCS51单片机指令系统教程(120页珍藏版)》请在金锄头文库上搜索。

1、 MCS-51单片机指令系统2.1 概述2.2 寻址方式 2.3 数据传送指令2.4 算逻运算和移位指令2.5 控制转移和位操作指令2.1:MCS-51指令系统的概述 MCS-51MCS-51共有共有111111条指令,指令的长度和执行时条指令,指令的长度和执行时间因不同的指令而各不相同。间因不同的指令而各不相同。2.1.1 2.1.1 指令格式指令格式2.1.22.1.2 指令的三种表示形式指令的三种表示形式2.1.3 2.1.3 指令的字节数指令的字节数2.1.42.1.4 指令的分类指令的分类继续2.1.1 指令格式:指令格式:既指令的结构形式。指令格式:既指令的结构形式。OPOPDAT

2、ADATA 或或 ADDRESSADDRESS操作码操作码操作数或操作数地址操作数或操作数地址由操作码和操作数(或操作数地址)构成指令的结构。举例:MOV A,#0FFH ADD A,R0返回指令的表示形式是识别指令的标志。指令的表示形式是识别指令的标志。1 1,二进制的表示形式:,二进制的表示形式:(以(以“ “累加器的内容累加器的内容+08H+08H” ”为例)为例) 00100100B 00100100B 操作码操作码 OP OP (加法)(加法) 00001000B 00001000B 操作数操作数DATADATA(08H08H)特点:特点: 能被能被CPUCPU直接识别、运行的形式。

3、也称机器码、汇编语直接识别、运行的形式。也称机器码、汇编语 言的目标代码。言的目标代码。缺点:缺点:不便于阅读、记忆和调试修改。不便于阅读、记忆和调试修改。2.1.2 指令的三种表示形式:2 2,十六进制表示方式:,十六进制表示方式: 它是对二进制形式的一种简化。它是对二进制形式的一种简化。 00100100B 00100100B 24H24H 00001000B 00001000B 08H08H 在实验室等少数环境下,可以将这种形式作为输入程序在实验室等少数环境下,可以将这种形式作为输入程序的一种辅助手段。但是,这种形式的指令格式必须由对应的一种辅助手段。但是,这种形式的指令格式必须由对应的

4、监控程序把它们翻译成二进制的的监控程序把它们翻译成二进制的“ “机器码机器码” ”后存入程序后存入程序存储器并运行。存储器并运行。二进制表示的形式 十六进制表示的形式3 3,指令的,指令的“助记符助记符”方式(也称方式(也称“汇编格式汇编格式”):): 00100100B00100100B 24H24H 00001000B 00001000B 08H 08H ADD AADD A,#08H#08H 1 1,这是一种由,这是一种由英文单词英文单词或或字母字母、数字数字来表征指令功能的来表征指令功能的 形式。是一种便于阅读、书写和交流的表示形式。形式。是一种便于阅读、书写和交流的表示形式。 2 2

5、,这种,这种 “ “汇编汇编” ”格式的指令必须把它格式的指令必须把它“ “翻译翻译” ”为二进制为二进制形式形式 “ “机器码机器码” ”后才能为后才能为CPUCPU所识别和执行。所识别和执行。 3 3,三种不同的表示方法适用于不同的场合。,三种不同的表示方法适用于不同的场合。 本章内容都以汇编的形式介绍指令系统。本章内容都以汇编的形式介绍指令系统。二进制表示形式 十六进制表示 汇编格式返回2.1.3 指令的字节数 在在MCS-51MCS-51单片机的指令系统中,因指令操作码和操作单片机的指令系统中,因指令操作码和操作数的不同,指令(在存储器中)长度也各不相同。数的不同,指令(在存储器中)长

6、度也各不相同。 分为单字节、双字节和三字节。分为单字节、双字节和三字节。单字节指令(单字节指令(4949条)条):分分无操作数无操作数、有操作数有操作数两种。两种。 无操作数:无操作数:如如 INC DPTR 10100011BINC DPTR 10100011B INC A 00000100B INC A 00000100B 【特点特点】:操作数隐含在操作码中。:操作数隐含在操作码中。 含有含有操作数寄存器名称操作数寄存器名称的单字节指令:的单字节指令: 如:如:MOV AMOV A,R0 11101R0 11101000000B B MOV AMOV A,R1R1 111011110100

7、1001B B 【特点特点】:寄存器名以三位数代码的形式在指令的后三位。:寄存器名以三位数代码的形式在指令的后三位。双字节指令(双字节指令(4646条):条): 指令的操作码和操作数各占一个字节。指令的操作码和操作数各占一个字节。 如:如: MOV MOV A,#dataA,#data 01110100B data 01110100B data 很明显:很明显:8 8位的操作数本身占据一个字节。位的操作数本身占据一个字节。程序存储器程序存储器0111010001110100datadatann+1movmov a,#dataa,#data双字节指令在程序存储器的存放示意图三字节指令(三字节指令

8、(1616条):条): 指令中的操作数为双字节。如:指令中的操作数为双字节。如: MOV DPTR,#data16MOV DPTR,#data16 1001000B,data15-8,data7-01001000B,data15-8,data7-0 或者:指令中分别包含或者:指令中分别包含1 1个字节的操作数和个字节的操作数和1 1个字节的操作个字节的操作数地址。如:数地址。如: MOV MOV direct,#datadirect,#data 举例:举例:MOV 20H,#0FFHMOV 20H,#0FFH 1001000010010000data15-8data15-8data8-0dat

9、a8-0MOV dptr,#data16OP (75H)OP (75H)direct (20H)direct (20H)data (FFH)data (FFH)MOV direct,#data三字节指令在存储器中存放的方式示意图指令的字节数与指令的运行时间指令的字节多是否意味着指令周期就长?指令的字节多是否意味着指令周期就长?指指 令令字节数字节数周期数周期数指令说明指令说明 MOV AMOV A,R0R01 11 1R0R0内容送累加器内容送累加器A AMOVMOV A A,#0FFH#0FFH2 21 1立即数立即数FFHFFH送送A AMOVMOV 20H20H,#30H#30H3 32

10、 2立即数立即数30H30H送内存送内存20h20h单元单元MULMUL ABAB1 14 4乘法指令乘法指令INCINC DPTRDPTR1 11 11616位寄存器位寄存器DPTRDPTR加一加一从表中可见,指令的字节数与指令周期不是对等的关系返回2.1.4 指令的分类 MCS-51MCS-51单片机的指令如果按功能划分可以分为五类:单片机的指令如果按功能划分可以分为五类:1,1,数据传送类指令:数据传送类指令:完成数据在单片机内部之间的传送。完成数据在单片机内部之间的传送。 分为分为8 8位数和位数和1616位两种。除了奇偶位外,指令的执行对位两种。除了奇偶位外,指令的执行对 PSWPS

11、W无影响。无影响。2,2,算术运算指令:算术运算指令:用于操作数之间的加、减、乘除运算。用于操作数之间的加、减、乘除运算。 【特点特点】:多数情况下:操作数之一在累加器:多数情况下:操作数之一在累加器A A中,结果中,结果也保留在也保留在A A中,运算结果要影响中,运算结果要影响PSWPSW(进位标志、奇偶和(进位标志、奇偶和溢出标志等)。溢出标志等)。3,3,逻辑操作逻辑操作和和循环移位指令:循环移位指令:操作数之间的逻辑加、逻辑操作数之间的逻辑加、逻辑与、取反和异或等操作。多数情况下一个操作数在与、取反和异或等操作。多数情况下一个操作数在A A中,中,结果也存于结果也存于A A。移位指令分

12、为左移、右移和带进位和不带。移位指令分为左移、右移和带进位和不带进位几种情况。与算术类指令相比逻辑类指令基本不影响进位几种情况。与算术类指令相比逻辑类指令基本不影响PSWPSW的内容。的内容。4,4,控制转移类指令:控制转移类指令:条件转移、无条件转移,调用和返回。条件转移、无条件转移,调用和返回。 【 特点特点】:通过修改程序指针:通过修改程序指针PCPC的内容,使的内容,使CPUCPU转到另一转到另一处执行,从而改变程序的流向。处执行,从而改变程序的流向。5 5,位操作指令:,位操作指令:位传送、位置位、位运算和位控制转移等位传送、位置位、位运算和位控制转移等操作。操作。 【 特点特点】:

13、按位操作而不是按字节的操作。位控转移的判:按位操作而不是按字节的操作。位控转移的判断不是检测某一个字节而是对某一个位进行检测并决定是断不是检测某一个字节而是对某一个位进行检测并决定是否进行程序转移。否进行程序转移。 这类指令基本不影响这类指令基本不影响PSWPSW的内容。的内容。返回2.2 寻址方式在指令的操作数位置上,用于在指令的操作数位置上,用于表征、寻找操作数的方式表征、寻找操作数的方式定义定义为为“ “寻址方式寻址方式” ”。正确的理解、掌握寻址方式,是学习、使用指令的关键正确的理解、掌握寻址方式,是学习、使用指令的关键。在在MCS-51MCS-51单片机中,共使用了七种寻址方式。单片

14、机中,共使用了七种寻址方式。 它们分别是:它们分别是: 1,1,寄存器寻址寄存器寻址 5,5,变址寻址变址寻址; 2,2,直接寻址直接寻址 6,6,相对寻址相对寻址; 3,3,立即数立即数寻址寻址 7,7,位寻址位寻址。 4,4,寄存器间接寻址寄存器间接寻址 继续2.2.1寄存器寻址当所需要的当所需要的操作数操作数在内部某一个寄存器在内部某一个寄存器RnRn中时,将此寄存器中时,将此寄存器名名RnRn直接写在指令的操作数的位置上。如:直接写在指令的操作数的位置上。如: MOV A,MOV A,R7 R7 ;将寄存器;将寄存器R7R7中的内容送累加器中的内容送累加器A A中。中。 MOV MOV

15、 20H,20H,R0R0 ;将寄存器;将寄存器R0R0中的数据送内存中的数据送内存20H20H单元单元 INCINC R1 R1 ;将寄存器;将寄存器R1R1中的内容加一中的内容加一 ADD A,ADD A,R3 R3 ;A A的内容与寄存器的内容与寄存器R3R3的内容相加送的内容相加送A A 寄存器寻址方式的指令大多是单字节指令。指令本身并不带寄存器寻址方式的指令大多是单字节指令。指令本身并不带有操数,而是含有存放操作数的有操数,而是含有存放操作数的寄存器的寄存器的3 3位代码。位代码。以以MOV MOV A,RnA,Rn为例,使用为例,使用R7R7寄存器,所以寄存器,所以rrrrrr=1

16、11,=111,既指令的机器码为:既指令的机器码为:0EFH0EFH1 1 1 0 1 r r r操作码寄存器代码返回E8HEFHMOV A,RnMOV A,Rn2.2.2 直接寻址指令本身含有操作数的指令本身含有操作数的8 8位或位或1616位地址。既指令位地址。既指令直接直接给给出了操作数的地址。如:出了操作数的地址。如: MOV A,MOV A,30H30H ; ;将将RAM30HRAM30H单元内容送累加器单元内容送累加器 这里这里30H30H是操作数在是操作数在RAMRAM中的地址。中的地址。很明显,直接寻址的指令长度是两个或三个字节。很明显,直接寻址的指令长度是两个或三个字节。程序

17、程序ROMROMOPOP30H30H数据数据RAMRAM操作数操作数x xnn+130H累加器A直接寻址示意图使用直接寻址应注意的三个问题:1,1,指令助记符中指令助记符中directdirect是用是用1616进制数表示的操作数地址。进制数表示的操作数地址。 当地址恰好在当地址恰好在SFRSFR区域时区域时, ,指令也可以用寄存器名来表示。指令也可以用寄存器名来表示。 如:如: MOVMOV A,80HA,80H 可以写成可以写成 MOVMOV A,P0A,P0 后者用后者用SFRSFR中寄存器的名字取代它的物理地址中寄存器的名字取代它的物理地址80H80H。很明显,后者更容易阅读和交流,很

18、明显,后者更容易阅读和交流,所以我们提倡使用所以我们提倡使用SFRSFR中寄存器名称来代替直接地址中寄存器名称来代替直接地址。 如:如:MOVMOV A,SBUFA,SBUF ;串口数据缓冲器数据送;串口数据缓冲器数据送A A MOV MOV IE,#00HIE,#00H ;初始化中断允许寄存器;初始化中断允许寄存器 MOV TH1,#0FEHMOV TH1,#0FEH ;为定时器;为定时器1 1赋初值赋初值 尽管使用尽管使用SFRSFR的寄存器名称来取代直接地址,可以带的寄存器名称来取代直接地址,可以带来程序的可读性,但是在汇编时,仍要将寄存器名字转换来程序的可读性,但是在汇编时,仍要将寄存

19、器名字转换为直接地址。为直接地址。2,2,当直接地址时在工作寄存器区中时,可以使用两种寻址当直接地址时在工作寄存器区中时,可以使用两种寻址方式来访问。方式来访问。 如:如: MOV A,00HMOV A,00H ;将;将RAMRAM中中00H00H单元数据送累加器单元数据送累加器A A MOV A,R0MOV A,R0 ;将工作寄存器;将工作寄存器R0R0的内容送累加器的内容送累加器A A 这里使用了不同的寻址方式,其指令的结构也不相同。这里使用了不同的寻址方式,其指令的结构也不相同。 前者是:前者是:11100101(0E5H)11100101(0E5H)、0000000000000000(

20、00H00H) 双字节。双字节。 后者的机器码是:后者的机器码是:11101000(0E8H)11101000(0E8H) 单字节单字节; ; 在物理结构上,在物理结构上,R0R0与与RAMRAM的的00H00H单元恰好是同一单元,单元恰好是同一单元,所以不同的指令而执行结果是一样的。所以不同的指令而执行结果是一样的。 类似的还有累加器类似的还有累加器A A: INC AINC A 寄存器寻址方式(单字节);寄存器寻址方式(单字节); INC ACCINC ACC 直接寻址方式(双字节);直接寻址方式(双字节); INC 0E0HINC 0E0H 直接寻址方式(双字节)。直接寻址方式(双字节)

21、。 3,3,在指令系统中:在指令系统中:字节地址字节地址与与位地址位地址是完全不同的概念。是完全不同的概念。 前者用前者用directdirect表示,而后者用表示,而后者用bit bit 表示,但在指令中都是用表示,但在指令中都是用1616进制表示的数。进制表示的数。 如:如: MOV A,20H MOV A,20H ;将;将RAMRAM的的20H20H单元内容送单元内容送A A MOV C,20H MOV C,20H ;将位寻址区中的位地址为;将位寻址区中的位地址为20H20H位内容送位内容送 PSW PSW 中的中的CyCy中。中。片内 RAM(20H-2FH)中的位寻址区结构图7F7F

22、7E7E7D7D7C7C7B7B7A7A79797878777776767575747473737272717170706F6F6E6E6D6D6C6C6B6B6A6A69696868676766666565646463636262616160605F5F5E5E5D5D5C5C5B5B5A5A59595858575756565555545453535252515150504F4F4E4E4D4D4C4C4B4B4A4A49494848474746464545444443434242414140403F3F3E3E3D3D3C3C3B3B3A3A393938383737262625252424

23、23232222212120202F2F2E2E2D2D2C2C2B2B2A2A29292828272726262525242423232222212120201F1F1E1E1D1D1C1C1B1B1A1A19191818171716161515141413131212111110100F0F0E0E0D0D0C0C0B0B0A0A09090808070706060505040403030202010100002FH20H字节地址返回24H位地址返回前一次2.2.3立即寻址指令本身直接含有所需要的指令本身直接含有所需要的8 8位或位或1616位的操作数。位的操作数。 将此数称为将此数称为“

24、“立即数立即数” ”(使用(使用# #标明)。如:标明)。如: MOV A,#30HMOV A,#30H ;将(;将(8 8位)立即数送累加器位)立即数送累加器A A MOV DPTR,#2000H MOV DPTR,#2000H ;1616位立即数送位立即数送DPTRDPTR积存器积存器 【注意注意】:MOV A,#30HMOV A,#30H MOV A,30HMOV A,30H 两者的区别。两者的区别。立即数寻址的指令长度为立即数寻址的指令长度为2 2或或3 3个字节。个字节。74H74H30H30Hnn+1ROM累加器AMOV A,#30H 指令执行流程90H90H20H20H00H00

25、HROMDPTRMOV DPTR,#2000H指令的存储和执行返回2.2.4 寄存器间接寻址指令中含有指令中含有保存操作数地址的保存操作数地址的寄存器寄存器RiRi。 MOV MOV A,RiA,Ri ( i=0 ( i=0、1)1) CPU CPU首先根据指令中寄存器名首先根据指令中寄存器名RiRi找到操作数地址,然后再找到操作数地址,然后再从该地址中找到操作数从该地址中找到操作数 x x。 如:如:MOV R0,#30H MOV R0,#30H ;立即数送;立即数送R0R0寄存器寄存器 MOV A,R0 MOV A,R0 ;从;从RAMRAM的的H H单元取数送累加器单元取数送累加器A A

26、【注意注意】MOV A,R0MOV A,R0 和和 MOV A,R0MOV A,R0 指令的区别。指令的区别。ROMROM111001111100110 0RAMRAMx x30H30H30HR000H累加器A123使用寄存器间址指令时应注意的三个问题:1,1,间址寄存器间址寄存器RiRi只能使用只能使用R0R0、R1R1寄存器(寄存器(i=0i=0、1 1)。)。2,2,间址方式不仅用于片内间址方式不仅用于片内RAMRAM,同样也适用于片外,同样也适用于片外RAMRAM。 对于片内对于片内RAMRAM使用使用RiRi寄存器,寻址范围为寄存器,寻址范围为00H00HFFHFFH。 对于片外对于

27、片外RAMRAM,可以使用,可以使用RiRi,也可以使用,也可以使用DPTRDPTR做间址寄做间址寄存器。两者区别在于后者寻址范围为存器。两者区别在于后者寻址范围为0000H0000HFFFFHFFFFH,两,两者都可以者都可以RAMRAM和和ROMROM。3 3,间址方式的指令不能访问,间址方式的指令不能访问SFRSFR中的单元。如下面的程序中的单元。如下面的程序是错误的:是错误的: MOV R1,#80HMOV R1,#80H MOV A,R1 MOV A,R1 (因为(因为80H80H为为SFRSFR的物理地址)的物理地址)MCS-51 片内 、片外 数据存储器示意图 特殊功能寄存器SF

28、R通用数据存储器80H7FH00HFFH片内数据存储器 片外数据存储器256B个字节 64KB个字节片外数据存储器64KB0000HFFFFH注意:1,访问片内RAM20H存储单元;MOV A,20H2,访问片外RAM存储单元; MOV R0,#20HMOVX A,R03,尽管片内与片外的RAM单元 的00H-FFH地址相重叠但由于指令的不同不会发生地址混乱。返回2.2.5 变址寻址指令使用指令使用DPTRDPTR或或PCPC中的内容作为基地址,再与累加器中的内容作为基地址,再与累加器A A的内容相加,其和作为操作数地址。如:的内容相加,其和作为操作数地址。如: MOVX A,A+PC MOV

29、X A,A+PC ;PCPC内容与内容与A A的内容相加得操作数地址的内容相加得操作数地址 并将此操作数送并将此操作数送A A MOVX A,A+DPTRMOVX A,A+DPTR;DPTRDPTR内容与内容与A A的内容相加得操作数的内容相加得操作数 地址并将此操作数送地址并将此操作数送A A使用变址指令时,要事先分别为使用变址指令时,要事先分别为A A、DPTRDPTR赋值,以便获赋值,以便获得操作数得地址。得操作数得地址。变址指令只适用于对变址指令只适用于对ROMROM存储器得访问,如查表等。存储器得访问,如查表等。【举例举例】:已知已知ROMROM中中0302H0302H 单元有一个数

30、单元有一个数x x,现要把它送到,现要把它送到累加器累加器A A中,试编程。中,试编程。 MOV DPTR,#0300HMOV DPTR,#0300H ;立即数送;立即数送DPTRDPTR MOV A,#02H MOV A,#02H ;立即数送累加器;立即数送累加器A A MOVC A,A+DPTR MOVC A,A+DPTR ;从;从ROMROM的的0030200302单元取数送单元取数送A A变址寻址示意图02H0300HROMROM X XALU0302H累加器ADPTR0300H+ 02H0302HMOVCMOVC A,A+DPTRA,A+DPTR返回2.2.6 相对寻址转移指令中使用

31、的一种寻址方式。转移指令中使用的一种寻址方式。MCS-51MCS-51单片机的指令单片机的指令系统中,有两类转移指令:系统中,有两类转移指令:相对转移(相对转移( 2 2个或个或3 3个字节)个字节) 绝对转移(绝对转移(3 3个字节)。个字节)。 在在绝对转移指令绝对转移指令中中,指令直接给出转移的目标地址,指令直接给出转移的目标地址(2 2字节地址),执行时将目标地址直接送给字节地址),执行时将目标地址直接送给PCPC,从而控,从而控制程序转移;制程序转移; 而而相对转移指令相对转移指令在执行中是将在执行中是将PCPC值与指令中的值与指令中的8 8位偏位偏移量进行相加,形成指令要转移的目标

32、地址。移量进行相加,形成指令要转移的目标地址。 SJMP SJMP relrel由指令中有一个由指令中有一个8 8位偏移量位偏移量 relrel 为带符号位的补码,所以控为带符号位的补码,所以控制程序转移的范围为制程序转移的范围为+127+127-128-128。54H2002H程序存程序存储器储器ROMROM80H80H54H54H ALU2056H累加器APC2002H+ 54H2056H操作码偏移量例如:SJMP 54H ;(80H、54H)2000H2002H(LOOP1)相对寻址使用中应注意的问题相对寻址使用中应注意的问题 与绝对寻址相比,相对寻址具有很好的与绝对寻址相比,相对寻址具

33、有很好的“ “浮动性浮动性” ”,因此是编程人员普遍使用的一种寻址方式。因此是编程人员普遍使用的一种寻址方式。 使用时,要注意使用时,要注意3 3点:点:1,CPU1,CPU进行地址计算时,进行地址计算时,PCPC取值是执行本指令后的地址取值是执行本指令后的地址值。以上面的例子说明:值。以上面的例子说明: 指令本身的首地址是指令本身的首地址是2000H,2000H,执行完后变为执行完后变为2002H(2002H(既既下一条指令的首地址)。下一条指令的首地址)。 如果使用三字节的相对转移指令,则如果使用三字节的相对转移指令,则PC=PC+3PC=PC+3。返回上一页2,2,偏移量的计算:偏移量的

34、计算: relrel= =目标地址目标地址- -源地址源地址-2 (2-2 (2字节指令)字节指令) 或:或: relrel= =目标地址目标地址- -源地址源地址-3 (3-3 (3字节指令)字节指令) 结果用补码的形式书写。结果用补码的形式书写。 为了减少计算偏移量的计算,汇编程序允许使用为了减少计算偏移量的计算,汇编程序允许使用“ “符符号地址号地址” ”的方式代替偏移量。如:的方式代替偏移量。如: SJMP loop1 SJMP loop1 汇编程序在翻译时,自动计算并将结果替换符号地址。汇编程序在翻译时,自动计算并将结果替换符号地址。3, 3, 如果转移地址的范围超过相对寻址的范围(

35、如:如果转移地址的范围超过相对寻址的范围(如:-127-127+128+128)时,就要采用别的方式法,否则在编译时,提示)时,就要采用别的方式法,否则在编译时,提示出错。出错。返回2.2.7 位寻址在在位寻址指令(位操作指令)位寻址指令(位操作指令)中使用的位地址。中使用的位地址。 在一般的情况下,系统的数据都是按字节(在一般的情况下,系统的数据都是按字节(8 8位)来存位)来存放、处理。放、处理。 单片机在控制、检测的应用中,系统的输入、输出数单片机在控制、检测的应用中,系统的输入、输出数据有很多属于开关量信号。这些开关量信号以据有很多属于开关量信号。这些开关量信号以 bitbit - “

36、 - “位位” ”的形式进行各种运算、处理和存储的。的形式进行各种运算、处理和存储的。MCS-51单片机控制、检测系统驱动器电动机外设1外设2状态信号状态信号控制信号在在MCS-51MCS-51单片机的硬件设计上充分考虑了这种单片机的硬件设计上充分考虑了这种“ “布尔布尔” ”变量的处理,不仅在指令系统中设计了变量的处理,不仅在指令系统中设计了“ “位操作位操作” ”指令,指令,而且在片内而且在片内RAMRAM区中还专门开辟了一个区中还专门开辟了一个 “ “位寻址区位寻址区” ”。这样,布尔变量可以向字节数据一样进行存储、寻址。这样,布尔变量可以向字节数据一样进行存储、寻址。除了位寻址区外,除

37、了位寻址区外,RAMRAM中的大多中的大多SFRSFR都可以按位寻址,换都可以按位寻址,换句话,句话,SFRSFR除了有自己的字节地址外,在寄存器内的每一除了有自己的字节地址外,在寄存器内的每一位还有其位地址。位还有其位地址。 【举例举例】:SETB 20HSETB 20H ; ;将位地址为将位地址为20H20H的位置一的位置一 SETB 90HSETB 90H ; ;将将P1P1口的口的d0d0位置一位置一同字节寻址中的直接寻址一样,为了增加程序的可读性,同字节寻址中的直接寻址一样,为了增加程序的可读性,凡在凡在SFRSFR中的中的位地址位地址都可以使用都可以使用符号地址符号地址来替代。如第

38、二来替代。如第二例中,完全可以使用下面的指令格式:例中,完全可以使用下面的指令格式: MOV P1.0MOV P1.0 ; ;将将P0P0口的口的d0d0位置一位置一 类似还有:类似还有:MOV C,ACC.7MOV C,ACC.7 ; ;将累加器中的将累加器中的d7d7位送位送PSWPSW的的cycy 这种指令在汇编程序进行翻译时,还是要先将符号地址这种指令在汇编程序进行翻译时,还是要先将符号地址转换为真正的位地址。转换为真正的位地址。返回2.3 数据传送指令2.3.0 2.3.0 传送指令的特点传送指令的特点2.3.12.3.1 内部数据传送类指令内部数据传送类指令2.3.22.3.2 外

39、部数据传送类指令外部数据传送类指令2.3.32.3.3 堆栈操作指令堆栈操作指令2.3.42.3.4 数据交换指令数据交换指令继续数据传送是编程中使用最多、最主要的操作。它的功能是将数据传送是编程中使用最多、最主要的操作。它的功能是将数据在累加器、片内的数据在累加器、片内的RAMRAM、SFRSFR及片外及片外ROMROM、RAMRAM之间之间进行传送。进行传送。在传送类指令中在传送类指令中, ,必须指定被传送数据的必须指定被传送数据的源地址源地址和和目标地址目标地址。在传送过程中,在传送过程中,源地址的内容源地址的内容不被改变。不被改变。传送类指令除了传送类指令除了以累加器以累加器A A为目

40、标的传送为目标的传送对对PSWPSW的的P P有影响外,有影响外,其余的传送类指令对其余的传送类指令对PWSPWS一概无影响。一概无影响。操作码操作码数据的目标地址数据的目标地址数据的源地址数据的源地址【举例】:MOV A,R0 ;将R0寄存器中的数据送 累加器A中(注意寻址方式)指令通式:MOV ,2.3.0 传送指令的特点返回2.3.1 内部数据传送类指令特点特点: :指令的源操作数和目的操作数都在单片机内部。指令的源操作数和目的操作数都在单片机内部。1,立即寻址型传送指令2,直接寻址型传送指令3,寄存器寻址型传送指令4,寄存器间址型传送指令5,内部数据传送类指令的使用继续1 1,立即寻址

41、型传送指令,立即寻址型传送指令【特点特点】:原操作数字节是立即数原操作数字节是立即数,处在指令的第二或第,处在指令的第二或第三字节,所以这类指令都是多字节指令。这类指令有如下三字节,所以这类指令都是多字节指令。这类指令有如下4 4条。条。 MOV MOV A,#dataA,#data ; A data ( ; A data (双字节指令)双字节指令) MOV MOV Rn,#dataRn,#data ; ; RnRn data ( data (双字节指令)双字节指令) MOV MOV Ri,#dataRi,#data ; ; (RiRi) data (data (双字节指令)双字节指令) MO

42、V MOV direct,#datadirect,#data ; direct data ( ; direct data (三字节指令)三字节指令) 这类指令多用于程序的初始化。如:这类指令多用于程序的初始化。如: MOV R0,#20HMOV R0,#20H MOV A,#00H MOV A,#00H立即寻址指令举例已知:已知:R0=20H,R0=20H,试问单片机执行如下指令后,累加器试问单片机执行如下指令后,累加器A A、 R7R7、20H20H和和21H21H单元中的内容是什么。单元中的内容是什么。 MOV A,#18H MOV A,#18H ;立即数立即数18H18H送累加器送累加器

43、A A MOV R7,#28H MOV R7,#28H ;立即数立即数28H28H送寄存器送寄存器R7R7MOV R0,#38H MOV R0,#38H ;立即数立即数38H38H送内存送内存20H20H单元单元MOV 21H,#48H MOV 21H,#48H ;立即数立即数48H48H送内存送内存21H21H单元单元返回2,直接寻址型传送指令【特点特点】:指令中至少含有一个:指令中至少含有一个源操作数源操作数或或目的操作数的目的操作数的地址地址。很明显,这也是。很明显,这也是2 2个或个或3 3个字节的指令格式,其中直个字节的指令格式,其中直接地址在第接地址在第2 2或第或第3 3个字节上

44、。这类指令有如下个字节上。这类指令有如下5 5条:条: MOV MOV A,directA,directMOV MOV direct,Adirect,AMOV MOV Rn,directRn,directMOV MOV Ri,directRi,directMOV direct2,direct1MOV direct2,direct1 【注意注意】:directdirect为内部寄存器、为内部寄存器、RAMRAM和和SFRSFR的地址,换的地址,换句话说:句话说:directdirect适用于片内所有的地址(寄存器、适用于片内所有的地址(寄存器、SFRSFR和和RAM)RAM)。直接寻址指令举例

45、MOV A,30H MOV A,30H ;内存内存RAM30hRAM30h单元数据送单元数据送A AMOV 50H,A MOV 50H,A ;A A中内容送中内容送RAMRAM的的50h50h单元单元MOV R6,31H MOV R6,31H ;RAMRAM的的30h 30h 内容送内容送R6R6寄存器寄存器MOV Ri,30H MOV Ri,30H ;RAM30hRAM30h内容送内容送RiRi指定的指定的RAMRAM单元单元MOV P1,32H MOV P1,32H ;RAM32hRAM32h内容送内容送P1P1口(口(p1:p1:符号地址)符号地址)MOV 90H,32H MOV 90H

46、,32H ;(同上,试比较两种表示方法)(同上,试比较两种表示方法)返回3,寄存器寻址型传送指令指令中含有存放操作数的寄存器名指令中含有存放操作数的寄存器名RnRn 其中其中(n n00,1,2,3,4,5,6,7)1,2,3,4,5,6,7)。 共有如下三条:共有如下三条:MOV MOV A,RnA,RnMOV MOV Rn,ARn,AMOV MOV direct,Rndirect,Rn返回4,寄存器间接寻址型传送指令指令特点:指令中指令特点:指令中RiRi中存放的不是操作数本身,而是操作中存放的不是操作数本身,而是操作数在数在RAMRAM中的地址(中的地址(i=0i=0、1 1)。)。 格

47、式如下:格式如下:MOV MOV A,RiA,RiMOV MOV Ri,ARi,AMOV MOV direct,Ridirect,Ri 【注意注意】;RiRi中存放操作数的地址是有所选择的,只有非中存放操作数的地址是有所选择的,只有非SFRSFR的的RAMRAM单元才能使用这种寻址方式。单元才能使用这种寻址方式。寄存器间接寻址指令举例已知已知( (40h)=11h,(41h)=22h,R0=40h40h)=11h,(41h)=22h,R0=40h和和R1=41hR1=41h。试。试问,下面的指令执行后,累加器问,下面的指令执行后,累加器A A、40h40h、41h41h和和42h42h单元中的

48、内容是什么。单元中的内容是什么。 MOV A,R0 MOV A,R0 ;RAM40hRAM40h单元内容单元内容11h11h送送A A MOV R1,A MOV R1,A ;A A中的中的11h11h送送RAMRAM的的41h41h单元单元 MOV 42H,R1 MOV 42H,R1 ;RAMRAM的的41h41h单元内容单元内容11h11h送送 RAM42hRAM42h中中返回5,内部数据传送类指令的使用1 1,在使用传送指令时,在使用传送指令时, ,可以根据实际情况选用恰当寻址方可以根据实际情况选用恰当寻址方式。上面给出的各种类型的传送指令是式。上面给出的各种类型的传送指令是INTELIN

49、TEL公司在设计公司在设计MCS-51MCS-51的硬件时就已经确定下来。编程人员只能像查字的硬件时就已经确定下来。编程人员只能像查字典一样去查找、使用。不能根据主观意愿去典一样去查找、使用。不能根据主观意愿去“ “创造创造” ”指令。指令。 例如:要将例如:要将R0R0中的数据传送到中的数据传送到R1R1中。如何使用指令去完中。如何使用指令去完成上面的操作?成上面的操作? movmov r1,r0 r1,r0 是否可以?回答是否定的!因为在是否可以?回答是否定的!因为在MCS-51MCS-51的指令系统中没有此条指令!只能使用:的指令系统中没有此条指令!只能使用: 1 1,movmov a,

50、r0 a,r0 或:或: 2, 2, movmov 01h,00h 01h,00h movmov r1,a r1,a 因此,必须从因此,必须从MCS-51MCS-51的指令表中选择使用指令。的指令表中选择使用指令。MCS-51内部数据传送类指令方式图累加器Adirect直接寻址Ri间址Rn寄存器Data立即数返回上一次2 2,以累加器,以累加器A A为目的寄存器的传送指令会影响为目的寄存器的传送指令会影响PSWPSW中的中的 奇偶位奇偶位P P,而其余的指令对,而其余的指令对PSWPSW均无影响。均无影响。3 3,要会正确地估计指令的字节。凡是指令中包含有立即,要会正确地估计指令的字节。凡是指

51、令中包含有立即 数、直接地址的指令,都应当在原有的基础上加数、直接地址的指令,都应当在原有的基础上加1 1。 【举例举例】: movmov a,Ria,Ri ( ) ( )个字节个字节 movmov a,directa,direct ( ) ( )个字节个字节 movmov direct,datadirect,data ( ) ( )个字节个字节 movmov direct2,direct1 ( ) direct2,direct1 ( )个字节个字节4 4,对于同一问题可以有不同的编程方法。使用不同的方,对于同一问题可以有不同的编程方法。使用不同的方法虽然都可以实现题目的要求,但从指令长度、运

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

53、A MOV A,R0 MOV A,R0 ; R0 R0 A A MOV 40H,30H MOV 40H,30H ;(;(30h) 30h) 40h 40h MOV MOV A,RiA,Ri ; ( RiRi ) ) A A内部传送类指令举例试编出把试编出把30h30h和和40h40h单元内容进行交换。单元内容进行交换。MOV A,30HMOV A,30H ;(30h) (30h) A AMOV 30H,40HMOV 30H,40H ;(40h) (40h) 30h 30h MOV 40H,AMOV 40H,A ; A A 40h 40h RAMRAMX XY Y累加器A30H40H返回2.3.

54、2 外部数据传送类指令1,16位数传送指令2,外部ROM的字节传送3,外部RAM的字节传送指令继续1,16位数传送指令MCS-51MCS-51指令系统中唯一的一条指令系统中唯一的一条1616位数据传送类指令。位数据传送类指令。 MOV DPTR,#data16MOV DPTR,#data16 DPTR DPTR是单片机内部是单片机内部SFRSFR中的两个寄存器中的两个寄存器DPHDPH、DPLDPL组合而成。其中组合而成。其中DPHDPH为高八位,为高八位,DPLDPL为低八位。为低八位。 DPTRDPTR是一个专门用于访问外部存储器的间址寄存器。是一个专门用于访问外部存储器的间址寄存器。寻址

55、能力为寻址能力为 64K (064K (065535)65535)。返回2,外部ROM的字节传送指令这类指令有两条,都属于变址寻址指令。这类指令有两条,都属于变址寻址指令。 MOVC A,A+DPTR MOVC A,A+DPTR ;A A (A+DPTR) (A+DPTR) MOVC A,A+PC MOVC A,A+PC ;PC PC PC+1, A PC+1, A (A+PC) (A+PC) 该指令也称为该指令也称为“ “查表查表” ”指令。在指令。在ROMROM中建立一个数据表,中建立一个数据表,可以使用可以使用DPTRDPTR、PCPC作为数据表格的基地址。作为数据表格的基地址。 在第一

56、条指令中:用在第一条指令中:用DPTRDPTR作为基地址。使用前,先作为基地址。使用前,先将数据表的首地址送入将数据表的首地址送入DPTRDPTR中,累加器中,累加器A A作为偏移量。作为偏移量。由两者数据相加得到待查的表中数据地址并取出。由两者数据相加得到待查的表中数据地址并取出。 第二条指令是以程序计数器第二条指令是以程序计数器PCPC为基地址。由于为基地址。由于PCPC的的内容与该指令在内容与该指令在ROMROM中的位置有关,所以一旦该指令在中的位置有关,所以一旦该指令在程序中的位置确定,其程序中的位置确定,其PCPC的值也就确定。的值也就确定。外部ROM的字节传送指令举例举例已知累加器

57、已知累加器A A中存有中存有0 09 9范围内的范围内的数,试用查表指令编写出查找出该数,试用查表指令编写出查找出该数平方的程序。数平方的程序。1 1,采用,采用DPTRDPTR作基址寄存器作基址寄存器: 设平方表的首地址为设平方表的首地址为2000h2000h,累加,累加器器A A中的内容恰好是查表的偏移量。中的内容恰好是查表的偏移量。首先将表的起始地址首先将表的起始地址2000h2000h送入送入DPTRDPTR中。中。 MOV DPTR,#2000H MOV DPTR,#2000H ;指针赋值;指针赋值 MOVC A,A+DPTR MOVC A,A+DPTR ;平方值送;平方值送A AR

58、OMROM0 01 14 49 91616252536364949646481812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h2 2,采用,采用PCPC作基址寄存器作基址寄存器:与与DPTRDPTR不同,使用不同,使用PCPC作为基地址时,必须对累作为基地址时,必须对累加器加器A A的数据进行修正,以保证的数据进行修正,以保证a+pca+pc恰好找到恰好找到待查的平方值地址。待查的平方值地址。 ORG 1FFBHORG 1FFBH1FFBH 1FFBH 74 data74 data ADD ADD A,#dataA,#data ;data

59、=02hdata=02h1FFDH 1FFDH 83H83H MOVC A,A+PC MOVC A,A+PC ;PC=1FFEPC=1FFE1FFEH 1FFEH 80FEH 80FEH SJMP $SJMP $2000H 2000H 00H00H DB 0DB 0 ;平房表首址;平房表首址2001H 2001H 01H 01H DB 1DB 12002H 2002H 04H 04H DB 4DB 42003H 2003H 09H 09H DB 9DB 92004H 2004H 10H 10H DB 16DB 162005H 2005H 19H19H DB 25DB 25 : : : : :

60、:2009H 2009H 51H51H DB 81DB 81 ENDENDdatadata为为MOVCMOVC指令首地址与表指令首地址与表头头地址之地址之间间的的单单元数。元数。74h74hdatadata83h83h80h80hFEhFEh0 01 14 49 91616252536364949646481812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h1FFFh1FFEh1FFDh1FFCh1FFBh返回3,外部RAM的字节传送指令实现外部实现外部RAMRAM和累加器和累加器A A之间的数据传送。只有寄存器间接之间的数据传送。只有寄存

61、器间接寻址的指令。寻址的指令。 MOVX MOVX A,RiA,Ri 使用使用RiRi寄存器间址寻址范围寄存器间址寻址范围0 0255h255h MOVX MOVX Ri,ARi,A 在硬件电路中在硬件电路中P0P0口输出口输出8 8位地址数据。位地址数据。MOVX A,DPTR MOVX A,DPTR 使用使用DPTRDPTR间址,寻址范围间址,寻址范围0 065535h65535hMOVX DPTR,A MOVX DPTR,A 在硬件电路中,使用在硬件电路中,使用P0P0口输出低口输出低8 8位,位, P2P2口输出高口输出高8 8位外部位外部RAMRAM地址。地址。外部RAM的字节传送指

62、令举例已知外部已知外部RAMRAM的的88H88H单元有一个数单元有一个数x x,试编程将,试编程将x x送外部送外部RAMRAM的的1818H1818H单元。单元。【解解】:外部:外部RAMRAM中的数据是不能直接传送的,因此必须使中的数据是不能直接传送的,因此必须使用两次用两次 MOVX MOVX 指令完成此操作。指令完成此操作。ORG 2000HORG 2000HMOV R0MOV R0,#88H #88H ;为;为8 8位指针赋值位指针赋值MOV DPTRMOV DPTR,#1818H #1818H ;为;为1616位指针赋值位指针赋值MOVX AMOVX A,R0 R0 ;取;取 x

63、 x 到累加器到累加器A AMOVX DPTRMOVX DPTR,A A ;x x 送送RAMRAM的的1818h1818h单元单元SJMP $ SJMP $ ;停机;停机ENDEND返回2.3.3 堆栈操作指令堆栈操作是一种特殊的数据传送指令。堆栈操作是一种特殊的数据传送指令。堆栈:一个用来保存程序断点、数据的特殊的存储区域。堆栈:一个用来保存程序断点、数据的特殊的存储区域。在在MCS-51MCS-51单片机中,栈区是占用片内单片机中,栈区是占用片内RAMRAM的存储空间,的存储空间,具体栈位置由指针具体栈位置由指针SPSP来确定(系统上电时,来确定(系统上电时,SP=07h)SP=07h)

64、。 1 1,进栈操作进栈操作: push directpush direct ;sp+1sp+1sp,(direct)sp,(direct)(sp)(sp) 2 2,出栈操作出栈操作: pop direct pop direct ;( (sp)sp)(direct),sp(direct),sp - -1sp1sp【注意注意】:寻寻址方式址方式为为直接直接寻寻址,所以址,所以 push apush a 是错误的,应当是是错误的,应当是push accpush acc或或push 0e0hpush 0e0h,同理同理:push r0push r0也是也是错误错误的。的。进栈进栈是堆是堆栈栈向上向上

65、“生生长长”的的过过程,即程,即sp+1sp+1;出;出栈则栈则相反。相反。系系统统上上电时电时,sp=07hsp=07h。SPSP的的值值可以根据需要可以根据需要进进行修改,行修改,以适以适应应具体具体编编程的需要。在确定程的需要。在确定栈栈区位置区位置时时要考要考虑对虑对数据数据区的影响,以避免数据区与区的影响,以避免数据区与栈栈区冲突。区冲突。堆栈操作指令举例(一)堆栈操作指令举例(一)下面是一个下面是一个BCDBCD码转换为二进制的子程序码转换为二进制的子程序BCDBBCDB中有关堆栈中有关堆栈操作的例子。在这里,进栈操作是为了保护主程序中相关寄操作的例子。在这里,进栈操作是为了保护主

66、程序中相关寄存器中的数据,因为子程序要使用这些寄存器。存器中的数据,因为子程序要使用这些寄存器。org 0800horg 0800hbcdbbcdb: :push push pswpswpush accpush accpush bpush b : : : :pop bpop bpop accpop accpop pop pswpswretretRAMRAMb baccaccpswpsw栈底栈底SP堆栈操作指令举例(二) 堆栈操作指令除了可以在子程序的设堆栈操作指令除了可以在子程序的设计中,对主程序的数据进行保护。还计中,对主程序的数据进行保护。还可以根据堆栈操作的特点完成一些特可以根据堆栈操作

67、的特点完成一些特殊的操作。殊的操作。【举例举例】:设片内:设片内RAMRAM的的30h30h单元存有单元存有x x,40h40h单元存有单元存有y y。试将两个单元内容。试将两个单元内容互换。互换。push 30hpush 30hpush 40hpush 40hpop 30hpop 30hpop 40hpop 40hRAMRAMx x y y y y x xy yx x栈底栈底SP=07h40h30h继续2.3.4 数据交换指令为提供一种方便的为提供一种方便的累加器累加器和和寄存器寄存器或或RAMRAM之间的数据交换。之间的数据交换。避免了使用一般避免了使用一般movmov 传送指令完成交换时

68、的不便。传送指令完成交换时的不便。格式:格式:xchxch a,Rna,Rn ;a a RnRn xchxch a,directa,direct ;a a (direct) (direct) xchxch a,Ria,Ri ;a a ( (RiRi) ) xchdxchd a,Ria,Ri ;a a3 30 0(Ri)(Ri)3 30 0举举例:已知,片外例:已知,片外RAM20hRAM20h单单元、内部元、内部RAM20hRAM20h单单元分元分别别有数有数x x和和y y,试编试编程互将两数相交程互将两数相交换换。movmov R1,#20h R1,#20h ;指指针赋针赋初初值值movx

69、movx a,R1 a,R1 ;x xaaxchxch a,R1 a,R1 ;交换交换 a(20h),a(20h),y yaa movxmovx R1,a R1,a ;y y(20h)(20h)片外片外RAMRAM数据交换指令举例(一)举举例:已知,片外例:已知,片外RAM20hRAM20h单单元、内部元、内部RAM20hRAM20h单单元分元分别别有数有数x x和和y y,试编试编程互将两数相交程互将两数相交换换。movmov R1,#20h R1,#20h ;指;指针赋针赋初初值值movxmovx a,R1 a,R1 ;xaxaxchxch a,R1 a,R1 ;交换交换 a(20h),y

70、aa(20h),ya movxmovx R1,a R1,a ;y(20h)y(20h)片外片外RAMRAM片内片内RAMRAMy y (x)(x)片外片外RAMRAMx x (y)(y)(y) x20h20h累加器A123数据交换指令举例(二)已知已知RAM50hRAM50h单元有一个单元有一个0 09 9的数,试编程将它变成相应的数,试编程将它变成相应的的ASCIIASCII码。码。 【解解】:0 09 9的的ASCIIASCII码是码是30h30h39h39h,两者相差,两者相差30h30h。 方法一:对方法一:对50h50h单元的数据高四位组装一个单元的数据高四位组装一个30h30h。m

71、ovmov r0,#50h r0,#50h ;指针赋值;指针赋值movmov a,#30h a,#30h ;30hA30hAxchdxchd a,r0 a,r0 ; A A3 30 0(r0)(r0)3 30 0, ,在在A A中组成中组成ASCIIASCII码码movmov r0,a r0,a ;A A中的中的ASCIIASCII送回送回50h50h单元单元000000000101010150h00110101A=30h交换后A=35h12继续2.4 算逻运算和移位指令功能:完成算术运算、逻辑运算和循环移位三大功能。功能:完成算术运算、逻辑运算和循环移位三大功能。特点:大多指令都要由累加器特

72、点:大多指令都要由累加器A A来存放一个源操作数,并来存放一个源操作数,并把操作结果放回累加器把操作结果放回累加器A A中。中。2.4.1: 算术运算指令2.4.2: 逻辑运算指令2.4.3: 移位指令继续2.4.1: 算术运算指令 不带进位的加法指令不带进位的加法指令 ( ADD ADD )1 1,加法指令加法指令: 带进位的加法指令带进位的加法指令 ( ADC ADC ) 加加1 1指令指令 ( INC INC ) (编程举例编程举例)2 2,减法指令减法指令: 带进位的减法指令带进位的减法指令 ( SUBB SUBB ) 减减1 1指令指令 ( DEC DEC )3 3,十进制调整指令十

73、进制调整指令: ( D DA A A A )4 4,乘法和除法指令乘法和除法指令: (MUL DMUL DIVIV)加法指令(一):不带进位的加法指令格式:格式: ADD ADD A,RnA,Rn;A+RnA+RnAAADD ADD A,directA,direct;A+(direct)A+(direct)AAADD ADD A,RiA,Ri;A+(Ri)A+(Ri)AAADD ADD A,#dataA,#data;A+dataA+dataAA【注意注意】:1 1,参加运算的数据都应当是,参加运算的数据都应当是8 8位的,结果也是位的,结果也是8 8位并影响位并影响PSWPSW。2 2,根据,

74、根据编编程者的需要,程者的需要,8 8位数据可以是无符号数位数据可以是无符号数(0 0255255),也可以是有符号数也可以是有符号数(-127-127+128+128)。3 3,不,不论编论编程者使用的数据是有符号数程者使用的数据是有符号数还还是无符号数,是无符号数,CPUCPU都将都将它它们视为们视为有符号数(有符号数(补码补码)进进行运算并影响行运算并影响PSWPSW。不带进位的加法指令举例不带进位的加法指令举例( (一一) )试分析执行下列指令后累加器试分析执行下列指令后累加器A A和和PSWPSW中各标志的变化。中各标志的变化。MOV A,#19H MOV A,#19H Cy=0;C

75、y=0;ADD A,#66H ADD A,#66H AC=0 AC=0 OV=CPOV=CP CS=0CS=0 25 A= 0 0 0 1 1 0 0 1 B 25 A= 0 0 0 1 1 0 0 1 B P=1 P=1 + 102 data= 0 1 1 0 0 1 1 0 B+ 102 data= 0 1 1 0 0 1 1 0 B 127 127 0 0 1 1 1 1 1 1 10 0 1 1 1 1 1 1 1 B B 1 1,若两数都是无符号数,则因,若两数都是无符号数,则因Cy=0Cy=0无溢出,无溢出,25+102=12725+102=127。 2 2,若两个数是有符号数,则

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

77、 1 0 1 1 B 197197 0 1 1 0 0 0 1 0 10 1 1 0 0 0 1 0 1 B B CP CP CSCS ACAC1 1,若两数是无符号数,因,若两数是无符号数,因Cy=0Cy=0无溢出:无溢出:90+107=19790+107=1972 2,若两数是有符号数,因,若两数是有符号数,因OV=1OV=1,故有溢出,两个正数相加,故有溢出,两个正数相加后变为负数,很明显结果是不正确的。后变为负数,很明显结果是不正确的。加法指令(二):带进位的加法指令格式:格式: ADDC ADDC A,RnA,Rn;A+Rn+CyA+Rn+CyAA ADDC ADDC A,direc

78、tA,direct ;A+(directA+(direct) +) +CyCyAA ADDC ADDC A,RiA,Ri;A+(RiA+(Ri) +) +CyCyAA ADDC ADDC A,#dataA,#data ;A+data+CyA+data+CyAA【注意注意】:这里的:这里的CyCy是指令执行前的是指令执行前的CyCy; 对对PSWPSW的影响同的影响同ADDADD指令。指令。加1指令格式:格式:INC A INC A ;累加器;累加器A A加一加一INC INC RnRn ;Rn+1Rn+1RnRnINC direct INC direct ;内存单元数据加一;内存单元数据加一I

79、NC INC RiRi ;内存单元数据加一;内存单元数据加一INC DPTR INC DPTR ;dptr+1dptr+1dptrdptr【注意注意】: 1 1,除了第一条除了第一条对对PSWPSW的的P P有影响外有影响外, ,其余其余对对PSWPSW均无影响。均无影响。 2 2,由于上面的原因,由于上面的原因,INCINC指令不能作为一般的数据算术运算指令不能作为一般的数据算术运算 使用,使用,INCINC主要用于修改数据指针等控制、循环语句中使用。主要用于修改数据指针等控制、循环语句中使用。返回本节目录编程举例已知已知M1M1、M2M2单元中存有两个单元中存有两个1616位无符号数位无符

80、号数x1x1、x2x2(低位在(低位在前)。试写出前)。试写出x1+x2,x1+x2,并将结果放入并将结果放入M1M1、M1+1M1+1单元(低单元(低8 8位位在在M1M1单元)。设两数之和不会超过单元)。设两数之和不会超过1616位(位(6553565535)。)。【解解】:MOV R0MOV R0,#M1 #M1 ;x1x1指针赋初值指针赋初值MOV R1MOV R1,#M2 #M2 ;x2x2指针赋初值指针赋初值MOV AMOV A,R0 R0 ;取取x1x1低低8 8位送位送A AADD AADD A,R1 R1 ;x1x1与与x2x2低低8 8位相加位相加MOV R0MOV R0,

81、a a ; ;低低8 8位和送位和送m1m1单元单元INC R0INC R0INC R1INC R1 ;修改指针修改指针MOV AMOV A,R0 R0 ;取取x1x1的高的高8 8位送位送A AADDC AADDC A,R1R1 ;x1x1与与x2x2的高的高8 8位和位和CyCy相加相加MOV R0MOV R0,A A ; ;结果送结果送M1+1M1+1单元单元RAMRAMX2 data8X2 data81515X2 data0X2 data07 7X1data8X1data81515X1data0X1data07 7M1M1+1M2M2+1返回本节目录减法指令(带进位的减法指令)在在MC

82、S-51MCS-51单片机的指令系统中,只有:单片机的指令系统中,只有: 带进位的减法带进位的减法 SUBBSUBB 减一减一 DEC DEC 两种指令。两种指令。1 1减法指令:减法指令:格式格式:SUBB SUBB A,RnA,Rn ;A A RnRn Cy Cy A A SUBB SUBB A,directA,direct ;A A (direct) Cy (direct) Cy AA SUBB SUBB A,RiA,Ri ;A A ( (RiRi) Cy ) Cy AA SUBB SUBB A,#dataA,#data ;A data Cy A data Cy AA使用减法指令要注意的

83、几个问题1 1,在单片机内部,减法指令实际上是采用补码的,在单片机内部,减法指令实际上是采用补码的加法实现的。但要判定减法结果编程者可以按二加法实现的。但要判定减法结果编程者可以按二进制减法法则验证。进制减法法则验证。2,2,无论相减两数是无符号数还是有符号数,减法无论相减两数是无符号数还是有符号数,减法操作总是按有符号数来处理、影响操作总是按有符号数来处理、影响PSWPSW中相关的标中相关的标志(详见举例)。志(详见举例)。3 3,在,在MCS-51MCS-51的指令系统中没有不带的指令系统中没有不带CyCy的减法,所的减法,所以在使用以在使用SUBBSUBB指令前必须使用一条清除指令前必须

84、使用一条清除CyCy的指令:的指令:CLR CCLR C。减法指令应用举例试分析执行下列指令后累加器试分析执行下列指令后累加器A A和和PSWPSW中各标志的变化。中各标志的变化。CLR CCLR CMOV A,#52H 01010010B = 82MOV A,#52H 01010010B = 82SUBB A,#0B4H 10110100B = - 76SUBB A,#0B4H 10110100B = - 76 8282 a= 0 1 0 1 0 0 1 0 a= 0 1 0 1 0 0 1 0 -76 -76 data= 1 0 1 1 0 1 0 0 data= 1 0 1 1 0 1

85、0 0 158 158 1 1 0 0 1 1 1 1 0 =-62H= -98 1 1 0 0 1 1 1 1 0 =-62H= -98 手工手工计计算算 CPCP CSCS ACAC 1 0 1 1 0 1 【分析分析】:CPUCPU的的计计算得算得-98-98,很明,很明显显答案是答案是错误错误的。原因是的。原因是OV=1OV=1,既,既产产生了溢出。所以,生了溢出。所以,对对于符号数的减法在运算后一定要于符号数的减法在运算后一定要检测检测OV=1OV=1?返回本节目录减一指令格式格式:DEC A DEC A ;累加器;累加器A A减一减一DEC DEC RnRn ;Rn-1Rn-1Rn

86、RnDEC direct DEC direct ;内存单元数据减一;内存单元数据减一DEC DEC RiRi ;内存单元数据减一;内存单元数据减一【注意注意】: 1 1,除了第一条除了第一条对对PSWPSW的的P P有影响外,其余有影响外,其余对对PSWPSW均无影响。均无影响。 2 2,由于上面的原因,由于上面的原因,DECDEC指令一般不作为数据算术运算使指令一般不作为数据算术运算使用(因为不能对用(因为不能对PSWPSW的的OVOV等位产生影响,它主要用于修改等位产生影响,它主要用于修改数据指针在控制、循环语句中使用)。数据指针在控制、循环语句中使用)。返回本节目录十进制调整指令在在CP

87、UCPU进行进行BCDBCD码运算时,必须在运算后进行十进制调整,码运算时,必须在运算后进行十进制调整,这是因为,这是因为,CPUCPU在运算时,并不知道数据是二进制还是在运算时,并不知道数据是二进制还是BCDBCD码。码。格式:格式:DA A ;DA A ;若若AC=1AC=1或或A A3 30 0 9, 9,则则A+06hA+06hAA ; ;若若Cy =1Cy =1或或A A7 74 4 9, 9,则则A+60hA+60hAA【注意注意】:1 1,DA ADA A指令必指令必须紧须紧跟在加法指令之后;跟在加法指令之后;2 2,DA ADA A指令只适用于加法指令的指令只适用于加法指令的调

88、调整。整。十进制调整指令应用举例(一)1 1,BCDBCD加法运算:加法运算:试写出完成试写出完成85+5985+59的的BCDBCD码的加法程序。码的加法程序。MOV A,#85HMOV A,#85HADD A,#59HADD A,#59HDA ADA ASJMP $SJMP $ 85 a= 1 0 0 0 0 1 0 1B 85 a= 1 0 0 0 0 1 0 1B+ 59 + 59 dtatdtat= 0 1 0 1 1 0 0 1B = 0 1 0 1 1 0 0 1B 144 1 1 0 1 144 1 1 0 1 1 1 11 1 1 0 0B B 低低4 4位位9 9,所以加,

89、所以加0606h h + + 0 0 0 0 0 1 1 0B0 0 0 0 0 1 1 0B 1 1 1 01 1 1 0 0 1 0 0B 0 1 0 0B 高高4 4位位9 9,所以加,所以加6060h h 0 1 1 0 0 0 0 0B0 1 1 0 0 0 0 0B 1 0 1 0 0 0 1 0 0B 1 0 1 0 0 0 1 0 0B 结果为结果为144h144h(1 1包含在包含在CyCy)【注意注意】: 144H144H是用是用1616进制数来表示十进制,既进制数来表示十进制,既BCDBCD码。码。十进制调整指令应用举例(二)2 2,BCDBCD减法运算:减法运算:由于由

90、于DA ADA A 指令只能对指令只能对BCDBCD码的加法进行码的加法进行调整,所以遇到调整,所以遇到BCDBCD码的加法时就要将其码的加法时就要将其减法变为加法减法变为加法运运算,然后再使用算,然后再使用DA ADA A指令进行调整。指令进行调整。减法变加法就是使用减法变加法就是使用BCDBCD码的补码运算法则:码的补码运算法则: 将将被减数被减数- -减数减数变为变为被减数被减数+ +减数的补码减数的补码。 减数的补码减数的补码 = = BCDBCD码的模码的模- -减数减数 其中其中BCDBCD码的模为码的模为100H = 99H+01H = 100H = 99H+01H = 9A9A

91、HH已知:在已知:在M1M1、M2M2中分别存有被减数中分别存有被减数9191和减数和减数3636。 试编程求试编程求19-3619-36并将结果存入并将结果存入M3M3单元。单元。【解解】:1 1,算法:算法:91-36=91+91-36=91+(100-36100-36)=91+=91+(9A-36) 9A-36) 2 2,编程:编程: CLR C CLR C ; ; 清除清除CyCyMOV A,#9AH MOV A,#9AH ;BCDBCD码的模码的模100100送送A ASUBB A,M2SUBB A,M2 ;计算减数的补码;计算减数的补码 (结果在(结果在A A中)中) ADD A,

92、M1ADD A,M1 ;被减数;被减数+ +减数的补码(结果在减数的补码(结果在A A中)中)DA ADA A ;十进制调整;十进制调整MOV M3,AMOV M3,A ;结果送;结果送M3M3单元单元CLR CCLR C ;清除进位位(不要;清除进位位(不要Cy)Cy)(请同学自己验证一下)(请同学自己验证一下)返回本节目录乘法和除法指令这是这是MCS-51MCS-51单片机唯一的一类单字节单片机唯一的一类单字节4 4周期指令,它相当周期指令,它相当于于4 4条加法指令的运行时间。条加法指令的运行时间。 格式:格式:MUL A B ;MUL A B ;a a b b=b a (b=b a (

93、b存高存高8 8位,位,a a存低存低8 8位)位) DIV A B ;DIV A B ;a a b b=a=ab (ab (a存商,存商,b b存余数)存余数)【注意注意】:指令对标志的影响:指令对标志的影响: 1 1,在乘法指令中,在乘法指令中对对PSWPSW的影响有的影响有CyCy、OVOV、和、和P P。 具体如下具体如下:Cy:Cy0 0;P P取决于取决于A A中中“1 1”的个数;的个数;OVOV表明积的大小。当积超过表明积的大小。当积超过255255(B0)B0)时,时,OV=1OV=1。 2 2,在除法指令中,在除法指令中,CyCy、P P与乘法相同。在执行除法指与乘法相同。

94、在执行除法指令时,若令时,若B=0B=0时时OV=1OV=1,表示除数,表示除数=0=0除法无意义,其余情况除法无意义,其余情况下下OVOV被复位。被复位。返回本节目录2.4.2: 逻辑运算指令功能功能: :对对2 2个个8 8位二进制数进行位二进制数进行逻辑与、或、非和异或逻辑与、或、非和异或操作;操作;特点特点: :除了以累加器除了以累加器A A为目标寄存器的指令影响为目标寄存器的指令影响PSWPSW的的P P位位外,其余指令对外,其余指令对PSWPSW均无影响。均无影响。1 1,逻辑,逻辑与运算与运算指令指令 (ANL)(ANL)2 2,逻辑,逻辑或运算或运算指令指令 (ORL)(ORL

95、)3 3,逻辑,逻辑异或异或指令指令 (XRL)(XRL)4 4,累加器,累加器清零和取反清零和取反指令指令 (CLR & CPL)(CLR & CPL)继续逻辑与运算指令格式:格式:ANL ANL A,RnA,Rn;A A R n AR n A ANL ANL A,directA,direct ; A A ( (directdirect) A) A ANL ANL A,RiA,Ri; A A ( RiRi) A A ANL ANL A,#dataA,#data; A A datadata A A ANL ANL direct,Adirect,A; (direct) (direct) A A

96、directdirect ANL direct,# data ANL direct,# data; (direct) (direct) datadata directdirect上面的指令也可以分为两类:上面的指令也可以分为两类: 1 1,以,以累加器累加器A A为目标寄存器的逻辑运算指令;为目标寄存器的逻辑运算指令; 2 2,以,以内存单元内存单元为目标的逻辑运算指令。为目标的逻辑运算指令。应用举例(一)已知已知R0=30HR0=30H和(和(30H30H)=0AAH,=0AAH,试问执行下列指令后累加试问执行下列指令后累加器器A A和和30H30H单元中的内容是什么?单元中的内容是什么?

97、1, MOV A,#0FFH 2,1, MOV A,#0FFH 2,MOV A,#0FHMOV A,#0FHANL A,R0 ANL A,R0 ANL A,30HANL A,30H(A=30H,A=30H,(30H30H)=0AAH=0AAH) (A=0AH,A=0AH,(30H30H)=0AAH=0AAH)3,3,MOV A,#0F0H 4,MOV A,#0F0H 4,MOV A,#80HMOV A,#80HANL A,R0ANL A,R0 ANL 30H,A ANL 30H,A(A=0A0H,A=0A0H,(30H30H)=0AAH=0AAH)()(A=80H,A=80H,(30H30H)

98、=80H=80H)很明显:很明显:ANLANL操作可以从某个存储单元中取出某几位,而把操作可以从某个存储单元中取出某几位,而把其它的为屏蔽掉(清零)。其它的为屏蔽掉(清零)。应用举例(二)已知:已知:M1M1单元有一个单元有一个9 9的的ASCIIASCII码码39H39H,试编程将其变为,试编程将其变为BCDMBCDM码。码。解:解:1 1,使用,使用 ANL ANL direct,#datadirect,#data的指令:的指令: ANL M1,#0FHANL M1,#0FH解:解:2 2,使用,使用 ANL ANL A,#dataA,#data指令。指令。 MOV A,M1MOV A,M

99、1 ANL A,#0FH ANL A,#0FH MOV M1,A MOV M1,A返回本节目录逻辑或运算指令格式:格式:ORL ORL A,RnA,Rn ;A A R n AR n A ORL ORL A,directA,direct ; A A ( (directdirect) A) A OR OR A,RiA,Ri ; A A ( ( R I ) AR I ) A ORL ORL A,#dataA,#data ; A A datadata A A ORL ORL direct,Adirect,A ; (direct) (direct) A A directdirect ORL direct

100、,# data ORL direct,# data ; (direct) (direct) datadata directdirect同与运算一样,上面的指令也可以分为两类:同与运算一样,上面的指令也可以分为两类: 1 1,以,以累加器累加器A A为目标寄存器的逻辑运算指令;为目标寄存器的逻辑运算指令; 2 2,以,以内存单元内存单元为目标的逻辑运算指令。为目标的逻辑运算指令。应用举例设累加器设累加器A=0AAH,P1A=0AAH,P1口口=0FFH=0FFH。试编程将累加器。试编程将累加器A A中的第中的第四位送四位送P1P1口的低四位,而口的低四位,而P1P1口的高四位不变。口的高四位不变

101、。 解:解:MOV R0,AMOV R0,A;累加器;累加器A A中的数据暂存中的数据暂存ANL A,#0FHANL A,#0FH;屏蔽;屏蔽A A的高的高4 4位位ANL P1,#0F0HANL P1,#0F0H;屏蔽;屏蔽P1P1口的低口的低4 4位位ORL P1,AORL P1,A;在;在P1P1口组装口组装MOV A,R0MOV A,R0;恢复累加器;恢复累加器A A的数据的数据【小结小结】:与运算与运算可以可以 “屏蔽屏蔽” 某些位某些位; ;或运算或运算可以可以 “置位置位” 某些位。某些位。返回本节目录逻辑异或运算指令格式:格式:XRL XRL A,RnA,Rn; A A R n

102、 AR n A XRL XRL A,directA,direct ; A A ( (directdirect) A) A XR XR A,RiA,Ri; A A ( ( R I ) AR I ) A XRL XRL A,#dataA,#data; A A datadata A A XRL XRL direct,Adirect,A; (direct) (direct) A A directdirect XRL direct,# data XRL direct,# data; (direct) (direct) datadata directdirect特点:按位运算,相同时为特点:按位运算,相同

103、时为0 0,不同时为,不同时为1 1。使用异或可以。使用异或可以实现将某个字节的数据或将数据的某几位变反。实现将某个字节的数据或将数据的某几位变反。举例已知:外部已知:外部RAMRAM的的30H30H单元中有一个数单元中有一个数AAHAAH,现要将其高,现要将其高4 4位不变,低位不变,低4 4位取反,试编程。位取反,试编程。解解1 1,利用,利用MOVX MOVX A,RiA,Ri指令:指令:MOV R0MOV R0,#30H #30H 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0MOVX AMOVX A,R0 R0 0 0 0 0 1 1 1 10 0 0 0 1 1 1

104、1XRL AXRL A,#0FH #0FH 1 0 1 01 0 1 0 0 1 0 10 1 0 1MOVX R0MOVX R0,A A解解2 2,利用,利用MOVX A,DPTRMOVX A,DPTRMOV DPTRMOV DPTR,#0030H#0030HMOVX AMOVX A,DPTRDPTRXRL AXRL A,#0FH#0FHMOVX DPTRMOVX DPTR,A A返回本节目录累加器清零和取反指令用传送指令可以实现对累加器用传送指令可以实现对累加器A A的清零和取反操作,但是它的清零和取反操作,但是它们都是双字节指令。在们都是双字节指令。在MCS-51MCS-51的指令系统中

105、专门设计了单的指令系统中专门设计了单字节、单周期对累加器清零和取反的指令。字节、单周期对累加器清零和取反的指令。格式:格式:CLR A CLR A ;累加器清零;累加器清零CPL A CPL A ;累加器取反;累加器取反 取反指令可以方便的实现求补操作。取反指令可以方便的实现求补操作。举例:举例:已知已知30H30H单元中有一个数单元中有一个数x x,写出对它求补的程序。,写出对它求补的程序。MOV A,30HMOV A,30HCPL ACPL AINC AINC AMOV 30H,AMOV 30H,A逻辑运算指令应用举例设设X X、Y Y和和Z Z分别存在分别存在X X、Y Y和和Z Z单单

106、元。试编出能实现此电路功能的元。试编出能实现此电路功能的程序,并将结果送入程序,并将结果送入F F单元。单元。解:解: MOV A,XMOV A,XANL A,YANL A,Y ;X X YAYAMOV R1,A MOV R1,A ;送;送R1R1暂存暂存MOV A,YMOV A,YXRL A,ZXRL A,Z ;Y Y ZAZACPL ACPL A ;A A取反取反ORL A,R1ORL A,R1;(X(X Y) Y) ( (Y Y Z)AZ)AMOV F,AMOV F,A ;A AFF+XYZF返回本节目录2.4.3: 移位指令虽然虽然MCS-51MCS-51只有只有5 5条移位指令,条移

107、位指令,但它可以处理所有移位问题。但它可以处理所有移位问题。格式:格式:RL ARL ARR ARR ARLC ARLC ARRC ARRC ASWAP ASWAP A【注意注意】:只能对累加器:只能对累加器A A进行进行移位。移位。A7 A0A7 A0A7 A0CyCyA7 A4A7 A4 A3 A0A3 A0 A7 A0举例(一)已知:在已知:在M1M1和和M1+1M1+1单元有一个单元有一个1616位数(位数(M1M1存低存低8 8位),位),试编程将其扩大试编程将其扩大2 2倍(设结果小于倍(设结果小于6553565535)。)。解:扩大解:扩大2 2倍可以用左移一位来实现。倍可以用左

108、移一位来实现。dataL=11001111dataL=11001111 1001111010011110dataH=0010110dataH=00101100 0 0101100101011001M1M1+11001110101011010程序清单 CLR CCLR C;清除;清除CyCy位位MOV R1,#M1MOV R1,#M1;指针赋值;指针赋值MOV A,R1MOV A,R1;取低;取低8 8位数据位数据RLC ARLC A;循环左移,;循环左移,CyCy进低位,高位进进低位,高位进CyCyMOV R1,AMOV R1,A;移位后数据回送;移位后数据回送INC R1INC R1;指针加

109、一;指针加一MOV A,R1MOV A,R1;取高;取高8 8位数据位数据RLC ARLC A;循环左移;循环左移CyCy进低位进低位MOV R1,AMOV R1,A;数据回送;数据回送举例(二)已知:已知:M1M1、M2M2单元中有单元中有2 2个个BCDBCD码,试编程将其紧缩为码,试编程将其紧缩为一个字节并存入一个字节并存入M1M1单元。单元。解:解:MOV R1,#M1MOV R1,#M1MOV A,R1MOV A,R1SWAP ASWAP AINC R1INC R1ORL A,R1ORL A,R1MOV M1,AMOV M1,A0000BCD10000BCD10000BCD20000

110、BCD2M1M1+1BCD1 0000BCD1 BCD2BCD20000 BCD1返回本章目录累加器A2.5 控制转移和位操作指令 2.5.1 2.5.1 控制转移指令控制转移指令 1 1,无条件转移指令无条件转移指令 2 2,条件转移指令条件转移指令 3 3,子程序调用和返回子程序调用和返回 4 4,空操作指令空操作指令2.5.22.5.2,位操作指令位操作指令 1 1,位传送指令:位传送指令: 2 2,位置位和位清零指令:位置位和位清零指令: 3 3,位运算指令:位运算指令: 4 4,位控制转移指令:位控制转移指令:返回本章目录1,无条件转移指令: 格式:格式: LJMP addr16 L

111、JMP addr16 长转移指令,寻址范围长转移指令,寻址范围6553565535; AJMP addr11 AJMP addr11 绝对转移,寻址范围绝对转移,寻址范围2K2K; SJMP SJMP relrel 短转移,转移范围(短转移,转移范围(+127+127-128-128);); JMP A+DPTR JMP A+DPTR 变址转移,寻址范围变址转移,寻址范围6553565535。02H02Haddr15addr158 8addr7addr70 0a a10108 8 0000100001a a7 7 a a0 080H80Hr e lr e l73H73HLJMP指令(三字节)A

112、JMP指令(双字节)SJMP指令(双字节)JMP指令(单字节)长转移指令:(三字节双周期指令) 指令执行时,指令执行时,将指令码中的将指令码中的addr16addr16送送入入PCPC中,使程序无条件的转向中,使程序无条件的转向addr16addr16所指向的新地址执行程序。所指向的新地址执行程序。【举例举例】: 已知某单片机的监控程序地址为已知某单片机的监控程序地址为A080H,A080H,试问用什么方法使单片机开机试问用什么方法使单片机开机后自动的转向该监控程序?后自动的转向该监控程序?【解解】: 因为单片机上电时,因为单片机上电时,PC=0000H,PC=0000H,所以所以在在0000

113、H0000H单元存放一条单元存放一条LJMP 0A080HLJMP 0A080H 的指令即可。的指令即可。LJMPLJMPA0HA0H80H80HROM0000H0001H0002H0003H绝对转移指令:双字节、双周期指令。双字节、双周期指令。 将将AJMPAJMP指令中的指令中的1111位转移位转移地址替换掉原来地址替换掉原来PCPC中中1616位地址中的低位地址中的低1111位地址。位地址。指令中的指令中的1111位地址,确定了地址的转移范围在位地址,确定了地址的转移范围在2K2K以以内,所以内,所以AJMPAJMP也称也称“ “页内转移页内转移” ”指令。指令。1 0 1 1 0 1

114、0 0 0 0 10 0 0 0 11 0 1 0 0 1 0 11 0 1 0 0 1 0 1 X X X XX X X X X X 1 0 1 1 0 11 0 1 0 0 1 0 11 0 1 0 0 1 0 1A10 a9 a8 操作码 a7 a0AJMP指令PC程序计数器MCS-15MCS-15的的ROMROM系统是以系统是以2K2K为一页来划分程序存为一页来划分程序存储器,这样对于储器,这样对于4K4K的片内的片内ROMROM存储器可以分为存储器可以分为2 2页;片外页;片外64K64K的的ROMROM可以分为可以分为3232页。页。在执行在执行AJMPAJMP指令时,指令时,PC

115、PC的高的高5 5位决定了位决定了ROMROM中中的页地址的页地址;而;而AJMP AJMP 指令的低指令的低1111位地址用来选择位地址用来选择页内地址页内地址。在一般情况下,在一般情况下,AJMPAJMP指令应当与目标地址在同一指令应当与目标地址在同一页内。更具体的说:目标地址应当与页内。更具体的说:目标地址应当与AJMPAJMP指令取指令取出后的出后的PCPC值(值(PC=PC+2) PC=PC+2) 在同一页内。否则转移在同一页内。否则转移将会出现错误。将会出现错误。ROM的64K存储空间的页面(部分)划分表页面页面 PCPC高高5 5位位页页 内内 地地 址址页面页面 PCPC高高5

116、 5位位页页 内内 地地 址址0 0页页 00000000000000H0000H07FFH07FFH 8 8页页 0100001000 4000H4000H47FFH47FFH1 1页页 00001000010800H0800H0FFFH0FFFH 9 9页页 0100101001 4800H4800H4FFFH4FFFH2 2页页 00010000101000H1000H17FFH17FFH 1010页页 0101001010 5000H5000H57FFH57FFH3 3页页 00011000111800H1800H1FFFH1FFFH 1111页页 01011010115800H580

117、0H5FFFH5FFFH4 4页页 00100001002000H2000H27FFH27FFH 1212页页 0110001100 6000H6000H67FFH67FFH5 5页页 00101001012800H2800H2FFFH2FFFH 1313页页 0110101101 6800H6800H6FFFH6FFFH6 6页页 00110001103000H3000H37FFH37FFH 1414页页 01110011107000H7000H77FFH77FFH7 7页页 00111001113800H3800H3FFFH3FFFH 1515页页 01111011117800H7800H

118、7FFFH7FFFHROM的64K存储空间的页面示意图 : : : :AAA:MOV A,R0 MOV R1,A : : AJMP AAA0100H07FEH000001111111 11111110 PC值000010000000 00000000 PC+2值000010010000 00000000 AJMP指令中的11位地址原本AJMP指令要转到本页的 0100H 单元但是由于 PC 的高5位页面地址发生了变化使AJMP指令实际转到下一页 0900H单元。最后PC值发生跨页错误AJMPAJMP转一指令是用来做页内转一指令是用来做页内2K2K范围的转移,如果范围的转移,如果使用不当,会发生

119、错误的使用不当,会发生错误的“ “跨页跨页” ”操作。操作。产生跨页的原因是产生跨页的原因是AJMPAJMP指令处于每一页的最后两指令处于每一页的最后两个单元的结果,所以避免这种现象的方法就是不个单元的结果,所以避免这种现象的方法就是不要在每一页的最后两个单元使用要在每一页的最后两个单元使用AJMPAJMP指令。指令。如果目标地址如果目标地址与与AJMPAJMP地址不再同一页内,建议使地址不再同一页内,建议使用用LJMPLJMP指令替代指令替代AJMPAJMP。使用使用AJMPAJMP指令时,指令时,1111位的绝对地址可以用符号地位的绝对地址可以用符号地址取代址取代正确使用AJMP转移指令短

120、转移SJMP指令格式格式:SJMP SJMP relrel relrel 为偏移量(为偏移量( +127+127-128-128)relrel(偏移量)的计算公式:(偏移量)的计算公式: relrel= =目标地址目标地址 源地址源地址 2 2 (其中:(其中:2 2为为SJMPSJMP指令的指令的长长度)度)【例例1 1】:如:如图图,要,要转转到到0116H0116H时时: relrel=0116H-0110H-2=04H=0116H-0110H-2=04H【例例2 2】:要:要转转到到0109H0109H时时: relrel=0109H-0110H-2=F7H=0109H-0110H-2

121、=F7H(-9-9)实际编实际编程程时时,使用符号地址取代,使用符号地址取代relrel以以简简化化计计算,在算,在汇编时汇编时由由汇编汇编程序来程序来计计算算relrel。SJMPSJMPrelrelPCPC+20109H0110H0116H变址转移指令格式:格式:JMP A+DPTR JMP A+DPTR 单字节操作码为单字节操作码为73H73H特点:特点:转移地址由累加器转移地址由累加器A A的内容与的内容与DPTRDPTR相加形成。相加形成。用途:用途:用来制作一个多分支的转移结构。用来制作一个多分支的转移结构。【举例举例】: :MOV DPTR,#TABLE ;MOV DPTR,#T

122、ABLE ;指针赋表头地址指针赋表头地址JMP A, DPTR JMP A, DPTR ;转移地址由;转移地址由A+DPTRA+DPTR产生产生TABLE:TABLE:AJMP ROUT0AJMP ROUT0 ;多分支转移表;多分支转移表AJMP ROUT1AJMP ROUT1AJMP ROUT1AJMP ROUT1AJMP ROUT2AJMP ROUT2 : : : :返回2,条件转移指令:(1 1)累加器)累加器A A判零转移指令判零转移指令(双字节指令)(双字节指令)JZ JZ relrel;若;若A=0,A=0,则则PC=PC+2+relPC=PC+2+rel;若;若A A0 0,则,

123、则PC=PC+2PC=PC+2 JNZ JNZ relrel;若;若A A0,0,则则PC=PC+2+relPC=PC+2+rel;若;若A A= =0 0,则,则PC=PC+2PC=PC+2(2 2)比较条件转移指令(比较条件转移指令(3 3字节)字节) a=dataa=data时:时:PC+3PC+3PC,Cy=0PC,Cy=0CJNE A, #CJNE A, #data,reldata,rel adataadata时:时:PC+3+rel,Cy=0PC+3+rel,Cy=0CJNE CJNE Rn,#data,relRn,#data,rel adataaYXY时;时; 若若Cy=1 Cy

124、=1 则则XY X00时,同无符号数相同;时,同无符号数相同;b,b,当当x x、y y均均00,y0,yy;xy;d,d,当当x0x0y0时时,xy;,x0?Y0?Y0?Cy0?XYYNYYYNNN(3)减一条件转移指令1, DJNZ 1, DJNZ Rn,relRn,rel;Rn-1;Rn-1Rn,Rn,若若RnRn00则则PC+2+relPC+2+relPCPC 若若RnRn=0=0则则PC+2PC+2PCPC2, 2, DJNZ DJNZ direct,reldirect,rel ;(direct)-1 ;(direct)-1direct,direct, 若若(direct)(dire

125、ct)00则则PC+3+relPC+3+relPCPC 若若(direct)(direct)= 0= 0则则PC+3PC+3PCPC注意:第一条指令注意:第一条指令为为双字双字节节,第二条指令,第二条指令为为三字三字节节。 指令本身先做一个指令本身先做一个带带回送的减一运算操作,然后回送的减一运算操作,然后 根据运算的根据运算的结结果是否果是否为为零作零作为转为转移的条件移的条件应用举例令片内令片内RAMRAM中中DATADATA为起始地址的数据块中连续为起始地址的数据块中连续1010个无符号数相加,个无符号数相加,并把和送到并把和送到SUNSUN单元(设其和小于单元(设其和小于256256)

126、。)。ORG 1000HORG 1000HSTART:START: MOV R2,#0AHMOV R2,#0AH; ;数据块长度数据块长度1010送计数器送计数器R2R2MOV R0,#DATAMOV R0,#DATA; ;数据块起始地址送指针数据块起始地址送指针R0R0CLR ACLR A; ;累加器清零累加器清零LOOP:LOOP: ADD A,R0ADD A,R0; ;累加部分和累加部分和INC R0INC R0DJNZ R2,LOOPDJNZ R2,LOOP; ;若若R2-1R2-100则转则转LOOPLOOP继续继续MOV SUN,AMOV SUN,A; ;存累加和存累加和SJMP

127、$SJMP $; ;停机停机ENDEND这是一个循环结构的程序,这是一个循环结构的程序,DJNZDJNZ指令又是决定整个循环是否结束的指令又是决定整个循环是否结束的控制语句。控制语句。 返回3,子程序调用和返回指令(一)子程序调用指令:一)子程序调用指令: 1 1,短调用指令,短调用指令 ACALL addr11 ACALL addr11 2, 2, 长调用指令长调用指令 LCALL addr16LCALL addr16 (二)返回指令:(二)返回指令:(一)调用指令1 1,短调用指令,短调用指令 ACALL addr11ACALL addr11 PC+2PC+2PCPCSP+1SP, PCS

128、P+1SP, PC7 70 0(SP)(SP)SP+1SP, PCSP+1SP, PC15158 8(SP)(SP)addr11 PCaddr11 PC10100 0 2, 2, 长调用指令长调用指令 LCALL addr16LCALL addr16PC+3PC+3PCPCSP+1SP, PCSP+1SP, PC7 70 0(SP)(SP)SP+1SP, PCSP+1SP, PC15158 8(SP)(SP)addr16 PCaddr16 PC子程序的调用包含两子程序的调用包含两部分内容部分内容:a, a, 实现转入子程序的入实现转入子程序的入口地址;口地址;这主要由调这主要由调用语句中的用语

129、句中的addr11addr11或或addr16 addr16 实现。实现。b,b,子程序完成后,能够子程序完成后,能够自动的返回;自动的返回;这是由这是由调用语句执行时依靠调用语句执行时依靠堆栈操作已经将返回堆栈操作已经将返回地址压栈保存,带返地址压栈保存,带返回时弹出送回时弹出送PCPC实现实现的。的。(二)返回指令格式:格式:RET RET (子程序返回(子程序返回 操作码:操作码:22H22H) 操作操作: : (SP)(SP) PC15 PC158 8 , , SP-1SPSP-1SP (SP)(SP) PC 7 PC 70 0 , , SP-1SPSP-1SP格式:格式:RETI R

130、ETI (中断子程序返回(中断子程序返回 操作码:操作码:32H32H) 操作操作: : (SP)(SP) PC15 PC158 8 , , SP-1SPSP-1SP (SP)(SP) PC 7 PC 70 0 , , SP-1SPSP-1SP RETI RETI与与RETRET的区的区别别在于返回主程序后,在于返回主程序后,RETIRETI还还要清除相要清除相应应的中断的中断优优先先级级状状态态位,使系位,使系统统响响应应低低优优先先级级的中断。的中断。返回4,空操作指令格式:格式: NOP NOP (单字节(单字节 操作码:操作码:00H00H)功能:仅使程序计数器功能:仅使程序计数器PC

131、PC加一,消耗加一,消耗1212个时钟周个时钟周期,所以时常用作延时。期,所以时常用作延时。返回位操作指令的特点特点:特点:操作数不是字节,而是某一位。每位的取操作数不是字节,而是某一位。每位的取值只能是值只能是“ “0”0”或或“ “1”1”,因而也称之为布尔变量,因而也称之为布尔变量操作。操作。布尔变量存在于片内布尔变量存在于片内RAMRAM的位寻址区的位寻址区(20H(20H2FH)2FH)、1111个可以按位寻址的个可以按位寻址的SFRSFR。返回1,位传送指令:格式:格式:MOV C , bit MOV C , bit 其中:其中:C C为为PSWPSW中的中的CyCy; MOV b

132、it , CMOV bit , C bitbit为布尔变量的位地址。为布尔变量的位地址。举例举例:试将:试将00H00H位和位和7FH7FH位中的内容互换。位中的内容互换。 【解解】:两个位互换必须找一个位作为缓冲位。:两个位互换必须找一个位作为缓冲位。MOV C,00HMOV C,00H MOV 01H,C MOV 01H,CMOV C,7FHMOV C,7FHMOV 00H,CMOV 00H,CMOV C,01HMOV C,01HMOV 7FH,CMOV 7FH,C返回2,位置位和位清零指令:格式:格式:CLR CCLR C;0 0CyCyCLR bitCLR bit; 0 0( bit

133、)( bit )SETB CSETB C;1 1CyCySETB bitSETB bit;1 1( bit )( bit )返回3,位运算指令:格式:格式:ANL C, bitANL C, bit;C C ( bit bit ) C C ANL C, /bit ANL C, /bit ;C C / /(bit bit ) C CORL C, bitORL C, bit;C C ( bit bit ) C CORL C, /bitORL C, /bit;C C / /( bit bit ) C CCPL CCPL C;/C /C C CCPL bitCPL bit;/(bit) /(bit) b

134、itbit返回4,位控制转移指令:(一)以(一)以CyCy内容为条件的转移指令内容为条件的转移指令格式:格式:JC JC relrel ;若;若Cy=1,Cy=1,则则PC+2+relPC+2+relPCPC ;若若Cy=0,Cy=0,则则PC+2PC+2PCPC JNC JNC relrel ;若;若Cy=0,Cy=0,则则PC+2+relPC+2+relPCPC ;若若Cy=1,Cy=1,则则PC+2PC+2PCPC(二)以位地址为内容为条件的转移指令(二)以位地址为内容为条件的转移指令格式:格式:JB bit ,JB bit ,relrel ;若(;若(bitbit)=1,=1,则则PC

135、+3+relPC+3+relPCPC ;若(;若(bitbit)=0,=0,则则PC+3PC+3PCPC JNB bit , JNB bit ,relrel ;若(;若(bitbit)=0,=0,则则PC+3+relPC+3+relPCPC ;若(;若(bitbit)=1,=1,则则PC+3PC+3PCPC JBC bit , JBC bit ,relrel ;若(若(bitbit)=1,=1,则则PC+3+relPC+3+relPC,0bitPC,0bit ;若(若(bitbit)=0,=0,则则PC+3PC+3PCPC位操作指令应用举例(一)已知:内部已知:内部RAM RAM 的的M1M1

136、、M2M2单元各有两个无符号的单元各有两个无符号的8 8位数。位数。试编程比较其大小,并将大数送试编程比较其大小,并将大数送MAXMAX单元。单元。 【解解】: : MOV A,M1MOV A,M1;操作数;操作数1 1送累加器送累加器A ACJNE A,M2,LOOPCJNE A,M2,LOOP ;两个数相比较;两个数相比较LOOP:LOOP:JNC LOOP1JNC LOOP1;M1=M2M1=M2时转时转LOOP1LOOP1MOV A,M2MOV A,M2;M1M2M1M2时,取时,取M2M2到到A ALOOP1:LOOP1:MOV MAX,AMOV MAX,A;A A中数据送中数据送M

137、AXMAX单元单元【说明说明】:1,1,第第2 2条指令作为比较指令使用,不论结果都转条指令作为比较指令使用,不论结果都转LOOPLOOP 2, 2,第第3 3条指令是一条位控转移指令,根据条指令是一条位控转移指令,根据CyCy的状态控制的状态控制 转移。转移。位操作指令应用举例(二)已知:在已知:在20H20H单元中有一个数单元中有一个数X X,若,若X50X50X50则转向则转向LOOP3LOOP3,试编程。,试编程。【解解】:MOV A,20HMOV A,20H ;XAXACJNE A,#50H,COMP CJNE A,#50H,COMP ;A;A50H50H时转时转COMPCOMPSJ

138、MP LOOP2SJMP LOOP2 ;A=50H;A=50H时转时转LOOP2LOOP2COMP:COMP:JNC LOOP3JNC LOOP3 ;A50H;A50H时转时转LOOP3LOOP3LOOP1:LOOP1: : : : : : : : : : :LOOP2: : :LOOP2: : : : : : : : :LOOP3: : :LOOP3: : : : :位操作指令应用举例(三)已知:外部已知:外部RAMRAM的的2000H2000H开始有一个输入数据缓开始有一个输入数据缓冲区,数据区以回车符冲区,数据区以回车符CRCR(对应的(对应的ASCIIASCII码为码为0DH0DH)为

139、结束标志,试编程将正数送)为结束标志,试编程将正数送30H30H开始的开始的单元、负数送单元、负数送40H40H开始的单元。开始的单元。2000H数据缓冲区30H40H正数存储区负数存储区片外RAM内部RAMMOV DPTR,#2000HMOV DPTR,#2000H;缓冲区指针赋初值;缓冲区指针赋初值MOV R0,#30HMOV R0,#30H;正数区指针赋初值;正数区指针赋初值MOV R1,#40HMOV R1,#40H;负数区指针赋初值;负数区指针赋初值NEXT:NEXT:MOVX A,DPTRMOVX A,DPTR;从外部;从外部RAMRAM缓冲区取数缓冲区取数CJNE A,#0DH,

140、COMPCJNE A,#0DH,COMP;若;若A A0DH0DH转转COMPCOMPSJMP DONESJMP DONE;A=0DHA=0DH时,结束时,结束COMP:COMP:JB ACC.7,LOOPJB ACC.7,LOOP;数据为负时转;数据为负时转LOOPLOOPMOV R0,AMOV R0,A;正数处理;正数处理INC R0INC R0;修改指针;修改指针INC DPTRINC DPTRSJMP NEXTSJMP NEXT;返回继续;返回继续LOOP:LOOP:MOV R1,AMOV R1,A;负数处理;负数处理INC R1INC R1;修改指针;修改指针INC DPTRINC DPTRSJMP NEXTSJMP NEXT;返回继续;返回继续DONE:DONE: RETRET;结束;结束返回

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号