《《单片机原理》第二章.ppt》由会员分享,可在线阅读,更多相关《《单片机原理》第二章.ppt(159页珍藏版)》请在三一办公上搜索。
1、第2章 MCS-51指令系统与汇编语言程序设计,2.1 概述2.2 寻址方式2.3 MCS-51指令系统2.4 汇编语言程序设计2.5 高级语言Keil C51简介,2.1 概述,单片机程序设计语言的种类 汇编语言指令格式及常用伪指令 MCS-51指令的分类 MCS-51指令中常用的符号,2.1 概述,单片机程序设计语言的种类,按照语言的结构及其功能可以分为三种:,(1)机器语言(Machine Language)直接用机器码(0、1代码)编写程序、能够为计算机直接执行的机器级语言。机器码是一串由二进制代码“0”和“1”组成的二进制数据,其执行速度快,但是可读性极差。机器语言一般只在简单的开发
2、装置中使用,程序的设计、输入、修改和调试都很麻烦。,2.1 概述,(2)汇编语言(Assembly Language)指用指令助记符代替机器码的编程语言。汇编语言程序结构简单,执行速度快,程序易优化,编译后占用存储空间小,是单片机应用系统开发中最常用的程序设计语言。汇编语言的缺点是可读性比较差,只有熟悉单片机的指令系统,并具有一定的程序设计经验,才能研制出功能复杂的应用程序。,单片机程序设计语言的种类,按照语言的结构及其功能可以分为三种:,2.1 概述,(3)高级语言(High-Level Language)在汇编语言的基础上用接近人的自然语言的语句来编写程序,例如PL/M-51、C51等,程
3、序可读性强,通用性好,适用于不熟悉单片机指令系统的的用户。高级语言是面向过程而独立于机器的通用语言。缺点是实时性不高,结构不紧凑,编译后占用存储空间比较大,这一点在存储器有限的单片机应用系统中没有优势。,单片机的汇编语言不但不会被高级语言完全取代,甚至还将继续占据重要地位。,2.1,单片机程序设计语言的种类,按照语言的结构及其功能可以分为三种:,2.1 概述,汇编语言指令格式及常用伪指令,1、常用单位与术语 位(bit):位是计算机所能表示的最小的、最基 本的数据单位,通常是指一个二进制 位。字节(Byte):一个连续的8位二进制数码称为 一个字节,即1Byte=8bit。字(Word):通常
4、由16位二进制数码组成,即 1Word=2Byte。字长:字长是指计算机一次处理二进制数码位的 多少。MCS-51型单片机是8位机,即它的字长为8位。,2、汇编语言指令格式,标号:操作码 操作数,操作数;注释,2.1 概述,汇编语言指令格式及常用伪指令,其中:项是可选项。标号:指本条指令起始地址的符号,也称为指令的符号地 址。代表该条指令在程序编译时的具体地址。操作码:又称助记符,它是由对应的英文缩写构成的,是 指令语句的关键。它规定了指令具体的操作功 能,是一条指令中不可缺少的内容。操作数:它既可以是一个具体的数据,也可以是存放数据 的地址。,Start:MOV A,#0FH;将循环次数初值
5、送累加器,3、常用伪指令,2.1 概述,汇编语言指令格式及常用伪指令,伪指令(也称为汇编程序的控制命令)是程序员发给汇编程序的命令,用来设置符号值、保留和初始化存储空间、控制用户程序代码的位置。伪指令只出现在汇编前的源程序中,仅提供汇编用的某些控制信息,不产生可执行的目标代码,是CPU不能执行的指令。,(2)结束汇编伪指令END 格式:标号:END 表达式 功能:放在源程序的末尾,表明源程序的汇编到此结束。,2.1 概述,(1)定位伪指令ORG 格式:ORG n 其中:n为绝对地址,可以是十六进制数、标号或表达式。,例 ORG1000H START:MOV A,#20H MOV R0,#30H
6、,MOVX DPTR,A END,3、常用伪指令,汇编语言指令格式及常用伪指令,(3)赋值伪指令EQU 格式:字符名称x EQU 赋值项n 功能:将赋值项n的值赋予字符名称x。,2.1 概述,ORG 1000HLEDMAP: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、常用伪指令,汇编语言
7、指令格式及常用伪指令,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。#d
8、ata:表示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所指定的某寄存器或某
9、单元中的内容。(X):表示由X间接寻址单元中的内容。,2.1.4 指令中的常用符号,2.1 概述,2.1,寄存器寻址 直接寻址 立即数寻址 寄存器间接寻址 变址寻址 相对寻址 位寻址,2.2 寻址方式,在指令的操作数位置上,用于表征寻找操作数的方法定义为“寻址方式”。正确地理解、掌握寻址方式,是学习、使用指令的关键。在MCS-51单片机中,共使用了以下7种寻址方式,2.2.1 寄存器寻址,指令中含有一个存有操作数的寄存器Rn(n=07),2.2 寻址方式,【特点】寄存器寻址方式的指令大多是单字节指令。寄存 器的3位代码与操作码OP共同占用一个指令字节。,例:MOV A,Rn;将寄存器Rn中的内
10、容送累加器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,【特点】直接寻
11、址方式的指令为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单元数据送累加器AMOV A,R0;将工作寄存器R0的内容送累加器
12、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
13、 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首先从寄存器中找到操作数地址,然后再从该地址中
14、找到操作数。,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
15、执行过程示意图,指令使用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,03
16、00H(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地
17、址-相对转移指令地址-相对转移指令字节数,即相对转移指令中给出一个转移地址的偏移量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+03H0108H,2.2 寻址方式,2.2,指令的形式同直接寻址相似,不同的是:指令中的地址是“位地址”,而不是字节地址。MOV C,b
18、it,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 为了增加程序的可读性,凡
19、在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指令系统,预备知识:WAVE仿真开发软件安装与使用 数据传送指令 算逻运算与移位指令 控制转移和位操作指令,WAVE仿真开发软件把源程序编辑、编译、下载、调试等操作全部集中在一个环境下进行,支持MCS-51、PIC两大系列、不同种类的单片机。具有软件模拟执行功能,除
20、输入、输出操作外,均可在软件模拟环境下完成绝大部分应用程序的调试。,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.
21、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指令系统,内部数据传送类指令 外部数据传送类指令 堆栈操作指令 数据交换
22、指令,数据传送是编程中使用最多、最主要的操作。在传送过程中,源地址的内容不被改变(COPY)。传送类指令除了以累加器A为目标的传送对PSW的P有影响外,其余的传送类指令对PSW一概无影响。,指令通式:MOV,2.3,特点:单片机内部各单元之间的内部数据传送,指令的源操作数和目的操作数都在单片机内部。,1、立即寻址型传送指令2、直接寻址型传送指令3、寄存器寻址型传送指令4、寄存器间址型传送指令5、内部数据传送类指令的使用,2.3.1.1 内部数据传送指令,2.3,2.3.1 数据传送指令,1、立即寻址型传送指令,【特点】源操作数是立即数,处在指令的第二或第三字 节,所以这类指令都是多字节指令,有
23、如下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 数据传送指令,2.3.1.1 内部数据传送指令,【例】已知:R0=20H,试问单片机执行如下指令后,累加器A、R7、20H和21H单元中的内容各是什么。MOV A,#18H MOV R7,#28H MOV R0,#38HMOV 21H,#4
24、8H,2.3.1 数据传送指令,1、立即寻址型传送指令,2.3.1.1 内部数据传送指令,【特点】指令中至少含有一个源操作数或目的操作数的地址。是2个或3个字节的指令格式,其中直接地址在第2或第3个字节上。这类指令有如下5条:,2、直接寻址型传送指令,2.3.1.1 内部数据传送指令,MOV A,directMOV direct,AMOV Rn,directMOV Ri,directMOV direct2,direct1【注意】direct为内部RAM和SFR的地址,即direct 适用于片内所有的地址。,2.3.1 数据传送指令,MOV A,30H;内存RAM30h单元数据送AMOV 50H
25、,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、直接寻址型传送指令,2.3.1.1 内部数据传送指令,【特点】指令中含有存放操作数的寄存器名Rn,其中(n0,1,2,3,4,5,6,7)。共有如下4条:MOV A,RnMOV Rn,AMOV direct,Rn MOV Rn,direct,3、寄存器寻址型传送指令,2.3.1.1
26、内部数据传送指令,2.3.1 数据传送指令,【特点】指令中Ri中存放的不是操作数本身,而是操作数 在RAM中的地址(i=0、1)。格式如下:MOV A,RiMOV Ri,AMOV direct,Ri【注意】Ri中存放操作数的地址是有所选择的,只有 非SFR的RAM单元才能使用这种寻址方式。,4、寄存器间接寻址型传送指令,2.3.1.1 内部数据传送指令,2.3.1 数据传送指令,【例】已知(40h)=11h,(41h)=22h,R0=40h和R1=41h。试问:下面的指令执行后,累加器A、RAM的40h、41h和42h单元中的内容各是什么。MOV A,R0 MOV R1,A MOV 42H,R
27、1,2.3.1 数据传送指令,4、寄存器间接寻址型传送指令,2.3.1.1 内部数据传送指令,(1)不能根据主观意愿去“创造”指令。,5、内部数据传送类指令的使用,2.3.1.1 内部数据传送指令,例如:要将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寄存器,Da
28、ta立即数,2.3.1.1 内部数据传送指令,2.3.1 数据传送指令,返回,(2)会正确地估计指令的字节。凡是包含有立即数、直接地址的指令,都应当在原有的基础上加1或2。【举例】mov a,Ri()个字节 mov a,direct()个字节 mov direct,data()个字节 mov direct2,direct1()个字节,(3)养成一个好的、合理的编程习惯。(4)注意给程序进行适当的注释,这对于阅读、编写和修改程序都是非常重要的。,(1)不能根据主观意愿去“创造”指令。,2.3.1 数据传送指令,5、内部数据传送类指令的使用,2.3.1.1 内部数据传送指令,1、16位数传送指令2
29、、外部ROM的字节传送指令3、外部RAM的字节传送指令,2.3.1.2 外部数据传送指令,【特点】单片机内部与外部之间的外部数据传送。,2.3.1 数据传送指令,1、16位数传送指令,MCS-51指令系统中唯一的一条16位数据传送类指令。MOV DPTR,#data16 DPTR是单片机内部SFR中的两个寄存器DPH、DPL组合而成。其中DPH为高八位,DPL为低八位。DPTR是一个专门用于访问外部存储器的间址寄存器。寻址能力为 64K(065535)。,2.3.1 数据传送指令,2.3.1.2 外部数据传送指令,这类指令有两条,都属于变址寻址指令。MOVC A,A+DPTR;A(A+DPTR
30、)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 数据传送指令,2.3.1.2 外部数据传送指令,【例】已知累加器A中存有09范围内的数,试用查表指令编写出查找出该数平方的程序。1)采用DPTR作基址寄存器:MOV DPTR,#2000H;指针赋值 MOVC A,A+DPTR;查表得平
31、方值送A,2000h,2009h,2008h,2007h,2006h,2005h,2004h,2003h,2002h,2001h,2、外部ROM的字节传送指令,2.3.1 数据传送指令,2.3.1.2 外部数据传送指令,2)采用PC作基址寄存器 ORG 1FFBH1FFBH 74 data ADD A,#data;data=02h1FFDH 83H MOVC A,A+PC;PC=1FFE1FFEH 80FEH SJMP$2000H 00H DB 0;平方表首址2001H 01H DB 12002H 04H DB 42003H 09H DB 92004H 10H DB 162005H 19H D
32、B 25:2009H 51H DB 81 ENDdata为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中
33、的任意位置上“浮动”,程序具有可修改性。,2.3.1 数据传送指令,2、外部ROM的字节传送指令,2.3.1.2 外部数据传送指令,实现外部RAM和累加器A之间的数据传送。只能使用寄存器间址的寻址方式。在MOVX指令模式下,单片机的P0、P2口做访问外部数据的地址和数据的总线。其中:P0口做低8位地址和数据的复用总线;P2口做高8位地址总线。,3、外部RAM的字节传送指令,2.3.1.2 外部数据传送指令,MOVX A,Ri 使用Ri寄存器间址寻址范围0255MOVX Ri,A 在硬件电路中P2口不用。MOVX A,DPTR;使用DPTR间址,寻址范围065535MOVX DPTR,A;在硬件
34、电路中,使用P0口输出低8位,P2口输出高8位外部RAM地址。,2.3.1 数据传送指令,【例】已知外部RAM的88H单元有一个数x,试编程将x送外部RAM的1818H单元。【解】:外部RAM中的数据是不能直接传送的,因此必须使用两次 MOVX 指令完成此操作。ORG 2000HMOV R0,#88H;为8位指针赋值MOV DPTR,#1818H;为16位指针赋值MOVX A,R0;取 x 到累加器AMOVX DPTR,A;x 送RAM的1818h单元SJMP$;停机END,2.3.1.2 外部数据传送指令,返回,2.3.1 数据传送指令,堆栈操作是一种特殊的保护数据的传送指令。堆栈:一个用来
35、保存程序断点、数据的存储区域。在51单片机中,栈区可以使用片内RAM的任意位置,具体位置由指针SP来确定(系统上电时,SP=07h)。1)进栈操作:PUSH direct;sp+1sp,(direct)(sp)2)出栈操作:POP direct;(sp)(direct),sp-1sp,2.3.1.3 堆栈操作指令,2.3.1 数据传送指令,“先加后压”、“先弹后减”,org 0800hdelay:push 00hpush 01hmov r0,#00hLoop1:mov r1,#00hLoop2:djnz r1,loop2djnz r0,loop1pop 01hpop 00hret,SP,思考:
36、为什么R0、R1的内容要进栈?,【例】产生延时的子程序delay。,2.3.1.3 堆栈操作指令,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 数据传送指令,一种方
37、便的累加器和寄存器/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.4 数据交换指令,2.3.1 数据传送指令,【例】已知,片外RAM20h单元、内部RAM20h单元分别有数x和y,试编程将两数相互交换。mov R1,#20h;指针赋初值movx a,R1;x axch a,R1;交换 a(20h),
38、ya movx R1,a;y(20h)片外RAM,(y)x,20h,20h,累加器A,1,2,3,跳过例2,2.3.1.4 数据交换指令,2.3.1 数据传送指令,【例】已知RAM50h单元有一个09范围内的数,试编程将它变成相应的ASCII码。【解】:09的ASCII码是30h39h,两者相差30h。方法一:对50h单元的数据高四位组装一个30h。mov r0,#50h;指针赋值mov a,#30h;30hAxchd a,r0;A30(r0)30,在A中组成ASCII码mov r0,a;A中的ASCII码送回50h单元,50h,00110101,A=30h,交换后A=35h,1,2,方法二:
39、把50H的内容直接与30H相加,形成相应的ASCII码(略),2.3.1 数据传送指令,2.3.1.4 数据交换指令,功能:完成算术运算、逻辑运算和循环移位三大 功能。特点:大多指令都要由累加器A来存放一个源操 作数,并把操作结果放回累加器A中。,算术运算指令 逻辑运算指令 移位指令,2.3,2.3.2 算逻运算和移位指令,2.3.2.1 算术运算指令,不带进位的加法指令(ADD)1、加法指令:带进位的加法指令(ADDC)加1指令(INC)(编程举例)2、减法指令:带进位的减法指令(SUBB)减1指令(DEC)3、十进制调整指令:(DA A)4、乘法和除法指令:(MUL DIV),2.3.2
40、算逻运算和移位指令,1、加法指令(之一):不带进位的加法指令,格式:ADD A,Rn;A+Rn AADD A,direct;A+(direct)AADD A,Ri;A+(Ri)AADD A,#data;A+data A【注意】参加运算的数据都应是8位的,结果也是8位并影响PSW。根据编程者的需要,8位数据可以是无符号数(0255),也可以是有符号数(-128+127)。不论编程者使用的数据是有符号数还是无符号数,CPU都将它们视为有符号数(补码)进行运算并影响PSW。,2.3.2.1 算术运算指令,2.3.2 算逻运算和移位指令,【例】分析执行下列指令后累加器A和PSW中各标志的变化。MOV
41、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.1 算术运算指令,2.3.2 算逻运算和移位指令,【例】分析执行下列指令后累加器A和PSW中各标志的变化。MOV A,#5AH Cy=0;ADD A,#6BH AC=
42、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.1 算术运算指令,2.3.2 算逻运算和移位指令,格式:ADDC A,Rn;A+Rn+Cy A ADDC A,direct;A+(direct)+Cy A ADDC A,Ri;A+(Ri)+Cy
43、 A ADDC A,#data;A+data+Cy A【注意】这里的Cy是指令执行前的Cy;对PSW的影响同ADD指令。,1、加法指令(之二):带进位的加法指令,2.3.2.1 算术运算指令,2.3.2 算逻运算和移位指令,格式:INC A;累加器A加1INC Rn;Rn+1RnINC direct;内存单元数据加1INC Ri;内存单元数据加1INC DPTR;dptr+1dptr【注意】除第一条对PSW的P有影响外,其余对PSW均无影响。由于上面的原因,INC指令不能作为一般的数据算术运算使用(为什么?),而常用于修改数据指针等控制、循环语句中使用。,1、加法指令(之三):加1指令(修改指
44、针专用),2.3.2.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.1 算术运算指令,2.3.2 算逻运算和移位指令,MOV R0,#M1;x1指针赋初值MOV R1,#M2;x2指针赋初值MOV A,R0;取x1低8位送AADD A,R1;x1与x2低8位相加MOV R0,a;低8位和送m1单元INC R0 INC R1;修改指针MO
45、V A,R0;取x1的高8位送AADDC A,R1;x1与x2的高8位和Cy相加MOV R0,A;结果送M1+1单元,M1,M1+1,M2,M2+1,2.3.2 算逻运算和移位指令,1、加法指令,2.3.2.1 算术运算指令,【例】要求在内存40H单元开始的16个单元建立一个数据区,分别存0、1、2,0FH;将该数据块的数据移动到外部存储器2000H开始的区域。,40H,41H,4FH,2000H,2001H,200FH,2.3.2 算逻运算和移位指令,1、加法指令,2.3.2.1 算术运算指令,MOV R0,#40H;内部RAM指针赋初值 MOV R2,#0FH;R2计数指针赋初值 MOV
46、A,#00H;第一个数据送ASTART:MOV R0,A;开始建立内部RAM数据区 INC R0;指向下一单元 INC A;下一个数据 DJNZ R2,START;是否是最后一个单元 MOV DPTR,#2000H;外部RAM指针赋初值 MOV R0,#40H MOV R2,#0FHLOOP:MOV A,R0;开始传送 MOVX DPTR,A INC R0,INC DPTRDJNZ R2,LOOPSJMP$,2.3.2 算逻运算和移位指令,在MCS-51单片机的指令系统中,只有:带进位的减法 SUBB 减1 DEC 两种减法指令。,2、减法指令(之一)带进位的减法指令,2.3.2.1 算术运算
47、指令,格式: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 CMOV A,#52H 01010010B=82SUBB A,#0B4H 101101
48、00B=-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.1 算术运算指令,2.3.2 算逻运算和移位指令,格式:DEC A;累加器A减1DEC Rn;Rn-1RnDEC direct;内存单元数据减1DEC Ri;内存单元数据减1【注意】除了第一条对PSW的P有影响外,其余对PSW均无影响。由于
49、上面的原因,DEC指令一般不作为数据算术运算使用(因为不能对PSW的OV等位产生影响,它主要用于修改数据指针在循环语句中使用)。,2、减法指令(之二)减1指令(修改指针专用),2.3.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.1 算术运算指令,2.3.2 算逻运算和移位指令,【例
50、】试写出完成85+59的BCD码的加法程序。MOV A,#85HADD A,#59HDA ASJMP$85 a=1 0 0 0 0 1 0 1B+59 dtat=0 1 0 1 1 0 0 1B 144 1 1 0 1 1 1 1 0B 低4位 9,所以加06h+0 0 0 0 0 1 1 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.1 算术运算指令,2.3.2 算逻运算和移位指令,BCD减法运算:由于D