资源预览内容
第1页 / 共124页
第2页 / 共124页
第3页 / 共124页
第4页 / 共124页
第5页 / 共124页
第6页 / 共124页
第7页 / 共124页
第8页 / 共124页
第9页 / 共124页
第10页 / 共124页
亲,该文档总共124页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
嵌入式系统设计摘自其他学校单片机讲义摘自其他学校单片机讲义实验准备(实验准备(MCS-51汇编指令)汇编指令)1 1感谢你的观看感谢你的观看20192019年年6 6月月9 9第二章:MCS-51单片机指令系统2.1 概述2.2 寻址方式 2.3 数据传送指令2.4 算逻运算和移位指令2.5 控制转移和位操作指令2 2感谢你的观看感谢你的观看20192019年年6 6月月9 92.1:MCS-51指令系统的概述 MCS-51 MCS-51共有共有111111条指令,指令的长度和执行时条指令,指令的长度和执行时间因不同的指令而各不相同。间因不同的指令而各不相同。2.1.1 2.1.1 指令格式指令格式2.1.22.1.2 指令的三种表示形式指令的三种表示形式2.1.3 2.1.3 指令的字节数指令的字节数2.1.42.1.4 指令的分类指令的分类继续3 3感谢你的观看感谢你的观看20192019年年6 6月月9 92.1.1 指令格式:指令格式:既指令的结构形式。指令格式:既指令的结构形式。OPOPDATADATA 或或 ADDRESSADDRESS操作码操作码操作数或操作数地址操作数或操作数地址由操作码和操作数(或操作数地址)构成指令的结构。举例:MOV A,#0FFH ADD A,R0返回4 4感谢你的观看感谢你的观看20192019年年6 6月月9 9指令的表示形式是识别指令的标志。指令的表示形式是识别指令的标志。1 1,二进制的表示形式:,二进制的表示形式:(以(以“ “累加器的内容累加器的内容+08H+08H” ”为例)为例) 00100100B 00100100B 操作码操作码 OP OP (加法)(加法) 00001000B 00001000B 操作数操作数DATADATA(08H08H)特点:特点: 能被能被CPUCPU直接识别、运行的形式。也称机器码、汇编语直接识别、运行的形式。也称机器码、汇编语 言的目标代码。言的目标代码。缺点:缺点:不便于阅读、记忆和调试修改。不便于阅读、记忆和调试修改。2.1.2 指令的三种表示形式:5 5感谢你的观看感谢你的观看20192019年年6 6月月9 92 2,十六进制表示方式:,十六进制表示方式: 它是对二进制形式的一种简化。它是对二进制形式的一种简化。 00100100B 00100100B 24H24H 00001000B 00001000B 08H08H 在实验室等少数环境下,可以将这种形式作为输入程序在实验室等少数环境下,可以将这种形式作为输入程序的一种辅助手段。但是,这种形式的指令格式必须由对应的一种辅助手段。但是,这种形式的指令格式必须由对应的监控程序把它们翻译成二进制的的监控程序把它们翻译成二进制的“ “机器码机器码” ”后存入程序后存入程序存储器并运行。存储器并运行。二进制表示的形式 十六进制表示的形式6 6感谢你的观看感谢你的观看20192019年年6 6月月9 93 3,指令的,指令的“助记符助记符”方式(也称方式(也称“汇编格式汇编格式”):): 00100100B00100100B 24H24H 00001000B 00001000B 08H 08H ADD AADD A,#08H#08H 1 1,这是一种由,这是一种由英文单词英文单词或或字母字母、数字数字来表征指令功能的来表征指令功能的 形式。是一种便于阅读、书写和交流的表示形式。形式。是一种便于阅读、书写和交流的表示形式。 2 2,这种,这种 “ “汇编汇编” ”格式的指令必须把它格式的指令必须把它“ “翻译翻译” ”为二进制为二进制形式形式 “ “机器码机器码” ”后才能为后才能为CPUCPU所识别和执行。所识别和执行。 3 3,三种不同的表示方法适用于不同的场合。,三种不同的表示方法适用于不同的场合。 本章内容都以汇编的形式介绍指令系统。本章内容都以汇编的形式介绍指令系统。二进制表示形式 十六进制表示 汇编格式返回7 7感谢你的观看感谢你的观看20192019年年6 6月月9 92.1.3 指令的字节数 在在MCS-51MCS-51单片机的指令系统中,因指令操作码和操作数单片机的指令系统中,因指令操作码和操作数的不同,指令(在存储器中)长度也各不相同。的不同,指令(在存储器中)长度也各不相同。 分为单字节、双字节和三字节。分为单字节、双字节和三字节。单字节指令(单字节指令(4949条)条):分分无操作数无操作数、有操作数有操作数两种。两种。 无操作数:无操作数:如如 INC DPTR 10100011BINC DPTR 10100011B INC A 00000100B INC A 00000100B 【特点特点】:操作数隐含在操作码中。:操作数隐含在操作码中。 含有含有操作数寄存器名称操作数寄存器名称的单字节指令:的单字节指令: 如:如:MOV AMOV A,R0 11101R0 11101000000B B MOV AMOV A,R1R1 1110111101001001B B 【特点特点】:寄存器名以三位数代码的形式在指令的后三位。:寄存器名以三位数代码的形式在指令的后三位。8 8感谢你的观看感谢你的观看20192019年年6 6月月9 9双字节指令(双字节指令(4646条):条): 指令的操作码和操作数各占一个字节。指令的操作码和操作数各占一个字节。 如:如: MOV A,#dataMOV A,#data 01110100B data 01110100B data 很明显:很明显:8 8位的操作数本身占据一个字节。位的操作数本身占据一个字节。程序存储器程序存储器0111010001110100datadatann+1mov a,#datamov a,#data双字节指令在程序存储器的存放示意图9 9感谢你的观看感谢你的观看20192019年年6 6月月9 9三字节指令(三字节指令(1616条):条): 指令中的操作数为双字节。如:指令中的操作数为双字节。如: MOV DPTR,#data16MOV DPTR,#data16 1001000B,data15-8,data7-01001000B,data15-8,data7-0 或者:指令中分别包含或者:指令中分别包含1 1个字节的操作数和个字节的操作数和1 1个字节的操作个字节的操作数地址。如:数地址。如: MOV direct,#dataMOV direct,#data 举例:举例:MOV 20H,#0FFHMOV 20H,#0FFH 1001000010010000data15-8data15-8data8-0data8-0MOV dptr,#data16OP (75H)OP (75H)direct (20H)direct (20H)data (FFH)data (FFH)MOV direct,#data三字节指令在存储器中存放的方式示意图1010感谢你的观看感谢你的观看20192019年年6 6月月9 9指令的字节数与指令的运行时间指令的字节多是否意味着指令周期就长?指令的字节多是否意味着指令周期就长?指指 令令字节数字节数周期数周期数指令说明指令说明 MOV AMOV A,R0R01 11 1R0R0内容送累加器内容送累加器A AMOV AMOV A,#0FFH#0FFH2 21 1立即数立即数FFHFFH送送A AMOV 20HMOV 20H,#30H#30H3 32 2立即数立即数30H30H送内存送内存20h20h单元单元MUL ABMUL AB1 14 4乘法指令乘法指令INC DPTRINC DPTR1 11 11616位寄存器位寄存器DPTRDPTR加一加一从表中可见,指令的字节数与指令周期不是对等的关系返回1111感谢你的观看感谢你的观看20192019年年6 6月月9 92.1.4 指令的分类 MCS-51 MCS-51单片机的指令如果按功能划分可以分为五类:单片机的指令如果按功能划分可以分为五类:1,1,数据传送类指令:数据传送类指令:完成数据在单片机内部之间的传送。完成数据在单片机内部之间的传送。 分为分为8 8位数和位数和1616位两种。除了奇偶位外,指令的执行对位两种。除了奇偶位外,指令的执行对 PSWPSW无影响。无影响。2,2,算术运算指令:算术运算指令:用于操作数之间的加、减、乘除运算。用于操作数之间的加、减、乘除运算。 【特点特点】:多数情况下:操作数之一在累加器:多数情况下:操作数之一在累加器A A中,结果中,结果也保留在也保留在A A中,运算结果要影响中,运算结果要影响PSWPSW(进位标志、奇偶和(进位标志、奇偶和溢出标志等)。溢出标志等)。3,3,逻辑操作逻辑操作和和循环移位指令:循环移位指令:操作数之间的逻辑加、逻辑操作数之间的逻辑加、逻辑与、取反和异或等操作。多数情况下一个操作数在与、取反和异或等操作。多数情况下一个操作数在A A中,中,结果也存于结果也存于A A。移位指令分为左移、右移和带进位和不带。移位指令分为左移、右移和带进位和不带进位几种情况。与算术类指令相比逻辑类指令基本不影响进位几种情况。与算术类指令相比逻辑类指令基本不影响PSWPSW的内容。的内容。1212感谢你的观看感谢你的观看20192019年年6 6月月9 94,4,控制转移类指令:控制转移类指令:条件转移、无条件转移,调用和返回。条件转移、无条件转移,调用和返回。 【 特点特点】:通过修改程序指针:通过修改程序指针PCPC的内容,使的内容,使CPUCPU转到另一转到另一处执行,从而改变程序的流向。处执行,从而改变程序的流向。5 5,位操作指令:,位操作指令:位传送、位置位、位运算和位控制转移等位传送、位置位、位运算和位控制转移等操作。操作。 【 特点特点】:按位操作而不是按字节的操作。位控转移的判:按位操作而不是按字节的操作。位控转移的判断不是检测某一个字节而是对某一个位进行检测并决定是断不是检测某一个字节而是对某一个位进行检测并决定是否进行程序转移。否进行程序转移。 这类指令基本不影响这类指令基本不影响PSWPSW的内容。的内容。返回1313感谢你的观看感谢你的观看20192019年年6 6月月9 92.2 寻址方式在指令的操作数位置上,用于在指令的操作数位置上,用于表征、寻找操作数的方式表征、寻找操作数的方式定义定义为为“ “寻址方式寻址方式” ”。正确的理解、掌握寻址方式,是学习、使用指令的关键正确的理解、掌握寻址方式,是学习、使用指令的关键。在在MCS-51MCS-51单片机中,共使用了七种寻址方式。单片机中,共使用了七种寻址方式。 它们分别是:它们分别是: 1,1,寄存器寻址寄存器寻址 5,5,变址寻址变址寻址; 2,2,直接寻址直接寻址 6,6,相对寻址相对寻址; 3,3,立即数立即数寻址寻址 7,7,位寻址位寻址。 4,4,寄存器间接寻址寄存器间接寻址 继续1414感谢你的观看感谢你的观看20192019年年6 6月月9 92.2.1寄存器寻址当所需要的当所需要的操作数操作数在内部某一个寄存器在内部某一个寄存器RnRn中时,将此寄存器中时,将此寄存器名名RnRn直接写在指令的操作数的位置上。如:直接写在指令的操作数的位置上。如: MOV A,MOV A,R7 R7 ;将寄存器;将寄存器R7R7中的内容送累加器中的内容送累加器A A中。中。 MOV MOV 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=111,=111,既指令的机器码为:既指令的机器码为:0EFH0EFH1 1 1 0 1 r r r操作码寄存器代码返回E8HEFHMOV A,RnMOV A,Rn1515感谢你的观看感谢你的观看20192019年年6 6月月9 92.2.2 直接寻址l l指令本身含有操作数的指令本身含有操作数的8 8位或位或1616位地址。既指令位地址。既指令直接直接给给出了操作数的地址。如:出了操作数的地址。如: MOV A,MOV A,30H30H ; ;将将RAM30HRAM30H单元内容送累加器单元内容送累加器 这里这里30H30H是操作数在是操作数在RAMRAM中的地址。中的地址。l l很明显,直接寻址的指令长度是两个或三个字节。很明显,直接寻址的指令长度是两个或三个字节。程序程序ROMROMOPOP30H30H数据数据RAMRAM操作数操作数x xnn+130H累加器A直接寻址示意图1616感谢你的观看感谢你的观看20192019年年6 6月月9 9使用直接寻址应注意的三个问题:1,1,指令助记符中指令助记符中directdirect是用是用1616进制数表示的操作数地址。进制数表示的操作数地址。 当地址恰好在当地址恰好在SFRSFR区域时区域时, ,指令也可以用寄存器名来表示。指令也可以用寄存器名来表示。 如:如: MOV A,80HMOV A,80H 可以写成可以写成 MOV A,P0MOV A,P0 后者用后者用SFRSFR中寄存器的名字取代它的物理地址中寄存器的名字取代它的物理地址80H80H。很明显,后者更容易阅读和交流,很明显,后者更容易阅读和交流,所以我们提倡使用所以我们提倡使用SFRSFR中寄存器名称来代替直接地址中寄存器名称来代替直接地址。 如:如:MOV A,SBUFMOV A,SBUF ;串口数据缓冲器数据送;串口数据缓冲器数据送A A MOV IE,#00H MOV IE,#00H ;初始化中断允许寄存器;初始化中断允许寄存器 MOV TH1,#0FEHMOV TH1,#0FEH ;为定时器;为定时器1 1赋初值赋初值 尽管使用尽管使用SFRSFR的寄存器名称来取代直接地址,可以带的寄存器名称来取代直接地址,可以带来程序的可读性,但是在汇编时,仍要将寄存器名字转换来程序的可读性,但是在汇编时,仍要将寄存器名字转换为直接地址。为直接地址。1717感谢你的观看感谢你的观看20192019年年6 6月月9 92,2,当直接地址时在工作寄存器区中时,可以使用两种寻址当直接地址时在工作寄存器区中时,可以使用两种寻址方式来访问。方式来访问。 如:如: MOV A,00HMOV A,00H ;将;将RAMRAM中中00H00H单元数据送累加器单元数据送累加器A A MOV A,R0MOV A,R0 ;将工作寄存器;将工作寄存器R0R0的内容送累加器的内容送累加器A A 这里使用了不同的寻址方式,其指令的结构也不相同。这里使用了不同的寻址方式,其指令的结构也不相同。 前者是:前者是:11100101(0E5H)11100101(0E5H)、0000000000000000(00H00H) 双字节。双字节。 后者的机器码是:后者的机器码是:11101000(0E8H)11101000(0E8H) 单字节单字节; ; 在物理结构上,在物理结构上,R0R0与与RAMRAM的的00H00H单元恰好是同一单元,单元恰好是同一单元,所以不同的指令而执行结果是一样的。所以不同的指令而执行结果是一样的。 类似的还有累加器类似的还有累加器A A: INC AINC A 寄存器寻址方式(单字节);寄存器寻址方式(单字节); INC ACCINC ACC 直接寻址方式(双字节);直接寻址方式(双字节); INC 0E0HINC 0E0H 直接寻址方式(双字节)。直接寻址方式(双字节)。 1818感谢你的观看感谢你的观看20192019年年6 6月月9 93,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中。中。1919感谢你的观看感谢你的观看20192019年年6 6月月9 9片内 RAM(20H-2FH)中的位寻址区结构图7F7F7E7E7D7D7C7C7B7B7A7A79797878777776767575747473737272717170706F6F6E6E6D6D6C6C6B6B6A6A69696868676766666565646463636262616160605F5F5E5E5D5D5C5C5B5B5A5A59595858575756565555545453535252515150504F4F4E4E4D4D4C4C4B4B4A4A49494848474746464545444443434242414140403F3F3E3E3D3D3C3C3B3B3A3A39393838373726262525242423232222212120202F2F2E2E2D2D2C2C2B2B2A2A29292828272726262525242423232222212120201F1F1E1E1D1D1C1C1B1B1A1A19191818171716161515141413131212111110100F0F0E0E0D0D0C0C0B0B0A0A09090808070706060505040403030202010100002FH20H字节地址返回24H位地址返回前一次2020感谢你的观看感谢你的观看20192019年年6 6月月9 92.2.3立即寻址指令本身直接含有所需要的指令本身直接含有所需要的8 8位或位或1616位的操作数。位的操作数。 将此数称为将此数称为“ “立即数立即数” ”(使用(使用# #标明)。如:标明)。如: 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 指令执行流程90H90H20H20H00H00HROMDPTRMOV DPTR,#2000H指令的存储和执行返回2121感谢你的观看感谢你的观看20192019年年6 6月月9 92.2.4 寄存器间接寻址指令中含有指令中含有保存操作数地址的保存操作数地址的寄存器寄存器RiRi。 MOV A,RiMOV A,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【注意【注意】MOV A,R0MOV A,R0 和和 MOV A,R0MOV A,R0 指令的区指令的区别别。ROMROM111001111100110 0RAMRAMx x30H30H30HR000H累加器A1232222感谢你的观看感谢你的观看20192019年年6 6月月9 9使用寄存器间址指令时应注意的三个问题:1,1,间址寄存器间址寄存器RiRi只能使用只能使用R0R0、R1R1寄存器(寄存器(i=0i=0、1 1)。)。2,2,间址方式不仅用于片内间址方式不仅用于片内RAMRAM,同样也适用于片外,同样也适用于片外RAMRAM。 对于片内对于片内RAMRAM使用使用RiRi寄存器,寻址范围为寄存器,寻址范围为00H00HFFHFFH。 对于片外对于片外RAMRAM,可以使用,可以使用RiRi,也可以使用,也可以使用DPTRDPTR做间址寄做间址寄存器。两者区别在于后者寻址范围为存器。两者区别在于后者寻址范围为0000H0000HFFFFHFFFFH,两,两者都可以者都可以RAMRAM和和ROMROM。3 3,间址方式的指令不能访问,间址方式的指令不能访问SFRSFR中的单元。如下面的程序中的单元。如下面的程序是错误的:是错误的: MOV R1,#80HMOV R1,#80H MOV A,R1 MOV A,R1 (因为(因为80H80H为为SFRSFR的物理地址)的物理地址)2323感谢你的观看感谢你的观看20192019年年6 6月月9 9MCS-51 片内 、片外 数据存储器示意图 特殊功能寄存器SFR通用数据存储器80H7FH00HFFH片内数据存储器 片外数据存储器256B个字节 64KB个字节片外数据存储器64KB0000HFFFFH注意:1,访问片内RAM20H存储单元;MOV A,20H2,访问片外RAM存储单元; MOV R0,#20HMOVX A,R03,尽管片内与片外的RAM单元 的00H-FFH地址相重叠但由于指令的不同不会发生地址混乱。返回2424感谢你的观看感谢你的观看20192019年年6 6月月9 92.2.5 变址寻址指令使用指令使用DPTRDPTR或或PCPC中的内容作为基地址,再与累加器中的内容作为基地址,再与累加器A A的内容相加,其和作为操作数地址。如:的内容相加,其和作为操作数地址。如: MOVX A,A+PC MOVX A,A+PC ;PCPC内容与内容与A A的内容相加得操作数地址的内容相加得操作数地址 并将此操作数送并将此操作数送A A MOVX A,A+DPTRMOVX A,A+DPTR;DPTRDPTR内容与内容与A A的内容相加得操作数的内容相加得操作数 地址并将此操作数送地址并将此操作数送A A使用变址指令时,要事先分别为使用变址指令时,要事先分别为A A、DPTRDPTR赋值,以便获赋值,以便获得操作数得地址。得操作数得地址。2525感谢你的观看感谢你的观看20192019年年6 6月月9 9变址指令只适用于对变址指令只适用于对ROMROM存储器得访问,如查表等。存储器得访问,如查表等。【举例】:【举例】:已知已知ROMROM中中0302H0302H 单元有一个数单元有一个数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 A2626感谢你的观看感谢你的观看20192019年年6 6月月9 9变址寻址示意图02H0300HROMROM X XALU0302H累加器ADPTR0300H+ 02H0302HMOVC A,A+DPTRMOVC A,A+DPTR返回2727感谢你的观看感谢你的观看20192019年年6 6月月9 92.2.6 相对寻址转移指令中使用的一种寻址方式。转移指令中使用的一种寻址方式。MCS-51MCS-51单片机的指令单片机的指令系统中,有两类转移指令:系统中,有两类转移指令:相对转移(相对转移( 2 2个或个或3 3个字节)个字节) 绝对转移(绝对转移(3 3个字节)。个字节)。 在在绝对转移指令绝对转移指令中中,指令直接给出转移的目标地址,指令直接给出转移的目标地址(2 2字节地址),执行时将目标地址直接送给字节地址),执行时将目标地址直接送给PCPC,从而控,从而控制程序转移;制程序转移; 而而相对转移指令相对转移指令在执行中是将在执行中是将PCPC值与指令中的值与指令中的8 8位偏位偏移量进行相加,形成指令要转移的目标地址。移量进行相加,形成指令要转移的目标地址。 SJMP relSJMP rel由指令中有一个由指令中有一个8 8位偏移量位偏移量 relrel 为带符号位的补码,所以控为带符号位的补码,所以控制程序转移的范围为制程序转移的范围为+127+127-128-128。2828感谢你的观看感谢你的观看20192019年年6 6月月9 954H2002H程序存储程序存储器器ROMROM80H80H54H54H ALU2056H累加器APC2002H+ 54H2056H操作码偏移量例如:SJMP 54H ;(80H、54H)2000H2002H(LOOP1)2929感谢你的观看感谢你的观看20192019年年6 6月月9 9相对寻址使用中应注意的问题相对寻址使用中应注意的问题 与绝对寻址相比,相对寻址具有很好的与绝对寻址相比,相对寻址具有很好的“ “浮动性浮动性” ”,因此是编程人员普遍使用的一种寻址方式。因此是编程人员普遍使用的一种寻址方式。 使用时,要注意使用时,要注意3 3点:点:1,CPU1,CPU进行地址计算时,进行地址计算时,PCPC取值是执行本指令后的地址取值是执行本指令后的地址值。以上面的例子说明:值。以上面的例子说明: 指令本身的首地址是指令本身的首地址是2000H,2000H,执行完后变为执行完后变为2002H(2002H(既既下一条指令的首地址)。下一条指令的首地址)。 如果使用三字节的相对转移指令,则如果使用三字节的相对转移指令,则PC=PC+3PC=PC+3。返回上一页3030感谢你的观看感谢你的观看20192019年年6 6月月9 92,2,偏移量的计算:偏移量的计算: relrel= =目标地址目标地址- -源地址源地址-2 (2-2 (2字节指令)字节指令) 或:或: relrel= =目标地址目标地址- -源地址源地址-3 (3-3 (3字节指令)字节指令) 结果用补码的形式书写。结果用补码的形式书写。 为了减少计算偏移量的计算,汇编程序允许使用为了减少计算偏移量的计算,汇编程序允许使用“ “符符号地址号地址” ”的方式代替偏移量。如:的方式代替偏移量。如: SJMP loop1 SJMP loop1 汇编程序在翻译时,自动计算并将结果替换符号地址。汇编程序在翻译时,自动计算并将结果替换符号地址。3, 3, 如果转移地址的范围超过相对寻址的范围(如:如果转移地址的范围超过相对寻址的范围(如:-127-127+128+128)时,就要采用别的方式法,否则在编译时,提示出)时,就要采用别的方式法,否则在编译时,提示出错。错。返回3131感谢你的观看感谢你的观看20192019年年6 6月月9 92.2.7 位寻址在在位寻址指令(位操作指令)位寻址指令(位操作指令)中使用的位地址。中使用的位地址。 在一般的情况下,系统的数据都是按字节(在一般的情况下,系统的数据都是按字节(8 8位)来存位)来存放、处理。放、处理。 单片机在控制、检测的应用中,系统的输入、输出数单片机在控制、检测的应用中,系统的输入、输出数据有很多属于开关量信号。这些开关量信号以据有很多属于开关量信号。这些开关量信号以 bitbit - “ - “位位” ”的形式进行各种运算、处理和存储的。的形式进行各种运算、处理和存储的。MCS-51单片机控制、检测系统驱动器电动机外设1外设2状态信号状态信号控制信号3232感谢你的观看感谢你的观看20192019年年6 6月月9 9在在MCS-51MCS-51单片机的硬件设计上充分考虑了这种单片机的硬件设计上充分考虑了这种“ “布尔布尔” ”变量的处理,不仅在指令系统中设计了变量的处理,不仅在指令系统中设计了“ “位操作位操作” ”指令,指令,而且在片内而且在片内RAMRAM区中还专门开辟了一个区中还专门开辟了一个 “ “位寻址区位寻址区” ”。这样,布尔变量可以向字节数据一样进行存储、寻址。这样,布尔变量可以向字节数据一样进行存储、寻址。除了位寻址区外,除了位寻址区外,RAMRAM中的大多中的大多SFRSFR都可以按位寻址,换都可以按位寻址,换句话,句话,SFRSFR除了有自己的字节地址外,在寄存器内的每一除了有自己的字节地址外,在寄存器内的每一位还有其位地址。位还有其位地址。 3333感谢你的观看感谢你的观看20192019年年6 6月月9 9【举例】:【举例】:SETB 20HSETB 20H ; ;将位地址为将位地址为20H20H的位置一的位置一 SETB 90HSETB 90H ; ;将将P1P1口的口的d0d0位置一位置一同字节寻址中的直接寻址一样,为了增加程序的可读性,同字节寻址中的直接寻址一样,为了增加程序的可读性,凡在凡在SFRSFR中的中的位地址位地址都可以使用都可以使用符号地址符号地址来替代。如第二来替代。如第二例中,完全可以使用下面的指令格式:例中,完全可以使用下面的指令格式: MOV P1.0MOV P1.0 ; ;将将P0P0口的口的d0d0位置一位置一 类似还有:类似还有:MOV C,ACC.7MOV C,ACC.7 ; ;将累加器中的将累加器中的d7d7位送位送PSWPSW的的cycy 这种指令在汇编程序进行翻译时,还是要先将符号地址这种指令在汇编程序进行翻译时,还是要先将符号地址转换为真正的位地址。转换为真正的位地址。返回3434感谢你的观看感谢你的观看20192019年年6 6月月9 92.3 数据传送指令2.3.0 2.3.0 传送指令的特点传送指令的特点2.3.12.3.1 内部数据传送类指令内部数据传送类指令2.3.22.3.2 外部数据传送类指令外部数据传送类指令2.3.32.3.3 堆栈操作指令堆栈操作指令2.3.42.3.4 数据交换指令数据交换指令继续3535感谢你的观看感谢你的观看20192019年年6 6月月9 9数据传送是编程中使用最多、最主要的操作。它的功能是将数据传送是编程中使用最多、最主要的操作。它的功能是将数据在累加器、片内的数据在累加器、片内的RAMRAM、SFRSFR及片外及片外ROMROM、RAMRAM之间之间进行传送。进行传送。在传送类指令中在传送类指令中, ,必须指定被传送数据的必须指定被传送数据的源地址源地址和和目标地址目标地址。在传送过程中,在传送过程中,源地址的内容源地址的内容不被改变。不被改变。传送类指令除了传送类指令除了以累加器以累加器A A为目标的传送为目标的传送对对PSWPSW的的P P有影响外,有影响外,其余的传送类指令对其余的传送类指令对PWSPWS一概无影响。一概无影响。操作码操作码数据的目标地址数据的目标地址数据的源地址数据的源地址【举例】:MOV A,R0 ;将R0寄存器中的数据送 累加器A中(注意寻址方式)指令通式:MOV ,2.3.0 传送指令的特点返回3636感谢你的观看感谢你的观看20192019年年6 6月月9 92.3.1 内部数据传送类指令特点特点: :指令的源操作数和目的操作数都在单片机内部。指令的源操作数和目的操作数都在单片机内部。1,立即寻址型传送指令2,直接寻址型传送指令3,寄存器寻址型传送指令4,寄存器间址型传送指令5,内部数据传送类指令的使用继续3737感谢你的观看感谢你的观看20192019年年6 6月月9 91 1,立即寻址型传送指令,立即寻址型传送指令【特点特点】:原操作数字节是立即数原操作数字节是立即数,处在指令的第二或第,处在指令的第二或第三字节,所以这类指令都是多字节指令。这类指令有如下三字节,所以这类指令都是多字节指令。这类指令有如下4 4条。条。 MOV A,#dataMOV A,#data ; A data ( ; A data (双字节指令)双字节指令) MOV Rn,#dataMOV Rn,#data ; Rn ; Rn data ( data (双字节指令)双字节指令) MOV Ri,#dataMOV Ri,#data ; ; (RiRi) data (data (双字节指令)双字节指令) MOV direct,#dataMOV direct,#data ; direct data ( ; direct data (三字节指令)三字节指令) 这类指令多用于程序的初始化。如:这类指令多用于程序的初始化。如: MOV R0,#20HMOV R0,#20H MOV A,#00H MOV A,#00H3838感谢你的观看感谢你的观看20192019年年6 6月月9 9立即寻址指令举例已知:已知:R0=20H,R0=20H,试问单片机执行如下指令后,累加器试问单片机执行如下指令后,累加器A A、 R7R7、20H20H和和21H21H单元中的内容是什么。单元中的内容是什么。 MOV A,#18H MOV A,#18H ;立即数立即数18H18H送累加器送累加器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单元单元返回3939感谢你的观看感谢你的观看20192019年年6 6月月9 92,直接寻址型传送指令【特点特点】:指令中至少含有一个:指令中至少含有一个源操作数源操作数或或目的操作数的目的操作数的地址地址。很明显,这也是。很明显,这也是2 2个或个或3 3个字节的指令格式,其中直个字节的指令格式,其中直接地址在第接地址在第2 2或第或第3 3个字节上。这类指令有如下个字节上。这类指令有如下5 5条:条: MOV A,directMOV A,directMOV direct,AMOV direct,AMOV Rn,directMOV Rn,directMOV Ri,directMOV Ri,directMOV direct2,direct1MOV direct2,direct1 【注意注意】:directdirect为内部寄存器、为内部寄存器、RAMRAM和和SFRSFR的地址,换的地址,换句话说:句话说:directdirect适用于片内所有的地址(寄存器、适用于片内所有的地址(寄存器、SFRSFR和和RAM)RAM)。4040感谢你的观看感谢你的观看20192019年年6 6月月9 9直接寻址指令举例 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,32H ;(同上,试比较两种表示方法)(同上,试比较两种表示方法)返回4141感谢你的观看感谢你的观看20192019年年6 6月月9 93,寄存器寻址型传送指令指令中含有存放操作数的寄存器名指令中含有存放操作数的寄存器名RnRn 其中其中(n n00,1,2,3,4,5,6,7)1,2,3,4,5,6,7)。 共有如下三条:共有如下三条:MOV A,RnMOV A,RnMOV Rn,AMOV Rn,AMOV direct,RnMOV direct,Rn返回4242感谢你的观看感谢你的观看20192019年年6 6月月9 94,寄存器间接寻址型传送指令指令特点:指令中指令特点:指令中RiRi中存放的不是操作数本身,而是操作中存放的不是操作数本身,而是操作数在数在RAMRAM中的地址(中的地址(i=0i=0、1 1)。)。 格式如下:格式如下:MOV A,RiMOV A,RiMOV Ri,AMOV Ri,AMOV direct,RiMOV direct,Ri 【注意】;【注意】;RiRi中存放操作数的地址是有所选择的,只有非中存放操作数的地址是有所选择的,只有非SFRSFR的的RAMRAM单元才能使用这种寻址方式。单元才能使用这种寻址方式。4343感谢你的观看感谢你的观看20192019年年6 6月月9 9寄存器间接寻址指令举例已知已知( (40h)=11h,(41h)=22h,R0=40h40h)=11h,(41h)=22h,R0=40h和和R1=41hR1=41h。试问,下面的指令执行后,累加器试问,下面的指令执行后,累加器A A、40h40h、41h41h和和42h42h单元中的内容是什么。单元中的内容是什么。 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中中返回4444感谢你的观看感谢你的观看20192019年年6 6月月9 95,内部数据传送类指令的使用1 1,在使用传送指令时,在使用传送指令时, ,可以根据实际情况选用恰当寻址方可以根据实际情况选用恰当寻址方式。上面给出的各种类型的传送指令是式。上面给出的各种类型的传送指令是INTELINTEL公司在设计公司在设计MCS-51MCS-51的硬件时就已经确定下来。编程人员只能像查字的硬件时就已经确定下来。编程人员只能像查字典一样去查找、使用。不能根据主观意愿去典一样去查找、使用。不能根据主观意愿去“ “创造创造” ”指令。指令。 例如:要将例如:要将R0R0中的数据传送到中的数据传送到R1R1中。如何使用指令去完中。如何使用指令去完成上面的操作?成上面的操作? movmov r1,r0 r1,r0 是否可以?回答是否定的!因为在是否可以?回答是否定的!因为在MCS-51MCS-51的指令系统中没有此条指令!只能使用:的指令系统中没有此条指令!只能使用: 1 1,movmov a,r0 a,r0 或:或: 2, mov2, mov 01h,00h 01h,00h movmov r1,a r1,a 因此,必须从因此,必须从MCS-51MCS-51的指令表中选择使用指令。的指令表中选择使用指令。4545感谢你的观看感谢你的观看20192019年年6 6月月9 9MCS-51内部数据传送类指令方式图累加器Adirect直接寻址Ri间址Rn寄存器Data立即数返回上一次4646感谢你的观看感谢你的观看20192019年年6 6月月9 92 2,以累加器,以累加器A A为目的寄存器的传送指令会影响为目的寄存器的传送指令会影响PSWPSW中的中的 奇偶位奇偶位P P,而其余的指令对,而其余的指令对PSWPSW均无影响。均无影响。3 3,要会正确地估计指令的字节。凡是指令中包含有立即,要会正确地估计指令的字节。凡是指令中包含有立即 数、直接地址的指令,都应当在原有的基础上加数、直接地址的指令,都应当在原有的基础上加1 1。 【举例】:【举例】: mov a,Rimov a,Ri ( ) ( )个字个字节节mov a,directmov a,direct ( ( ) )个字个字节节mov direct,datamov direct,data ( ( ) )个字个字节节movmov direct2,direct1 ( direct2,direct1 ( ) )个字个字节节4747感谢你的观看感谢你的观看20192019年年6 6月月9 94 4,对于同一问题可以有不同的编程方法。使用不同的方,对于同一问题可以有不同的编程方法。使用不同的方法虽然都可以实现题目的要求,但从指令长度、运行时间法虽然都可以实现题目的要求,但从指令长度、运行时间和可阅读性上等综合因素考虑,不同的方法就有合理和不和可阅读性上等综合因素考虑,不同的方法就有合理和不合理、优化和繁杂之分。所以,在学习指令系统和编程时合理、优化和繁杂之分。所以,在学习指令系统和编程时开始就要养成一个好的、合理的编程习惯。开始就要养成一个好的、合理的编程习惯。5 5,注意给程序进行正确的注释,这对于阅读、编写和修,注意给程序进行正确的注释,这对于阅读、编写和修改程序都是非常重要的。下面就是一些注释的例子:改程序都是非常重要的。下面就是一些注释的例子: MOV A,30H MOV A,30H ;(;(30h) 30h) A A MOV A,R0 MOV A,R0 ; R0 R0 A A MOV 40H,30H MOV 40H,30H ;(;(30h) 30h) 40h 40h MOV A,Ri MOV A,Ri ; ( RiRi ) ) A A4848感谢你的观看感谢你的观看20192019年年6 6月月9 9内部传送类指令举例试编出把试编出把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返回4949感谢你的观看感谢你的观看20192019年年6 6月月9 92.3.2 外部数据传送类指令1,16位数传送指令2,外部ROM的字节传送3,外部RAM的字节传送指令继续5050感谢你的观看感谢你的观看20192019年年6 6月月9 91,16位数传送指令MCS-51MCS-51指令系统中唯一的一条指令系统中唯一的一条1616位数据传送类指令。位数据传送类指令。 MOV DPTR,#data16MOV DPTR,#data16 DPTR DPTR是单片机内部是单片机内部SFRSFR中的两个寄存器中的两个寄存器DPHDPH、DPLDPL组合而成。其中组合而成。其中DPHDPH为高八位,为高八位,DPLDPL为低八位。为低八位。 DPTRDPTR是一个专门用于访问外部存储器的间址寄存器。是一个专门用于访问外部存储器的间址寄存器。寻址能力为寻址能力为 64K (064K (065535)65535)。返回5151感谢你的观看感谢你的观看20192019年年6 6月月9 92,外部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作为数据表格的基地址。作为数据表格的基地址。 在第一条指令中:用在第一条指令中:用DPTRDPTR作为基地址。使用前,先作为基地址。使用前,先将数据表的首地址送入将数据表的首地址送入DPTRDPTR中,累加器中,累加器A A作为偏移量。作为偏移量。由两者数据相加得到待查的表中数据地址并取出。由两者数据相加得到待查的表中数据地址并取出。 第二条指令是以程序计数器第二条指令是以程序计数器PCPC为基地址。由于为基地址。由于PCPC的的内容与该指令在内容与该指令在ROMROM中的位置有关,所以一旦该指令在中的位置有关,所以一旦该指令在程序中的位置确定,其程序中的位置确定,其PCPC的值也就确定。的值也就确定。5252感谢你的观看感谢你的观看20192019年年6 6月月9 9外部外部ROMROM的字节传送指令的字节传送指令举例举例已知累加器已知累加器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 AROMROM0 01 14 49 91616252536364949646481812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h5353感谢你的观看感谢你的观看20192019年年6 6月月9 92 2,采用,采用PCPC作基址寄存器作基址寄存器:与与DPTRDPTR不同,使用不同,使用PCPC作为基地址时,必须对累作为基地址时,必须对累加器加器A A的数据进行修正,以保证的数据进行修正,以保证a+pca+pc恰好找到恰好找到待查的平方值地址。待查的平方值地址。 ORG 1FFBHORG 1FFBH1FFBH 1FFBH 74 data74 data ADD A,#dataADD A,#data ;data=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 : : : : : :2009H 2009H 51H51H DB 81DB 81 ENDENDdatadata为为MOVCMOVC指令首地址与表头地址之间的指令首地址与表头地址之间的单元数。单元数。74h74hdatadata83h83h80h80hFEhFEh0 01 14 49 91616252536364949646481812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h1FFFh1FFEh1FFDh1FFCh1FFBh返回5454感谢你的观看感谢你的观看20192019年年6 6月月9 93,外部RAM的字节传送指令实现外部实现外部RAMRAM和累加器和累加器A A之间的数据传送。只有寄存器间接之间的数据传送。只有寄存器间接寻址的指令。寻址的指令。 MOVX A,RiMOVX A,Ri 使用使用RiRi寄存器间址寻址范围寄存器间址寻址范围0 0255h255h MOVX Ri,A MOVX Ri,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地址。地址。5555感谢你的观看感谢你的观看20192019年年6 6月月9 9外部RAM的字节传送指令举例已知外部已知外部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 x 到累加器到累加器A AMOVX DPTRMOVX DPTR,A A ;x x 送送RAMRAM的的1818h1818h单单元元SJMP $ SJMP $ ;停机;停机ENDEND返回5656感谢你的观看感谢你的观看20192019年年6 6月月9 92.3.3 堆栈操作指令堆栈操作是一种特殊的数据传送指令。堆栈操作是一种特殊的数据传送指令。堆栈:一个用来保存程序断点、数据的特殊的存储区域。堆栈:一个用来保存程序断点、数据的特殊的存储区域。在在MCS-51MCS-51单片机中,栈区是占用片内单片机中,栈区是占用片内RAMRAM的存储空间,的存储空间,具体栈位置由指针具体栈位置由指针SPSP来确定(系统上电时,来确定(系统上电时,SP=07h)SP=07h)。 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 -1sp -1sp【注意】:【注意】:寻址方式为直接寻址,所以寻址方式为直接寻址,所以 push apush a 是是错误错误的,的,应应当是当是push accpush acc或或push 0e0hpush 0e0h,同理同理:push r0push r0也是错误的。也是错误的。进栈是堆栈向上进栈是堆栈向上“生长生长”的过程,即的过程,即sp+1sp+1;出栈则相反。;出栈则相反。系统上电时,系统上电时,sp=07hsp=07h。SPSP的值可以根据需要进行修改,的值可以根据需要进行修改,以适应具体编程的需要。在确定栈区位置时要考虑对数据以适应具体编程的需要。在确定栈区位置时要考虑对数据区的影响,以避免数据区与栈区冲突。区的影响,以避免数据区与栈区冲突。5757感谢你的观看感谢你的观看20192019年年6 6月月9 9堆栈操作指令举例(一)堆栈操作指令举例(一)下面是一个下面是一个BCDBCD码转换为二进制的子程序码转换为二进制的子程序BCDBBCDB中有关堆栈中有关堆栈操作的例子。在这里,进栈操作是为了保护主程序中相关寄操作的例子。在这里,进栈操作是为了保护主程序中相关寄存器中的数据,因为子程序要使用这些寄存器。存器中的数据,因为子程序要使用这些寄存器。org 0800horg 0800hbcdbbcdb: :push pswpush pswpush accpush accpush bpush b : : : :pop bpop bpop accpop accpop pswpop pswretretRAMRAMb baccaccpswpsw栈底栈底SP5858感谢你的观看感谢你的观看20192019年年6 6月月9 9堆栈操作指令举例(二)l l 堆栈操作指令除了可以在子程序的设堆栈操作指令除了可以在子程序的设计中,对主程序的数据进行保护。还计中,对主程序的数据进行保护。还可以根据堆栈操作的特点完成一些特可以根据堆栈操作的特点完成一些特殊的操作。殊的操作。【举例】:设片内【举例】:设片内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继续5959感谢你的观看感谢你的观看20192019年年6 6月月9 92.3.4 数据交换指令为提供一种方便的为提供一种方便的累加器累加器和和寄存器寄存器或或RAMRAM之间的数据交换。之间的数据交换。避免了使用一般避免了使用一般movmov 传送指令完成交换时的不便。传送指令完成交换时的不便。格式:格式:xch a,Rnxch a,Rn ;a a Rn Rn xch a,direct xch a,direct ;a a (direct) (direct) xch a,Ri xch a,Ri ;a a (Ri (Ri) ) xchd a,Ri xchd a,Ri ;a a3 30 0(Ri)(Ri)3 30 0举例:已知,片外举例:已知,片外RAM20hRAM20h单元、内部单元、内部RAM20hRAM20h单元分别单元分别有数有数x x和和y y,试编程互将两数相交换。,试编程互将两数相交换。movmov R1,#20h R1,#20h ;指针赋初值指针赋初值movxmovx a,R1 a,R1 ;x xaaxchxch a,R1 a,R1 ;交换交换 a(20h),a(20h),y yaa movx movx R1,a R1,a ;y y(20h)(20h)片外片外RAMRAM6060感谢你的观看感谢你的观看20192019年年6 6月月9 9数据交换指令举例(一)l l举例:已知,片外举例:已知,片外RAM20hRAM20h单元、内部单元、内部RAM20hRAM20h单元分别单元分别有数有数x x和和y y,试编程互将两数相交换。,试编程互将两数相交换。movmov R1,#20h R1,#20h ;指针赋初值;指针赋初值movxmovx a,R1 a,R1 ;xaxaxchxch a,R1 a,R1 ;交换交换 a(20h),yaa(20h),ya movx movx R1,a R1,a ;y(20h)y(20h)片外片外RAMRAM片内片内RAMRAMy y (x)(x)片外片外RAMRAMx x (y)(y)(y) x20h20h累加器A1236161感谢你的观看感谢你的观看20192019年年6 6月月9 9数据交换指令举例(二)已知已知RAM50hRAM50h单元有一个单元有一个0 09 9的数,试编程将它变成相应的数,试编程将它变成相应的的ASCIIASCII码。码。 【解】:【解】:0 09 9的的ASCIIASCII码是码是30h30h39h39h,两者相差,两者相差30h30h。方法一:方法一:对对50h50h单单元的数据高四位元的数据高四位组组装一个装一个30h30h。movmov 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继续6262感谢你的观看感谢你的观看20192019年年6 6月月9 92.4 算逻运算和移位指令功能:完成算术运算、逻辑运算和循环移位三大功能。功能:完成算术运算、逻辑运算和循环移位三大功能。特点:大多指令都要由累加器特点:大多指令都要由累加器A A来存放一个源操作数,并来存放一个源操作数,并把操作结果放回累加器把操作结果放回累加器A A中。中。2.4.1: 算术运算指令2.4.2: 逻辑运算指令2.4.3: 移位指令继续6363感谢你的观看感谢你的观看20192019年年6 6月月9 92.4.1: 算术运算指令 不带进位的加法指令不带进位的加法指令 ( ADD ADD )1 1,加法指令加法指令: 带进位的加法指令带进位的加法指令 ( ADC ADC ) 加加1 1指令指令 ( INC INC ) (编程举例编程举例)2 2,减法指令减法指令: 带进位的减法指令带进位的减法指令 ( SUBB SUBB ) 减减1 1指令指令 ( DEC DEC )3 3,十进制调整指令十进制调整指令: ( D DA A A A )4 4,乘法和除法指令乘法和除法指令: (MUL DMUL DIVIV)6464感谢你的观看感谢你的观看20192019年年6 6月月9 9加法指令(一):不带进位的加法指令格式:格式: ADD A,RnADD A,Rn;A+RnA+RnAAADD A,directADD A,direct;A+(direct)A+(direct)AAADD A,RiADD A,Ri;A+(Ri)A+(Ri)AAADD A,#dataADD A,#data;A+dataA+dataAA【注意】:【注意】:1 1,参加运算的数据都,参加运算的数据都应应当是当是8 8位的,位的,结结果也是果也是8 8位并影响位并影响PSWPSW。2 2,根据编程者的需要,根据编程者的需要,8 8位数据可以是无符号数位数据可以是无符号数(0 0255255),也可以是有符号数也可以是有符号数(-127-127+128+128)。3 3,不论编程者使用的数据是有符号数还是无符号数,不论编程者使用的数据是有符号数还是无符号数,CPUCPU都将都将它们视为有符号数(补码)进行运算并影响它们视为有符号数(补码)进行运算并影响PSWPSW。6565感谢你的观看感谢你的观看20192019年年6 6月月9 9不带进位的加法指令举例不带进位的加法指令举例( (一一) )试分析执行下列指令后累加器试分析执行下列指令后累加器A A和和PSWPSW中各标志的变化。中各标志的变化。MOV A,#19H MOV A,#19H Cy=0;Cy=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,若两个数是有符号数,则因,若两个数是有符号数,则因OV=0OV=0无溢出。无溢出。cy0 0 0 CP CS AC 6666感谢你的观看感谢你的观看20192019年年6 6月月9 9不带进位的加法指令举例(二)试分析执行下列指令后累加器试分析执行下列指令后累加器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 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,故有溢出,两个正数相加,故有溢出,两个正数相加后变为负数,很明显结果是不正确的。后变为负数,很明显结果是不正确的。6767感谢你的观看感谢你的观看20192019年年6 6月月9 9加法指令(二):带进位的加法指令格式:格式: ADDC A,RnADDC A,Rn;A+Rn+CyA+Rn+CyAA ADDC A,direct ADDC A,direct ;A+(direct) +CyA+(direct) +CyAA ADDC A,Ri ADDC A,Ri;A+(Ri) +CyA+(Ri) +CyAA ADDC A,#data ADDC A,#data ;A+data+CyA+data+CyAA【注意】:这里的【注意】:这里的CyCy是指令是指令执执行前的行前的CyCy;对对PSWPSW的影响同的影响同ADDADD指令。指令。6868感谢你的观看感谢你的观看20192019年年6 6月月9 9加1指令格式:格式:INC A INC A ;累加器;累加器A A加一加一INC RnINC Rn ;Rn+1Rn+1RnRnINC direct INC direct ;内存单元数据加一;内存单元数据加一INC RiINC Ri ;内存单元数据加一;内存单元数据加一INC DPTR INC DPTR ;dptr+1dptr+1dptrdptr【注意】:【注意】:1 1,除了第一条对除了第一条对PSWPSW的的P P有影响外有影响外, ,其余对其余对PSWPSW均无影响。均无影响。 2 2,由于上面的原因,由于上面的原因,INCINC指令不能作指令不能作为为一般的数据算一般的数据算术术运算运算 使用,使用,INCINC主要用于修改数据指主要用于修改数据指针针等控制、循等控制、循环语环语句中使用。句中使用。返回本节目录6969感谢你的观看感谢你的观看20192019年年6 6月月9 9编程举例已知已知M1M1、M2M2单元中存有两个单元中存有两个1616位无符号数位无符号数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,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返回本节目录7070感谢你的观看感谢你的观看20192019年年6 6月月9 9减法指令(带进位的减法指令)在在MCS-51MCS-51单片机的指令系统中,只有:单片机的指令系统中,只有: 带进位的减法带进位的减法 SUBBSUBB 减一减一 DEC DEC 两种指令。两种指令。1 1减法指令:减法指令:格式格式:SUBB A,RnSUBB A,Rn ;A RnA Rn Cy Cy A A SUBB A,direct SUBB A,direct ;A A (direct) Cy (direct) Cy AA SUBB A,Ri SUBB A,Ri ;A A (Ri (Ri) Cy ) Cy AA SUBB A,#data SUBB A,#data ;A data Cy A data Cy AA7171感谢你的观看感谢你的观看20192019年年6 6月月9 9使用减法指令要注意的几个问题1 1,在单片机内部,减法指令实际上是采用补码的,在单片机内部,减法指令实际上是采用补码的加法实现的。但要判定减法结果编程者可以按二加法实现的。但要判定减法结果编程者可以按二进制减法法则验证。进制减法法则验证。2,2,无论相减两数是无符号数还是有符号数,减法无论相减两数是无符号数还是有符号数,减法操作总是按有符号数来处理、影响操作总是按有符号数来处理、影响PSWPSW中相关的标中相关的标志(详见举例)。志(详见举例)。3 3,在,在MCS-51MCS-51的指令系统中没有不带的指令系统中没有不带CyCy的减法,所的减法,所以在使用以在使用SUBBSUBB指令前必须使用一条清除指令前必须使用一条清除CyCy的指的指令:令:CLR CCLR C。7272感谢你的观看感谢你的观看20192019年年6 6月月9 9减法指令应用举例试分析执行下列指令后累加器试分析执行下列指令后累加器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 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?返回本节目录7373感谢你的观看感谢你的观看20192019年年6 6月月9 9减一指令格式格式:DEC A DEC A ;累加器;累加器A A减一减一DEC RnDEC Rn ;Rn-1Rn-1RnRnDEC direct DEC direct ;内存单元数据减一;内存单元数据减一DEC RiDEC Ri ;内存单元数据减一;内存单元数据减一【注意】:【注意】:1 1,除了第一条对除了第一条对PSWPSW的的P P有影响外,其余对有影响外,其余对PSWPSW均无影响。均无影响。 2 2,由于上面的原因,由于上面的原因,DECDEC指令一般不作指令一般不作为为数据算数据算术术运算使运算使用(因用(因为为不能不能对对PSWPSW的的OVOV等位等位产产生影响,它主要用于修改生影响,它主要用于修改数据指数据指针针在控制、循在控制、循环语环语句中使用)。句中使用)。返回本节目录7474感谢你的观看感谢你的观看20192019年年6 6月月9 9十进制调整指令在在CPUCPU进行进行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指令只适用于加法指令的调整。指令只适用于加法指令的调整。7575感谢你的观看感谢你的观看20192019年年6 6月月9 9十进制调整指令应用举例(一)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 dtat+ 59 dtat= 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,所以加,所以加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码。码。7676感谢你的观看感谢你的观看20192019年年6 6月月9 9十进制调整指令应用举例(二)2 2,BCDBCD减法运算:减法运算:由于由于DA ADA A 指令只能对指令只能对BCDBCD码的加法进行码的加法进行调整,所以遇到调整,所以遇到BCDBCD码的加法时就要将其码的加法时就要将其减法变为加法减法变为加法运运算,然后再使用算,然后再使用DA ADA A指令进行调整。指令进行调整。减法变加法就是使用减法变加法就是使用BCDBCD码的补码运算法则:码的补码运算法则: 将将被减数被减数- -减数减数变为变为被减数被减数+ +减数的补码减数的补码。 减数的补码减数的补码 = = BCDBCD码的模码的模- -减数减数 其中其中BCDBCD码的模为码的模为100H = 99H+01H = 100H = 99H+01H = 9A9AH H7777感谢你的观看感谢你的观看20192019年年6 6月月9 9已知:在已知:在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,M1ADD A,M1 ;被减数;被减数+ +减数的减数的补码补码(结结果在果在A A中)中)DA ADA A ;十;十进进制制调调整整MOV M3,AMOV M3,A ;结结果送果送M3M3单单元元CLR CCLR C ;清除;清除进进位位(不要位位(不要Cy)Cy)(请请同学自己同学自己验证验证一下)一下)返回本节目录7878感谢你的观看感谢你的观看20192019年年6 6月月9 9乘法和除法指令这是这是MCS-51MCS-51单片机唯一的一类单字节单片机唯一的一类单字节4 4周期指令,它相当周期指令,它相当于于4 4条加法指令的运行时间。条加法指令的运行时间。 格式:格式:MUL A B ;MUL A B ;abab=b a (b=b a (b存高存高8 8位,位,a a存低存低8 8位)位)DIV A B ;abDIV A B ;ab=ab (a=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与乘法相同。在与乘法相同。在执执行除法指行除法指令令时时,若,若B=0B=0时时OV=1OV=1,表示除数,表示除数=0=0除法无意除法无意义义,其余情况,其余情况下下OVOV被复位。被复位。返回本节目录7979感谢你的观看感谢你的观看20192019年年6 6月月9 92.4.2: 逻辑运算指令功能功能: :对对2 2个个8 8位二进制数进行位二进制数进行逻辑与、或、非和异或逻辑与、或、非和异或操作;操作;特点特点: :除了以累加器除了以累加器A A为目标寄存器的指令影响为目标寄存器的指令影响PSWPSW的的P P位外,位外,其余指令对其余指令对PSWPSW均无影响。均无影响。1 1,逻辑,逻辑与运算与运算指令指令 (ANL)(ANL)2 2,逻辑,逻辑或运算或运算指令指令 (ORL)(ORL)3 3,逻辑,逻辑异或异或指令指令 (XRL)(XRL)4 4,累加器,累加器清零和取反清零和取反指令指令 (CLR & CPL)(CLR & CPL)继续8080感谢你的观看感谢你的观看20192019年年6 6月月9 9逻辑与运算指令格式:格式:ANL A,RnANL A,Rn;A A R n AR n A ANL A,direct ANL A,direct ; A A ( (directdirect) A) A ANL A,Ri ANL A,Ri; A A ( RiRi) A A ANL A,#data ANL A,#data; A A datadata A A ANL direct,A ANL direct,A; (direct) (direct) A A directdirect ANL direct,# data ANL direct,# data; (direct) (direct) datadata directdirect上面的指令也可以分为两类:上面的指令也可以分为两类: 1 1,以,以累加器累加器A A为目标寄存器的逻辑运算指令;为目标寄存器的逻辑运算指令; 2 2,以,以内存单元内存单元为目标的逻辑运算指令。为目标的逻辑运算指令。8181感谢你的观看感谢你的观看20192019年年6 6月月9 9应用举例(一)已知已知R0=30HR0=30H和(和(30H30H)=0AAH,=0AAH,试问执行下列指令后累加试问执行下列指令后累加器器A A和和30H30H单元中的内容是什么?单元中的内容是什么? 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)=80H=80H)很明显:很明显:ANLANL操作可以从某个存储单元中取出某几位,而把操作可以从某个存储单元中取出某几位,而把其它的为屏蔽掉(清零)。其它的为屏蔽掉(清零)。8282感谢你的观看感谢你的观看20192019年年6 6月月9 9应用举例(二)已知:已知:M1M1单元有一个单元有一个9 9的的ASCIIASCII码码39H39H,试编程将其变为,试编程将其变为BCDMBCDM码。码。解:解:1 1,使用,使用 ANL direct,#dataANL direct,#data的指令:的指令: ANL M1,#0FHANL M1,#0FH解:解:2 2,使用,使用 ANL A,#dataANL A,#data指令。指令。 MOV A,M1MOV A,M1 ANL A,#0FH ANL A,#0FH MOV M1,A MOV M1,A返回本节目录8383感谢你的观看感谢你的观看20192019年年6 6月月9 9逻辑或运算指令格式:格式:ORL A,RnORL A,Rn ;A A R n AR n A ORL A,direct ORL A,direct ; A A ( (directdirect) A) A OR A,Ri OR A,Ri ; A A ( ( R I ) AR I ) A ORL A,#data ORL A,#data ; A A datadata A A ORL direct,A ORL direct,A ; (direct) (direct) A A directdirect ORL direct,# data ORL direct,# data ; (direct) (direct) datadata directdirect同与运算一样,上面的指令也可以分为两类:同与运算一样,上面的指令也可以分为两类: 1 1,以,以累加器累加器A A为目标寄存器的逻辑运算指令;为目标寄存器的逻辑运算指令; 2 2,以,以内存单元内存单元为目标的逻辑运算指令。为目标的逻辑运算指令。8484感谢你的观看感谢你的观看20192019年年6 6月月9 9应用举例设累加器设累加器A=0AAH,P1A=0AAH,P1口口=0FFH=0FFH。试编程将累加器。试编程将累加器A A中的第中的第四位送四位送P1P1口的低四位,而口的低四位,而P1P1口的高四位不变。口的高四位不变。 解:解: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的数据的数据【小【小结结】:】:与运算与运算可以可以 “屏蔽屏蔽” 某些位某些位; ;或运算或运算可以可以 “置位置位” 某些位。某些位。返回本节目录8585感谢你的观看感谢你的观看20192019年年6 6月月9 9逻辑异或运算指令格式:格式:XRL A,RnXRL A,Rn; A A R n AR n A XRL A,direct XRL A,direct ; A A ( (directdirect) A) A XR A,Ri XR A,Ri; A A ( ( R I ) AR I ) A XRL A,#data XRL A,#data; A A datadata A A XRL direct,A XRL direct,A; (direct) (direct) A A directdirect XRL direct,# data XRL direct,# data; (direct) (direct) datadata directdirect特点:按位运算,相同时为特点:按位运算,相同时为0 0,不同时为,不同时为1 1。使用异或可以。使用异或可以实现将某个字节的数据或将数据的某几位变反。实现将某个字节的数据或将数据的某几位变反。8686感谢你的观看感谢你的观看20192019年年6 6月月9 9举例已知:外部已知:外部RAMRAM的的30H30H单元中有一个数单元中有一个数AAHAAH,现要将其高,现要将其高4 4位不变,低位不变,低4 4位取反,试编程。位取反,试编程。解解1 1,利用,利用MOVX A,RiMOVX A,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 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返回本节目录8787感谢你的观看感谢你的观看20192019年年6 6月月9 9累加器清零和取反指令用传送指令可以实现对累加器用传送指令可以实现对累加器A A的清零和取反操作,但是它的清零和取反操作,但是它们都是双字节指令。在们都是双字节指令。在MCS-51MCS-51的指令系统中专门设计了单的指令系统中专门设计了单字节、单周期对累加器清零和取反的指令。字节、单周期对累加器清零和取反的指令。格式:格式:CLR A CLR A ;累加器清零;累加器清零CPL A CPL A ;累加器取反;累加器取反 取反指令可以方便的实现求补操作。取反指令可以方便的实现求补操作。举例:举例:已知已知30H30H单元中有一个数单元中有一个数x x,写出对它求补的程序。,写出对它求补的程序。MOV A,30HMOV A,30HCPL ACPL AINC AINC AMOV 30H,AMOV 30H,A8888感谢你的观看感谢你的观看20192019年年6 6月月9 9逻辑运算指令应用举例设设X X、Y Y和和Z Z分别存在分别存在X X、Y Y和和Z Z单单元。试编出能实现此电路功能的元。试编出能实现此电路功能的程序,并将结果送入程序,并将结果送入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返回本节目录8989感谢你的观看感谢你的观看20192019年年6 6月月9 92.4.3: 移位指令虽然虽然MCS-51MCS-51只有只有5 5条移位指令,条移位指令,但它可以处理所有移位问题。但它可以处理所有移位问题。格式:格式:RL ARL ARR ARR ARLC ARLC ARRC ARRC ASWAP ASWAP A【注意】:只能【注意】:只能对对累加器累加器A A进进行行移位。移位。A7 A0A7 A0A7 A0CyCyA7 A4A7 A4 A3 A0A3 A0 A7 A09090感谢你的观看感谢你的观看20192019年年6 6月月9 9举例(一)已知:在已知:在M1M1和和M1+1M1+1单元有一个单元有一个1616位数(位数(M1M1存低存低8 8位),位),试编程将其扩大试编程将其扩大2 2倍(设结果小于倍(设结果小于6553565535)。)。解:扩大解:扩大2 2倍可以用左移一位来实现。倍可以用左移一位来实现。dataLdataL=11001111=11001111 1001111010011110dataHdataH=00101100=00101100 0101100101011001M1M1+110011101010110109191感谢你的观看感谢你的观看20192019年年6 6月月9 9程序清单 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;指针加一;指针加一MOV A,R1MOV A,R1;取高;取高8 8位数据位数据RLC ARLC A;循环左移;循环左移CyCy进低位进低位MOV R1,AMOV R1,A;数据回送;数据回送9292感谢你的观看感谢你的观看20192019年年6 6月月9 9举例(二)已知:已知: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,A0000BCD10000BCD10000BCD20000BCD2M1M1+1BCD1 0000BCD1 BCD2BCD20000 BCD1返回本章目录累加器A9393感谢你的观看感谢你的观看20192019年年6 6月月9 92.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,位控制转移指令:位控制转移指令:返回本章目录9494感谢你的观看感谢你的观看20192019年年6 6月月9 91,无条件转移指令: 格式:格式: LJMP addr16 LJMP addr16 长转移指令,寻址范围长转移指令,寻址范围6553565535; AJMP addr11 AJMP addr11 绝对转移,寻址范围绝对转移,寻址范围2K2K; SJMP relSJMP rel 短转移,转移范围(短转移,转移范围(+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指令(三字节)AJMP指令(双字节)SJMP指令(双字节)JMP指令(单字节)9595感谢你的观看感谢你的观看20192019年年6 6月月9 9长转移指令:(三字节双周期指令) 指令执行时,指令执行时,将指令码中的将指令码中的addr16addr16送送入入PCPC中,使程序无条件的转向中,使程序无条件的转向addr16addr16所指向的新地址执行程序。所指向的新地址执行程序。【举举例】:例】: 已知某已知某单单片机的片机的监监控程序地址控程序地址为为A080H,A080H,试问试问用什么方法使用什么方法使单单片机开机片机开机后自后自动动的的转转向向该监该监控程序?控程序?【解】:【解】: 因因为单为单片机上片机上电时电时,PC=0000H,PC=0000H,所以所以在在0000H0000H单单元存放一条元存放一条LJMP 0A080HLJMP 0A080H 的指令即可。的指令即可。LJMPLJMPA0HA0H80H80HROM0000H0001H0002H0003H9696感谢你的观看感谢你的观看20192019年年6 6月月9 9绝对转移指令:l l双字节、双周期指令。双字节、双周期指令。 将将AJMPAJMP指令中的指令中的1111位转移位转移地址替换掉原来地址替换掉原来PCPC中中1616位地址中的低位地址中的低1111位地址。位地址。l l指令中的指令中的1111位地址,确定了地址的转移范围在位地址,确定了地址的转移范围在2K2K以以内,所以内,所以AJMPAJMP也称也称“ “页内转移页内转移” ”指令。指令。1 0 1 1 0 1 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程序计数器9797感谢你的观看感谢你的观看20192019年年6 6月月9 9MCS-15MCS-15的的ROMROM系统是以系统是以2K2K为一页来划分程序存为一页来划分程序存储器,这样对于储器,这样对于4K4K的片内的片内ROMROM存储器可以分为存储器可以分为2 2页;片外页;片外64K64K的的ROMROM可以分为可以分为3232页。页。在执行在执行AJMPAJMP指令时,指令时,PCPC的高的高5 5位决定了位决定了ROMROM中中的页地址的页地址;而;而AJMP AJMP 指令的低指令的低1111位地址用来选择位地址用来选择页内地址页内地址。在一般情况下,在一般情况下,AJMPAJMP指令应当与目标地址在同一指令应当与目标地址在同一页内。更具体的说:目标地址应当与页内。更具体的说:目标地址应当与AJMPAJMP指令取指令取出后的出后的PCPC值(值(PC=PC+2) PC=PC+2) 在同一页内。否则转移在同一页内。否则转移将会出现错误。将会出现错误。9898感谢你的观看感谢你的观看20192019年年6 6月月9 9ROM的64K存储空间的页面(部分)划分表页面页面 PCPC高高5 5位位页页 内内 地地 址址页面页面 PCPC高高5 5位位页页 内内 地地 址址0 0页页 00000000000000H0000H07FFH07FFH 8 8页页 0100001000 4000H4000H47FFH47FFH1 1页页 00001000010800H0800H0FFFH0FFFH 9 9页页 0100101001 4800H4800H4FFFH4FFFH2 2页页 00010000101000H1000H17FFH17FFH 1010页页 0101001010 5000H5000H57FFH57FFH3 3页页 00011000111800H1800H1FFFH1FFFH 1111页页 01011010115800H5800H5FFFH5FFFH4 4页页 00100001002000H2000H27FFH27FFH 1212页页 0110001100 6000H6000H67FFH67FFH5 5页页 00101001012800H2800H2FFFH2FFFH 1313页页 0110101101 6800H6800H6FFFH6FFFH6 6页页 00110001103000H3000H37FFH37FFH 1414页页 01110011107000H7000H77FFH77FFH7 7页页 00111001113800H3800H3FFFH3FFFH 1515页页 01111011117800H7800H7FFFH7FFFH9999感谢你的观看感谢你的观看20192019年年6 6月月9 9ROM的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值发生跨页错误100100感谢你的观看感谢你的观看20192019年年6 6月月9 9AJMPAJMP转一指令是用来做页内转一指令是用来做页内2K2K范围的转移,如果范围的转移,如果使用不当,会发生错误的使用不当,会发生错误的“ “跨页跨页” ”操作。操作。产生跨页的原因是产生跨页的原因是AJMPAJMP指令处于每一页的最后两指令处于每一页的最后两个单元的结果,所以避免这种现象的方法就是不个单元的结果,所以避免这种现象的方法就是不要在每一页的最后两个单元使用要在每一页的最后两个单元使用AJMPAJMP指令。指令。如果目标地址如果目标地址与与AJMPAJMP地址不再同一页内,建议使地址不再同一页内,建议使用用LJMPLJMP指令替代指令替代AJMPAJMP。使用使用AJMPAJMP指令时,指令时,1111位的绝对地址可以用符号地位的绝对地址可以用符号地址取代址取代正确使用AJMP转移指令101101感谢你的观看感谢你的观看20192019年年6 6月月9 9短转移SJMP指令格式格式:SJMP relSJMP rel rel rel 为偏移量(为偏移量( +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=F7H(-9-9)实际编程时,使用符号地址取代实际编程时,使用符号地址取代relrel以简化计算,在汇编时由汇编以简化计算,在汇编时由汇编程序来计算程序来计算relrel。SJMPSJMPrelrelPCPC+20109H0110H0116H102102感谢你的观看感谢你的观看20192019年年6 6月月9 9变址转移指令格式:格式:JMP A+DPTR JMP A+DPTR 单字节操作码为单字节操作码为73H73H特点:特点:转移地址由累加器转移地址由累加器A A的内容与的内容与DPTRDPTR相加形成。相加形成。用途:用途:用来制作一个多分支的转移结构。用来制作一个多分支的转移结构。【举举例】例】: :MOV DPTR,#TABLE ;MOV DPTR,#TABLE ;指指针赋针赋表表头头地址地址JMP A, DPTR JMP A, DPTR ;转转移地址由移地址由A+DPTRA+DPTR产产生生TABLE:TABLE:AJMP ROUT0AJMP ROUT0 ;多分支;多分支转转移表移表AJMP ROUT1AJMP ROUT1AJMP ROUT1AJMP ROUT1AJMP ROUT2AJMP ROUT2 : : : :返回103103感谢你的观看感谢你的观看20192019年年6 6月月9 92,条件转移指令:(1 1)累加器)累加器A A判零转移指令判零转移指令(双字节指令)(双字节指令)JZ relJZ rel;若;若A=0,A=0,则则PC=PC+2+relPC=PC+2+rel;若;若A A0 0,则,则PC=PC+2PC=PC+2 JNZ rel JNZ rel;若;若A A0,0,则则PC=PC+2+relPC=PC+2+rel;若;若A A= =0 0,则,则PC=PC+2PC=PC+2104104感谢你的观看感谢你的观看20192019年年6 6月月9 9(2 2)比较条件转移指令(比较条件转移指令(3 3字节)字节) a=dataa=data时:时:PC+3PC+3PC,Cy=0PC,Cy=0CJNE A, #data,relCJNE A, #data,rel adataadata时:时:PC+3+rel,Cy=0PC+3+rel,Cy=0CJNE Rn,#data,relCJNE Rn,#data,rel adataaYXY时时;若若Cy=1 Cy=1 则则XY X00时时,同无符号数相同;,同无符号数相同;b,b,当当x x、y y均均00,y0,yy;xy;d,d,当当x0x0y0时时,xy;,x0?Y0?Y0?Cy0?XYYNYYYNNN106106感谢你的观看感谢你的观看20192019年年6 6月月9 9(3)减一条件转移指令1, DJNZ Rn,rel1, DJNZ Rn,rel;Rn-1;Rn-1Rn,Rn,若若RnRn00则则PC+2+relPC+2+relPCPC 若若RnRn=0=0则则PC+2PC+2PCPC2, 2, DJNZ direct,relDJNZ direct,rel ;(direct)-1 ;(direct)-1direct,direct, 若若(direct)(direct)00则则PC+3+relPC+3+relPCPC 若若(direct)(direct)= 0= 0则则PC+3PC+3PCPC注意:第一条指令为双字节,第二条指令为三字节。注意:第一条指令为双字节,第二条指令为三字节。 指令本身先做一个带回送的减一运算操作,然后指令本身先做一个带回送的减一运算操作,然后 根据运算的结果是否为零作为转移的条件根据运算的结果是否为零作为转移的条件107107感谢你的观看感谢你的观看20192019年年6 6月月9 9应用举例令片内令片内RAMRAM中中DATADATA为起始地址的数据块中连续为起始地址的数据块中连续1010个无符号数相加,个无符号数相加,并把和送到并把和送到SUNSUN单元(设其和小于单元(设其和小于256256)。)。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 $SJMP $; ;停机停机ENDEND这是一个循环结构的程序,这是一个循环结构的程序,DJNZDJNZ指令又是决定整个循环是否结束的指令又是决定整个循环是否结束的控制语句。控制语句。 返回108108感谢你的观看感谢你的观看20192019年年6 6月月9 93,子程序调用和返回指令(一)子程序调用指令:一)子程序调用指令: 1 1,短调用指令,短调用指令 ACALL addr11 ACALL addr11 2, 2, 长调用指令长调用指令 LCALL addr16LCALL addr16 (二)返回指令:(二)返回指令:109109感谢你的观看感谢你的观看20192019年年6 6月月9 9(一)调用指令1 1,短调用指令,短调用指令 ACALL addr11ACALL addr11 PC+2PC+2PCPCSP+1SP, PCSP+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 PCl l子程序的调用包含两子程序的调用包含两部分内容部分内容:a, a, 实现转入子程序的入实现转入子程序的入口地址;口地址;这主要由调这主要由调用语句中的用语句中的addr11addr11或或addr16 addr16 实现。实现。b,b,子程序完成后,能够子程序完成后,能够自动的返回;自动的返回;这是由这是由调用语句执行时依靠调用语句执行时依靠堆栈操作已经将返回堆栈操作已经将返回地址压栈保存,带返地址压栈保存,带返回时弹出送回时弹出送PCPC实现实现的。的。110110感谢你的观看感谢你的观看20192019年年6 6月月9 9(二)返回指令格式:格式:RET RET (子程序返回(子程序返回 操作码:操作码:22H22H) 操作操作: : (SP)(SP) PC15 PC158 8 , , SP-1SPSP-1SP (SP)(SP) PC 7 PC 70 0 , , SP-1SPSP-1SP格式:格式:RETI RETI (中断子程序返回(中断子程序返回 操作码:操作码:32H32H) 操作操作: : (SP)(SP) PC15 PC158 8 , , SP-1SPSP-1SP (SP)(SP) PC 7 PC 70 0 , , SP-1SPSP-1SP RETI RETI与与RETRET的区别在于返回主程序后,的区别在于返回主程序后,RETIRETI还要清除相还要清除相应的中断优先级状态位,使系统响应低优先级的中断。应的中断优先级状态位,使系统响应低优先级的中断。返回111111感谢你的观看感谢你的观看20192019年年6 6月月9 94,空操作指令格式:格式: NOP NOP (单字节(单字节 操作码:操作码:00H00H)功能:仅使程序计数器功能:仅使程序计数器PCPC加一,消耗加一,消耗1212个时钟周个时钟周期,所以时常用作延时。期,所以时常用作延时。返回112112感谢你的观看感谢你的观看20192019年年6 6月月9 9位操作指令的特点特点:特点:操作数不是字节,而是某一位。每位的取操作数不是字节,而是某一位。每位的取值只能是值只能是“ “0”0”或或“ “1”1”,因而也称之为布尔变量,因而也称之为布尔变量操作。操作。布尔变量存在于片内布尔变量存在于片内RAMRAM的位寻址区的位寻址区(20H(20H2FH)2FH)、1111个可以按位寻址的个可以按位寻址的SFRSFR。返回113113感谢你的观看感谢你的观看20192019年年6 6月月9 91,位传送指令:格式:格式:MOV C , bit MOV C , bit 其中:其中:C C为为PSWPSW中的中的CyCy; MOV bit , 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返回114114感谢你的观看感谢你的观看20192019年年6 6月月9 92,位置位和位清零指令:格式:格式:CLR CCLR C;0 0CyCyCLR bitCLR bit; 0 0( bit )( bit )SETB CSETB C;1 1CyCySETB bitSETB bit;1 1( bit )( bit )返回115115感谢你的观看感谢你的观看20192019年年6 6月月9 93,位运算指令:格式:格式: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) bitbit返回116116感谢你的观看感谢你的观看20192019年年6 6月月9 94,位控制转移指令:(一)以(一)以CyCy内容为条件的转移指令内容为条件的转移指令格式:格式:JC relJC rel ;若;若Cy=1,Cy=1,则则PC+2+relPC+2+relPCPC ;若若Cy=0,Cy=0,则则PC+2PC+2PCPC JNC rel JNC rel ;若;若Cy=0,Cy=0,则则PC+2+relPC+2+relPCPC ;若若Cy=1,Cy=1,则则PC+2PC+2PCPC(二)以位地址为内容为条件的转移指令(二)以位地址为内容为条件的转移指令格式:格式:JB bit ,relJB bit ,rel ;若(;若(bitbit)=1,=1,则则PC+3+relPC+3+relPCPC ;若(;若(bitbit)=0,=0,则则PC+3PC+3PCPC JNB bit ,rel JNB bit ,rel ;若(;若(bitbit)=0,=0,则则PC+3+relPC+3+relPCPC ;若(;若(bitbit)=1,=1,则则PC+3PC+3PCPC JBC bit ,rel JBC bit ,rel ;若(若(bitbit)=1,=1,则则PC+3+relPC+3+relPC,0bitPC,0bit ;若(若(bitbit)=0,=0,则则PC+3PC+3PCPC117117感谢你的观看感谢你的观看20192019年年6 6月月9 9位操作指令应用举例(一)已知:内部已知:内部RAM RAM 的的M1M1、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中数据送中数据送MAXMAX单元单元【说说明】:明】:1,1,第第2 2条指令作条指令作为为比比较较指令使用,不指令使用,不论结论结果都果都转转LOOPLOOP 2, 2,第第3 3条指令是一条位控条指令是一条位控转转移指令,根据移指令,根据CyCy的状的状态态控制控制转转移。移。118118感谢你的观看感谢你的观看20192019年年6 6月月9 9位操作指令应用举例(二)已知:在已知:在20H20H单元中有一个数单元中有一个数X X,若,若X50X50X50则转向则转向LOOP3LOOP3,试编程。,试编程。【解】:【解】:MOV A,20HMOV A,20H ;XAXACJNE A,#50H,COMP CJNE A,#50H,COMP ;A;A50H50H时转时转COMPCOMPSJMP LOOP2SJMP LOOP2 ;A=50H;A=50H时转时转LOOP2LOOP2COMP:COMP:JNC LOOP3JNC LOOP3 ;A50H;A50H时转时转LOOP3LOOP3LOOP1:LOOP1: : : : : : : : : : :LOOP2: : :LOOP2: : : : : : : : :LOOP3: : :LOOP3: : : : :119119感谢你的观看感谢你的观看20192019年年6 6月月9 9位操作指令应用举例(三)l l已知:外部已知:外部RAMRAM的的2000H2000H开始有一个输入数据缓开始有一个输入数据缓冲区,数据区以回车符冲区,数据区以回车符CRCR(对应的(对应的ASCIIASCII码为码为0DH0DH)为结束标志,试编程将正数送)为结束标志,试编程将正数送30H30H开始的开始的单元、负数送单元、负数送40H40H开始的单元。开始的单元。2000H数据缓冲区30H40H正数存储区负数存储区片外RAM内部RAM120120感谢你的观看感谢你的观看20192019年年6 6月月9 9MOV 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,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;结束;结束返回121121感谢你的观看感谢你的观看20192019年年6 6月月9 9伪指令 伪伪指指令令不不是是真真正正的的指指令令,无无对对应应的的机机器器码码,在在汇汇编编时时不不产产生生目目标标程程序序( (机机器器码码) ),它它只只是是用用来来对对汇汇编编过过程程进进行行某种控制。某种控制。标标准准的的MCSMCS 5l5l汇汇编编程程序序( (如如IntelIntel的的ASM51)ASM51)定定义义的的伪伪指令常用的有以下几条:指令常用的有以下几条:(1) ORG (1) ORG 汇编起始命令汇编起始命令格式:格式:ORG 16ORG 16位地址位地址 其其功功能能是是规规定定该该伪伪指指令令后后面面程程序序的的汇汇编编地地址址,即即汇编后生成目标程序存放的起始地址,汇编后生成目标程序存放的起始地址,例如:例如:ORG 2000H ORG 2000H START START:MOV AMOV A,#64H#64H 既既规规定定了了标标号号STARTSTART的的地地址址是是2000H2000H,又又规规定定了了汇汇编编后的第一条指令码从后的第一条指令码从2000H2000H开始存放。开始存放。 ORGORG可以多次出现在程序的任何地方,当它出现时,可以多次出现在程序的任何地方,当它出现时,下一条指令的地址就由此重新定位。下一条指令的地址就由此重新定位。 122122感谢你的观看感谢你的观看20192019年年6 6月月9 9(2) END (2) END 汇编结束命令汇编结束命令ENDEND命令通知汇编程序结束汇编。在命令通知汇编程序结束汇编。在ENDEND之之后所有的汇编语言指令均不予以处理。后所有的汇编语言指令均不予以处理。(3) EQU (3) EQU 赋值命令赋值命令格式:格式:字符名称字符名称EQU EQU 项项( (数或汇编符号数或汇编符号) EQU) EQU命令是把命令是把“项项”赋给赋给“字符名称字符名称”,注意这里的字符名称不等于标号注意这里的字符名称不等于标号( (其后没有冒号其后没有冒号) ),其中的项,可以是数也可以是汇编符号。,其中的项,可以是数也可以是汇编符号。用用EQUEQU赋过值的符号名可以用作数据地址、赋过值的符号名可以用作数据地址、代码地址、位地址或是一个立即数。因此,它代码地址、位地址或是一个立即数。因此,它可以是可以是8 8位的、也可以是位的、也可以是1616位的。如:位的。如:AA EQU R1 AA EQU R1 ;AAAA就代表了工作寄存器就代表了工作寄存器RlRl MOV A MOV A,AA AA ;123123感谢你的观看感谢你的观看20192019年年6 6月月9 9(4) DATA (4) DATA 数据地址赋值命令数据地址赋值命令 格式:格式: 字符名称字符名称 DATA DATA 表达式表达式 (5) DB (5) DB 定义字节命令定义字节命令 格式:格式: DBDB项或项表项或项表 (6) DW (6) DW 定义字命令定义字命令格式:格式:DW 16DW 16位数据项或项表位数据项或项表 (7) DS (7) DS 定义存储空间命令定义存储空间命令格式:格式:DSDS表达式表达式 (8) BIT (8) BIT 位地址符号命令位地址符号命令格式:格式:字符名字符名BIT BIT 位地址位地址 124124感谢你的观看感谢你的观看20192019年年6 6月月9 9
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号