《单片机原理》第二章.ppt_第1页
《单片机原理》第二章.ppt_第2页
《单片机原理》第二章.ppt_第3页
《单片机原理》第二章.ppt_第4页
《单片机原理》第二章.ppt_第5页
已阅读5页,还剩154页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章 MCS-51指令系统与汇编语言程序设计,2.1 概述 2.2 寻址方式 2.3 MCS-51指令系统 2.4 汇编语言程序设计 2.5 高级语言Keil C51简介,2.1 概述,2.1.1 单片机程序设计语言的种类 2.1.2 汇编语言指令格式及常用伪指令 2.1.3 MCS-51指令的分类 2.1.4 MCS-51指令中常用的符号,2.1 概述,2.1.1 单片机程序设计语言的种类,按照语言的结构及其功能可以分为三种:,(1)机器语言(Machine Language) 直接用机器码(0、1代码)编写程序、能够为计算机直接执行的机器级语言。 机器码是一串由二进制代码“0”和“1”组成的二进制数据,其执行速度快,但是可读性极差。机器语言一般只在简单的开发装置中使用,程序的设计、输入、修改和调试都很麻烦。,2.1 概述,(2)汇编语言(Assembly Language) 指用指令助记符代替机器码的编程语言。 汇编语言程序结构简单,执行速度快,程序易优化,编译后占用存储空间小,是单片机应用系统开发中最常用的程序设计语言。汇编语言的缺点是可读性比较差,只有熟悉单片机的指令系统,并具有一定的程序设计经验,才能研制出功能复杂的应用程序。,2.1.1 单片机程序设计语言的种类,按照语言的结构及其功能可以分为三种:,2.1 概述,(3)高级语言(High-Level Language) 在汇编语言的基础上用接近人的自然语言的语句来编写程序,例如PL/M-51、C51等,程序可读性强,通用性好,适用于不熟悉单片机指令系统的的用户。 高级语言是面向过程而独立于机器的通用语言。缺点是实时性不高,结构不紧凑,编译后占用存储空间比较大,这一点在存储器有限的单片机应用系统中没有优势。,单片机的汇编语言不但不会被高级语言完全取代,甚至还将继续占据重要地位。,2.1,2.1.1 单片机程序设计语言的种类,按照语言的结构及其功能可以分为三种:,2.1 概述,2.1.2 汇编语言指令格式及常用伪指令,1、常用单位与术语 位(bit):位是计算机所能表示的最小的、最基 本的数据单位,通常是指一个二进制 位。 字节(Byte):一个连续的8位二进制数码称为 一个字节,即1Byte=8bit。 字(Word):通常由16位二进制数码组成,即 1Word=2Byte。 字长:字长是指计算机一次处理二进制数码位的 多少。 MCS-51型单片机是8位机,即它的字长为8位。,2、汇编语言指令格式,标号: 操作码 操作数 ,操作数 ;注释,2.1 概述,2.1.2 汇编语言指令格式及常用伪指令,其中: 项是可选项。 标号:指本条指令起始地址的符号,也称为指令的符号地 址。代表该条指令在程序编译时的具体地址。 操作码:又称助记符,它是由对应的英文缩写构成的,是 指令语句的关键。它规定了指令具体的操作功 能,是一条指令中不可缺少的内容。 操作数:它既可以是一个具体的数据,也可以是存放数据 的地址。,Start: MOV A, #0FH; 将循环次数初值送累加器,3、常用伪指令,2.1 概述,2.1.2 汇编语言指令格式及常用伪指令,伪指令(也称为汇编程序的控制命令)是程序员发给汇编程序的命令,用来设置符号值、保留和初始化存储空间、控制用户程序代码的位置。 伪指令只出现在汇编前的源程序中,仅提供汇编用的某些控制信息,不产生可执行的目标代码,是CPU不能执行的指令。,(2)结束汇编伪指令END 格式:标号: END 表达式 功能:放在源程序的末尾,表明源程序的汇编到此结束。,2.1 概述,(1)定位伪指令ORG 格式:ORG n 其中:n为绝对地址,可以是十六进制数、标号或表达式。,例 ORG 1000H START:MOV A,#20H MOV R0,#30H ,MOVX DPTR,A END,3、常用伪指令,2.1.2 汇编语言指令格式及常用伪指令,(3)赋值伪指令EQU 格式:字符名称x EQU 赋值项n 功能:将赋值项n的值赋予字符名称x。,2.1 概述,ORG 1000H LEDMAP: DB 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h DB 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h;,LEDBuf EQU 60h ; 显示缓冲,(4)定义字节伪指令DB 格式:标号: DB x1, x2, xn 功能:将8位数据(或8位数据组)x1, x2, xn顺序存放 在从当前程序存储器地址开始的存储单元中。,2.1,3、常用伪指令,2.1.2 汇编语言指令格式及常用伪指令,1、按指令字节数分类 单字节指令、双字节指令和三字节指令。,2.1 概述,2.1.3 MCS-51指令的分类,MCS-51指令系统有111条指令,可按下列3种方式分类:,2、按指令执行时间分类 单机器周期指令、双机器周期指令和四机器周期指令。,1、按指令字节数分类,2.1 概述,2、按指令执行时间分类,3、按指令功能分类,2.1,2.1.3 MCS-51指令的分类,MCS-51指令系统有111条指令,可按下列3种方式分类:,2.1.4 指令中的常用符号,Rn(n=07):表示当前工作寄存器R0R7中的任一个。 Ri(i=0或1):表示当前寄存器组中用于间址的R0或R1。 #data: 表示8位立即数。 #data16:表示16位立即数。 direct: 表示片内RAM的8位单元地址。 addr11:表示11位目的地址,用于ACALL和AJMP指令中。 addr16:表示16位目的地址,用于LCALL和LJMP指令中。 rel: 用补码形式表示的8位二进制地址偏移量,取值范围 为128+127,主要用于相对转移指令。,2.1 概述,bit:表示片内RAM的位寻址区,或者是可以位寻址的 SFR的位地址。 A(或ACC)、 B :表示累加器、 B寄存器。 C:表示PSW中的进位标志位Cy。 :在间接寻址方式中,是间址寄存器指针的前缀标志。 $:表示当前的指令地址。 (X):表示由X所指定的某寄存器或某单元中的内容。 (X):表示由X间接寻址单元中的内容。,2.1.4 指令中的常用符号,2.1 概述,2.1,2.2.1 寄存器寻址 2.2.2 直接寻址 2.2.3 立即数寻址 2.2.4 寄存器间接寻址 2.2.5 变址寻址 2.2.6 相对寻址 2.2.7 位寻址,2.2 寻址方式,在指令的操作数位置上,用于表征寻找操作数的方法定义为“寻址方式”。 正确地理解、掌握寻址方式,是学习、使用指令的关键。在MCS-51单片机中,共使用了以下7种寻址方式,2.2.1 寄存器寻址,指令中含有一个存有操作数的寄存器Rn(n=07),2.2 寻址方式,【特点】寄存器寻址方式的指令大多是单字节指令。寄存 器的3位代码与操作码OP共同占用一个指令字节。,例:MOV A,Rn ;将寄存器Rn中的内容送累加器A中 MOV Rn,A ;将累加器A中的数据送寄存器Rn,以MOV A, R7为例,使用R7寄存器,所以 r r r =111,即指令的机器码为:0EFH,1 1 1 0 1 r r r,操作码OP,寄存器代码111,E8HEFH,MOV A, Rn,ROM的一个字节,2.2,2.2.2 直接寻址,指令本身直接给出操作数在RAM中存放的地址。,2.2 寻址方式,MOV A , direct ;将内存地址direct中的内容送入累加器 MOV direct1, direct2 ;将内存地址direct2的内容送入direct1中,例如:MOV A,30H ;将RAM 30H单元数据送累加器A,【特点】直接寻址方式的指令为23字节指令。每个直接地址 自身占用一个指令字节。,n,n+1,30H,累加器A,X,使用直接寻址应注意的两个问题:,1、当地址恰好在SFR区域时,地址也可用寄存器名来表示。,2.2.2 直接寻址,2.2 寻址方式,如: MOV A, 80H 可以写成 MOV A, P0 后者用SFR中寄存器的名字取代它的物理地址80H。后者更容易阅读和交流,所以提倡使用SFR中寄存器名称来代替直接地址。,如: MOV A, SBUF ;串口数据缓冲器数据送A MOV TH1, #0FEH ;为定时器1赋初值,MOV A, 00H ;将RAM中00H单元数据送累加器A MOV A, R0 ;将工作寄存器R0的内容送累加器A,返回,2.2.2 直接寻址,2.2 寻址方式,2、当直接地址是在工作寄存器区中时,可以使用两种寻址方式来访问。如:,使用了不同的寻址方式,指令的结构与字节数也不相同。 前者是:11100101(0E5H)、00000000(00H)双字节。 后者是:11101000(0E8H) 单字节;,最好用寄存器寻址方式来访问,类似的还有累加器A: INC A 寄存器寻址方式(单字节); INC ACC 直接寻址方式(双字节); INC 0E0H 直接寻址方式(双字节)。,2.2,2.2.3 立即寻址,指令中直接含有所需要的操作数data。,2.2 寻址方式,MOV A, #data ;将8位立即数送累加器A MOV DPTR, #data16 ;16位立即数送DPTR寄存器,【特点】立即数寻址的指令长度为2或3个字节。,ROM,DPTR,例:MOV DPTR, #2000H,n,n+1,n+2,注:对于16位立即数指令,汇编时高8位在前,低8位在后。,【注意】MOV A, #30H与 MOV A, 30H 两者的区别。,n,n+1,ROM,累加器A,MOV A, #30H,n,n+1,ROM,累加器A,MOV A, 30H,30H,RAM,2.2.3 立即寻址,2.2 寻址方式,2.2,2.2.4 寄存器间接寻址,指令中含有保存操作数地址的寄存器(Ri或DPTR)。CPU首先从寄存器中找到操作数地址,然后再从该地址中找到操作数 。,2.2 寻址方式,MOV A , Ri; MOVX A, Ri; MOVX DPTR, A,寻址范围: 内部RAM低128B(只能使用R0或R1作间址寄存器)、外部RAM。对于外部低256单元RAM的访问,除可以使用DPTR外,还可以使用R0或R1作间址寄存器。,下列的程序正确吗 MOV R1, #80H MOV A, R1,MOV R0, #30H ;立即数送R0寄存器 MOV A,R0 ;从RAM的30H单元取数送累加器A,30H,R0,00H,累加器A,1,2,3,2.2.4 寄存器间接寻址,【注意】 MOV A, R0 和 MOV A, R0 指令的区别。,2.2,2.2 寻址方式,MOV A, R0 执行过程示意图,指令使用DPTR或PC中的内容作为基地址,再与累加器A的内容相加,其和作为操作数地址。如: MOVC A, A+PC ; PC内容为基地址与A的内容相加得 操作数地址,并将此操作数送A MOVC A, A+DPTR ;DPTR内容为基地址与A的内容相 加得操作数地址并将此操作数送A,2.2.5 变址寻址,这是访问程序存储器ROM中数据的唯一的寻址方式。,变址寻址方式用于查表操作,而数据表是建立在程序存储器ROM中。,2.2 寻址方式,【例】已知ROM中的0300H-0309H 为09的平方表,编程求 A中数据的平方(设A=02H)。,02H,0300H,0302H,累加器A,DPTR,0300H (DPTR) + 02H (A) 0302H,MOVC A,A+DPTR,0300H,平方表,ALU,解:MOV DPTR, #0300H ;指针DPTR赋表头地址 MOVC A, A+DPTR ;从0302H单元取数4送A,ROM,变址寻址,2.2,2.2 寻址方式,相对转移指令使用的一种寻址方式。,2.2.6 相对寻址,SJMP short_lable,2.2 寻址方式,无条件转向短标号short_lable地址 该指令操作码为80H,操作数为偏移量rel(+127-128), 它由汇编程序汇编时自动计算填入。计算公式为: rel= short_lable地址-PC值,或: rel=short_lable地址-相对转移指令地址-相对转移指令字节数,即相对转移指令中给出一个转移地址的偏移量rel。在执行中将当前PC值(执行当前指令后的PC值)与偏移量rel(补码)相加,形成实际转移的目标地址 相对寻址方式。,【例】ORG 0100H S1:CLR A MOV R0,#45H SJMP S2 SETB C SETB 00H S2:MOV A,#0FH . . .,0100H,0106H,0103H,0105H,0108H,Short_lable,PC值,rel值,0105H + 03H 0108H,2.2 寻址方式,2.2,指令的形式同直接寻址相似,不同的是:指令中的地址是“位地址” ,而不是字节地址。 MOV C,bit,2.2.7 位寻址,如: MOV C,02H;将位地址为02H中的内容送Cy中 类似的还有逻辑运算指令等。,除了RAM中的位寻址区外,大多SFR(地址能够被8整除的)都可以按位寻址,这对编程尤为重要。,2.2 寻址方式,作为嵌入式控制器,CPU更多的是处理“开关量”而不单纯是字节结构的数据。因此MCS-51在指令设计上刻意设计了大量的“布尔操作”即位操作,这为系统应用带来了很大的方便。,MCS-51 单片机 控制、检测 系统,驱动器,电动机,外设1,外设2,状态信号,状态信号,控制信号,2.2.7 位寻址,2.2 寻址方式,【举例】: SETB 90H ;将P1口的D0位置1 为了增加程序的可读性,凡在SFR中的位地址都可以使用符号来替代。如本例中,完全可以使用下面的指令格式: SETB P1.0 ;将P0口的D0位置1 又如: SETB EA (SETB 0AFH);开中断 SETB TR0 (SETB 8CH) ;启动定时器 这种指令在编译时,是要先将符号地址进行转换的。,2.2,2.2.7 位寻址,2.2 寻址方式,2.3 MCS-51指令系统,2.3.0 预备知识:WAVE仿真开发软件安装与使用 2.3.1 数据传送指令 2.3.2 算逻运算与移位指令 2.3.3 控制转移和位操作指令,WAVE仿真开发软件把源程序编辑、编译、下载、调试等操作全部集中在一个环境下进行,支持MCS-51、PIC两大系列、不同种类的单片机。 具有软件模拟执行功能,除输入、输出操作外,均可在软件模拟环境下完成绝大部分应用程序的调试。,2.3.0 WAVE仿真软件的安装与使用,2.3 MCS-51指令系统,1、WAVE仿真软件功能简介,2.3 MCS-51指令系统,2、WAVE仿真软件的安装,1)从WAVE网站/download.htm (南京伟福实业有限公司)下载WAVE6000 for Windows (支持LAB2000)仿真开发软件(ZIP压缩文件格式),经 ZIP解压后,运行其中的SETUP.EXE文件即可,该安装程序将引导用户完成WAVE 6000仿真开发软件的安装过程。 2)从课件邮箱下载应用程序文件“wave6000_G”,双击安装即可。,2.3.0 WAVE仿真软件的安装与使用,1、WAVE仿真软件功能简介,1)安装后,从“WAVE6000_GBIN”子目录下双击wave图标进入界面;,2.3 MCS-51指令系统,3、WAVE仿真软件的使用,2、WAVE仿真软件的安装,2.3.0 WAVE仿真软件的安装与使用,1、WAVE仿真软件功能简介,2)新建一个汇编语言的源程序(如:f1.asm); 3)编译、调试。,完成安装后,首次启动看到的界面,2.3.0 WAVE仿真软件的安装与使用,2.3 MCS-51指令系统,2.3,2.3.1 数据传送指令,2.3 MCS-51指令系统, 内部数据传送类指令 外部数据传送类指令 堆栈操作指令 数据交换指令,数据传送是编程中使用最多、最主要的操作。 在传送过程中,源地址的内容不被改变(COPY)。 传送类指令除了以累加器A为目标的传送对PSW的P有影响外,其余的传送类指令对PSW一概无影响。,指令通式:MOV ,2.3,特点:单片机内部各单元之间的内部数据传送,指令的源操作数和目的操作数都在单片机内部。,1、立即寻址型传送指令 2、直接寻址型传送指令 3、寄存器寻址型传送指令 4、寄存器间址型传送指令 5、内部数据传送类指令的使用, 内部数据传送指令,2.3,2.3.1 数据传送指令,1、立即寻址型传送指令,【特点】源操作数是立即数,处在指令的第二或第三字 节,所以这类指令都是多字节指令,有如下4条。 MOV A ,#data ; A data (双字节指令) MOV Rn ,#data ; Rn data (双字节指令) MOV Ri ,#data ; (Ri) data(双字节指令) MOV direct ,#data ; direct data (三字节指令),这类指令多用于程序的初始化。如: MOV R0,#20H ;R0 #20H MOV A,#00H ;累加器A清零,2.3.1 数据传送指令, 内部数据传送指令,【例】已知:R0=20H,试问单片机执行如下指令后,累加器A、R7、20H和21H单元中的内容各是什么。 MOV A, #18H MOV R7, #28H MOV R0, #38H MOV 21H, #48H,,2.3.1 数据传送指令,1、立即寻址型传送指令, 内部数据传送指令,【特点】指令中至少含有一个源操作数或目的操作数的地址。是2个或3个字节的指令格式,其中直接地址在第2或第3个字节上。这类指令有如下5条:,2、直接寻址型传送指令, 内部数据传送指令,MOV A , direct MOV direct , A MOV Rn , direct MOV Ri , direct MOV direct2 , direct1 【注意】direct为内部RAM和SFR的地址,即direct 适用于片内所有的地址。,2.3.1 数据传送指令,MOV A, 30H ;内存RAM30h单元数据送A MOV 50H, A ;A中内容送RAM的50h单元 MOV R6, 31H ;RAM的30h 内容送R6寄存器 MOV Ri, 30H ;RAM30h内容送Ri指定的RAM单元 MOV P1, 32H ;RAM32h内容送P1口(p1:符号地址) MOV 90H, 32H ;(同上,试比较两种表示方法,一个 指令两种写法),,2.3.1 数据传送指令,2、直接寻址型传送指令, 内部数据传送指令,【特点】指令中含有存放操作数的寄存器名Rn, 其中(n0,1, 2, 3, 4, 5, 6, 7)。 共有如下4条: MOV A ,Rn MOV Rn ,A MOV direct ,Rn MOV Rn,direct,3、寄存器寻址型传送指令, 内部数据传送指令,,2.3.1 数据传送指令,【特点】指令中Ri中存放的不是操作数本身,而是操作数 在RAM中的地址(i=0、1)。 格式如下: MOV A ,Ri MOV Ri ,A MOV direct ,Ri 【注意】Ri中存放操作数的地址是有所选择的,只有 非SFR的RAM单元才能使用这种寻址方式。,4、寄存器间接寻址型传送指令, 内部数据传送指令,2.3.1 数据传送指令,【例】已知(40h)=11h,(41h)=22h,R0=40h和R1=41h。试问:下面的指令执行后,累加器A、RAM的40h、41h和42h单元中的内容各是什么。 MOV A , R0 MOV R1, A MOV 42H, R1,,2.3.1 数据传送指令,4、寄存器间接寻址型传送指令, 内部数据传送指令,(1)不能根据主观意愿去“创造”指令。,5、内部数据传送类指令的使用, 内部数据传送指令,例如:要将R0中的数据传送到R1中。如何使用指令去完成上述的操作? MOV R1, R0 是否可以?,回答是否定的!因为在MCS-51的指令系统中没有此条指令!只能使用: MOV A, R0 或: MOV 01h, 00h MOV R1, A 因此,必须从MCS-51的指令表中选择使用指令。,2.3.1 数据传送指令,MCS-51内部数据传送类指令方式图,累加器A,direct 直接寻址,Ri间址,Rn寄存器,Data立即数, 内部数据传送指令,2.3.1 数据传送指令,返回,(2)会正确地估计指令的字节。凡是包含有立即数、直接地址的指令,都应当在原有的基础上加1或2。 【举例】 mov a ,Ri ( )个字节 mov a ,direct ( )个字节 mov direct ,data ( )个字节 mov direct2 ,direct1 ( )个字节,(3)养成一个好的、合理的编程习惯。 (4)注意给程序进行适当的注释,这对于阅读、编写和修改程序都是非常重要的。,(1)不能根据主观意愿去“创造”指令。,2.3.1 数据传送指令,2.3.1,5、内部数据传送类指令的使用, 内部数据传送指令,1、16位数传送指令 2、外部ROM的字节传送指令 3、外部RAM的字节传送指令, 外部数据传送指令,【特点】单片机内部与外部之间的外部数据传送。,2.3.1,2.3.1 数据传送指令,1、16位数传送指令,MCS-51指令系统中唯一的一条16位数据传送类指令。 MOV DPTR,#data16 DPTR是单片机内部SFR中的两个寄存器DPH、DPL组合而成。其中DPH为高八位,DPL为低八位。 DPTR是一个专门用于访问外部存储器的间址寄存器。寻址能力为 64K (065535)。,,2.3.1 数据传送指令, 外部数据传送指令,这类指令有两条,都属于变址寻址指令。 MOVC A,A+DPTR ;A (A+DPTR) MOVC A,A+PC ;PC PC+1, A (A+PC) ROM单元地址由A和DPTR或PC内容相加获得。 该指令称为“查表”指令。 前者用DPTR作为基地址;后者是以程序计数器PC为基地址。由于PC的内容与该指令在ROM中的位置有关,并且PC的值是不能随便修改的,所以选择PC作基地址时,往往要通过累加器A进行“查表修正”。,2、外部ROM的字节传送指令,2.3.1 数据传送指令, 外部数据传送指令,【例】已知累加器A中存有09范围内的数,试用查表指令编写出查找出该数平方的程序。 1)采用DPTR作基址寄存器: MOV DPTR,#2000H ;指针赋值 MOVC A,A+DPTR;查表得平方值送A,2000h,2009h,2008h,2007h,2006h,2005h,2004h,2003h,2002h,2001h,2、外部ROM的字节传送指令,2.3.1 数据传送指令, 外部数据传送指令,2)采用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 81 END data为MOVC指令对表头地址之间的单元数。,2000h,2009h,2008h,2007h,2006h,2005h,2004h,2003h,2002h,2001h,1FFFh,1FFEh,1FFDh,1FFCh,1FFBh,通过A进行修正,2.3.1 数据传送指令,使用 MOVC A,A+PC 指令的特点: 1)与使用MOVC A,A+DPTR 指令不同,使用前应当对A中的偏移量加一个“修正值”,修正值的大小为:MOVC指令与表头之间的字节数; 2)程序与数据表在ROM中的位置是可以浮动的。 只要MOVC指令与表之间的距离不变,则程序可以在ROM中的任意位置上“浮动”,程序具有可修改性。,,2.3.1 数据传送指令,2、外部ROM的字节传送指令, 外部数据传送指令,实现外部RAM和累加器A之间的数据传送。 只能使用寄存器间址的寻址方式。 在MOVX指令模式下,单片机的P0、P2口做访问外部数据的地址和数据的总线。其中: P0口做低8位地址和数据的复用总线; P2口做高8位地址总线。,3、外部RAM的字节传送指令, 外部数据传送指令,MOVX A ,Ri 使用Ri寄存器间址寻址范围0255 MOVX Ri ,A 在硬件电路中P2口不用。 MOVX A,DPTR ; 使用DPTR间址,寻址范围065535 MOVX DPTR,A ;在硬件电路中,使用P0口输出低8位, P2口输出高8位外部RAM地址。,2.3.1 数据传送指令,【例】已知外部RAM的88H单元有一个数x,试编程将x送外部RAM的1818H单元。 【解】:外部RAM中的数据是不能直接传送的,因此必须使用两次 MOVX 指令完成此操作。 ORG 2000H MOV R0,#88H ;为8位指针赋值 MOV DPTR,#1818H;为16位指针赋值 MOVX A,R0 ;取 x 到累加器A MOVX DPTR,A ;x 送RAM的1818h单元 SJMP $ ;停机 END, 外部数据传送指令,返回,,2.3.1 数据传送指令,堆栈操作是一种特殊的保护数据的传送指令。 堆栈:一个用来保存程序断点、数据的存储区域。在51单片机中,栈区可以使用片内RAM的任意位置,具体位置由指针SP来确定(系统上电时,SP=07h)。 1)进栈操作: PUSH direct ;sp+1sp, (direct)(sp) 2)出栈操作: POP direct ;(sp) (direct), sp-1sp, 堆栈操作指令,2.3.1 数据传送指令,“先加后压” 、 “先弹后减”,org 0800h delay: push 00h push 01h mov r0, #00h Loop1: mov r1, #00h Loop2: djnz r1, loop2 djnz r0, loop1 pop 01h pop 00h ret,SP,思考:为什么R0、R1的内容要进栈?,【例】产生延时的子程序delay。, 堆栈操作指令,2.3.1 数据传送指令,PUSH、POP 指令使用的寻址方式为直接寻址,所以 push a X(有的编译系统识别,将a转换为acc) push acc push 0e0h push r0 X push 00h 进栈操作是堆栈向上“生长”的过程,即sp+1;出栈则相反。 系统上电时,SP=07h。SP的值可以根据需要进行修改,在确定SP值时要考虑对栈区对数据区的影响,以避免两者冲突。如:在程序的初始化时加一条: MOV SP,60H,使用PUSH、POP 指令的注意事项,2.3.1,2.3.1 数据传送指令,一种方便的累加器和寄存器/RAM之间的数据交换。避免了使用MOV 指令交换时的不便。 格式: XCH a ,Rn ;a Rn XCH a ,direct ;a (direct) XCH a ,Ri ;a (Ri) XCHD a ,Ri ;a 30 (Ri) 30低四位交换 举例:将R1和R2的内容交换。 MOV A, R1 ;取数据送A XCH A, R0 ;与R0交换 MOV R2, A ;送回到R1, 数据交换指令,2.3.1 数据传送指令,【例】已知,片外RAM20h单元、内部RAM20h单元分别有数x和y,试编程将两数相互交换。 mov R1, #20h ;指针赋初值 movx a, R1 ;x a xch a, R1 ;交换 a(20h),ya movx R1, a ;y(20h)片外RAM,(y) x,20h,20h,累加器A,1,2,3,跳过例2, 数据交换指令,2.3.1,2.3.1 数据传送指令,【例】已知RAM50h单元有一个09范围内的数,试编程将它变成相应的ASCII码。 【解】:09的ASCII码是30h39h,两者相差30h。 方法一:对50h单元的数据高四位组装一个30h。 mov r0,#50h ;指针赋值 mov a,#30h ;30hA xchd a,r0 ;A30(r0)30,在A中组成ASCII码 mov r0,a ;A中的ASCII码送回50h单元,50h,00110101,A=30h,交换后A=35h,1,2,方法二:把50H的内容直接与30H相加,形成相应的ASCII码(略),2.3.1 数据传送指令, 数据交换指令,2.3.1,功能:完成算术运算、逻辑运算和循环移位三大 功能。 特点:大多指令都要由累加器A来存放一个源操 作数,并把操作结果放回累加器A中。, 算术运算指令 逻辑运算指令 移位指令,2.3,2.3.2 算逻运算和移位指令, 算术运算指令,不带进位的加法指令 ( ADD ) 1、加法指令: 带进位的加法指令 ( ADDC ) 加1指令 ( INC ) (编程举例) 2、减法指令: 带进位的减法指令 ( SUBB ) 减1指令 ( DEC ) 3、十进制调整指令: ( DA A ) 4、乘法和除法指令: (MUL DIV),2.3.2,2.3.2 算逻运算和移位指令,1、加法指令(之一):不带进位的加法指令,格式: ADD A ,Rn ;A +Rn A ADD A ,direct ;A +(direct) A ADD A ,Ri ;A +(Ri) A ADD A ,#data ;A +data A 【注意】 参加运算的数据都应是8位的,结果也是8位并影响PSW。 根据编程者的需要,8位数据可以是无符号数(0255),也可以是有符号数(-128+127)。 不论编程者使用的数据是有符号数还是无符号数,CPU都将它们视为有符号数(补码)进行运算并影响PSW。, 算术运算指令,2.3.2 算逻运算和移位指令,,【例】分析执行下列指令后累加器A和PSW中各标志的变化。 MOV A,#19H Cy=0; ADD A,#66H AC=0 OV=CPCS=0 25 A= 0 0 0 1 1 0 0 1 B P=1 + 102 data= 0 1 1 0 0 1 1 0 B 127 0 0 1 1 1 1 1 1 1 B 1)若两数都是无符号数,则因Cy=0无溢出,25+102=127。 2)若两个数是有符号数,则因OV=0无溢出。,cy,0 0 0 CP CS AC,,1、加法指令(之一):不带进位的加法指令, 算术运算指令,2.3.2 算逻运算和移位指令,【例】分析执行下列指令后累加器A和PSW中各标志的变化。 MOV A,#5AH Cy=0; ADD A,#6BH AC=1; OV=CPCS=1 90 A= 0 1 0 1 1 0 1 0 B P=0 + 107 data=0 1 1 0 1 0 1 1 B 197 0 1 1 0 0 0 1 0 1 B CP CS AC 1)若两数是无符号数,因Cy=0无溢出:90+107=197 2)若两数是有符号数,因OV=1,故有溢出,两个正数相加后变为负数,很明显结果是不正确的。,1、加法指令(之一):不带进位的加法指令, 算术运算指令,,2.3.2 算逻运算和移位指令,格式: ADDC A ,Rn ;A +Rn +Cy A ADDC A ,direct;A +(direct) +Cy A ADDC A ,Ri ;A +(Ri) +Cy A ADDC A ,#data;A +data +Cy A 【注意】 这里的Cy是指令执行前的Cy; 对PSW的影响同ADD指令。,1、加法指令(之二):带进位的加法指令, 算术运算指令,,2.3.2 算逻运算和移位指令,格式: INC A ;累加器A加1 INC Rn ;Rn+1Rn INC direct ;内存单元数据加1 INC Ri ;内存单元数据加1 INC DPTR ;dptr+1dptr 【注意】 除第一条对PSW的P有影响外,其余对PSW均无影响。 由于上面的原因,INC指令不能作为一般的数据算术运算使用(为什么?),而常用于修改数据指针等控制、循环语句中使用。,1、加法指令(之三):加1指令(修改指针专用), 算术运算指令,2.3.2 算逻运算和移位指令,【例】已知片内M1、M2单元中存有两个16位无符号数X1、X2(低位在前)。试写出求解X1+X2的程序段,并将结果放入M1、M1+1单元(低8位在M1单元)。设两数之和不会超过16位(65535)。,M1,M1+1,M2,M2+1,1、加法指令, 算术运算指令,2.3.2 算逻运算和移位指令,MOV R0,#M1;x1指针赋初值 MOV R1,#M2;x2指针赋初值 MOV A,R0;取x1低8位送A ADD A,R1;x1与x2低8位相加 MOV R0,a ;低8位和送m1单元 INC 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,2.3.2 算逻运算和移位指令,1、加法指令, 算术运算指令,【例】要求在内存40H单元开始的16个单元建立一个数据区,分别存0、1、2,0FH;将该数据块的数据移动到外部存储器2000H开始的区域。,40H,41H,4FH,2000H,2001H,200FH,2.3.2 算逻运算和移位指令,1、加法指令, 算术运算指令,MOV R0,#40H ;内部RAM指针赋初值 MOV R2,#0FH ; R2计数指针赋初值 MOV A,#00H ; 第一个数据送A START:MOV R0,A ; 开始建立内部RAM数据区 INC R0 ; 指向下一单元 INC A ; 下一个数据 DJNZ R2,START ; 是否是最后一个单元 MOV DPTR,#2000H ;外部RAM指针赋初值 MOV R0,#40H MOV R2,#0FH LOOP : MOV A , R0 ;开始传送 MOVX DPTR,A INC R0,INC DPTR DJNZ R2,LOOP SJMP $,2.4.4,,2.3.2 算逻运算和移位指令,在MCS-51单片机的指令系统中,只有: 带进位的减法 SUBB 减1 DEC 两种减法指令。,2、减法指令(之一)带进位的减法指令, 算术运算指令,格式:SUBB A ,Rn ; A Rn Cy A SUBB A ,direct ; A (direct) Cy A SUBB A ,Ri ; A (Ri) Cy A SUBB A ,#data ; A data Cy A,【注意】 无论相减两数是无符号数还是有符号数,减法操作总是按有符号数来处理、影响PSW中相关的标志(见举例)。 在MCS-51的指令系统中没有不带Cy的减法,所以在使用SUBB指令前必须使用一条清除Cy的指令:CLR C。,2.3.2 算逻运算和移位指令,,【例】分析执行下列指令后累加器A和PSW中各标志的变化。 CLR C MOV A,#52H 01010010B = 82 SUBB A,#0B4H 10110100B = -76补 82 a= 0 1 0 1 0 0 1 0 -76 data= 1 0 1 1 0 1 0 0 158 1 1 0 0 1 1 1 1 0 = -98补 手工计算 CP CS AC 1 0 1 【分析】-98的结果显然是错的。原因是OV=1,即产生了溢出。所以,对于符号数的减法在运算后一定要检测OV。,2、减法指令(之一)带进位的减法指令, 算术运算指令,,2.3.2 算逻运算和移位指令,格式: DEC A ;累加器A减1 DEC Rn ;Rn-1Rn DEC direct ;内存单元数据减1 DEC Ri ;内存单元数据减1 【注意】 除了第一条对PSW的P有影响外,其余对PSW均无影响。 由于上面的原因,DEC指令一般不作为数据算术运算使用(因为不能对PSW的OV等位产生影响,它主要用于修改数据指针在循环语句中使用)。,2、减法指令(之二)减1指令(修改指针专用), 算术运算指令,,2.3.2 算逻运算和移位指令,CPU没有专用的BCD码加、减法指令,只能使用二进制加法指令再通过十进制调整指令实现BCD码的运算。 格式:DA A ;若AC=1或A30 9,则A+06hA ;若Cy =1或A74 9,则A+60hA 【注意】 DA A指令必须紧跟在加法指令之后; DA A指令只适用于加法指令的调整。,3、十进制调整指令, 算术运算指令,,2.3.2 算逻运算和移位指令,【例】试写出完成85+59的BCD码的加法程序。 MOV A,#85H ADD A,#59H DA A SJMP $ 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 0B 1 1 1 0 0 1 0 0B 高4位 9,所以加60h 0 1 1 0 0 0 0 0B 1 0 1 0 0 0 1 0 0B 结果为144h(1在Cy中) 【注意】144H是用16进制数来表示十进制,即BCD码。, 算术运算指令,,2.3.2 算逻运算和移位指令,BCD减法运算:由于DA A 指令只能对BCD码的加法进行调整,所以遇到BCD码的加法时就要将其减法变为加法运算,然后再使用DA A指令进行调整。 减法变加法就是使用BCD码的补码运算法则: 将被减数 - 减数变为被减数 + 减数的补码。 减数的补码 = BCD码的模-减数 其中BCD码的模为100 = 99H+01H = 9AH, 算术运算指令,2.3.2 算逻运算和移位指令,【例】在M1、M2中分别存有被减数91和减数36。试编程求91-36并将结果存入M3单元。 【解】: 1)算法:91-36=91+(100-36)=91+(9A-36) 2)编程: CLR C ; 清除Cy MOV A, #9AH ; BCD码的模100送A SUBB A, M2 ;计算减数的补码 (结果在A中) ADD A, M1 ;被减数+减数的补码(结果在A中) DA A ;十进制调整 MOV M3, A ;结果送M3单元 CLR C ;清除进位位(不要Cy), 算术运算指令,,2.3.2 算逻运算和移位指令,这是MCS-51单片机唯一的一类单字节4周期指令,它相当于4条加法指令的运行时间。 格式:MUL A B ;a b=b a (b存高8位,a存低8位) DIV A B ;a b=ab (a存商,b存余数) 【注意】指令对标志的影响: 在乘法指令中对PSW的影响有Cy、OV、和P。 其中: Cy0;P取决于A中“1”的个数;OV表明积的大 小。当积超过255(B0)时,OV=1。 在除法指令中,Cy、P与乘法相同。在执行除法指令 时,若B=0时OV=1,表示除数=0除法无意义,其余情 况下OV被复位。,跳过举例,4、乘法和除法指令, 算术运算指令,2.3.2 算逻运算和移位指令,【例】是将内存20H中的无

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论