单片机原理及精华总结

更新时间:2024-05-25 12:22:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

2.1微机原理概述

迄今为止,所有计算机的组成结构都是冯·诺伊曼型的,即:它是执行存储器中程序而工作的。计算机执行程序是自动按序进行的,毋需人工干预,程序和数据由输入设备输入存储器,执行程序所获得的运算结果由输出设备输出。因此,计算机通常有运算控制部件、存储器部件、输入设备和输出设备四部分组成,如图2-1所示。

图2-1 计算机组成框图

输入设备能自动把人们编好的解题程序和原始数据转换成计算机能识别的二进制数码,送到存储器存放起来。常用的输入设备有键盘、纸带输入机和卡片读入机,等等。此外,当计算机从磁盘上读入程序和数据时,磁盘驱动器也是作为输入设备而工作的。因此,输入设备是计算机输入解题程序和原始数据不可缺少的部件。

运算控制器有运算器和控制器两部分电子线路组成,是计算机赖以工作的核心部件。运算器主要包括加法器、移位、判断和寄存器电路等等,用于进行算术运算和逻辑操作;控制器由指令寄存器、指令译码器和控制电路等组成,是整个计算机的中枢,它根据指令码指挥着运算器、存储器、输入设备和输出设备自动协调地工作(如图中箭头所示)。因此,运算器和控制器唇齿相依,融为一体。过去,运算器和控制器采用电子管、晶体管和集成电路芯片组成,体积十分庞大。现在,运算器和控制器通常集成在单块或几块大规模集成电路芯片内,人们称为中央处理单元促CPU, 即微处理器。

通常,存储器分为内存储器和外存储器两种。内存储器工作速度快,但存储容量有限,过去采用磁心存储器,现在毫无例外地采用半导体存储器。外存储器称为海量存储器,它存储容量大,但存取速度慢,如磁盘、磁鼓、磁带和光盘等等。微型计算机中用的最广泛的是软磁盘和硬磁盘两种外存储器。

输出设备用于输出计算机的中间结果和最终结果,也可以输出原始程序和实时信息。常见的输出设备有CRT显示器、打印机、绘图机和电传打字机,等等。外存储器,当它存储数据时也可以看作输出设备。因此,外存储器是一种既可以作输

- 1 -

入又可以作输出设备。常常称之为输入/输出设备。

上述四部分统称为计算机硬件,各部分相互独立,但又相互相连,组成一个有机整体。其中,中央处理器CPU和内存储器又称为计算机的主机;输入/输出设备统称为外部设备或I/O设备。 2.1.1 微型计算机的基本机构

微型计算机是在中小型计算机基础上发展起来的,并以大规模集成电路技术为条件的一种新型计算机。因此,它在结构上和通用计算机十分相似,但也有独到之处。和其它计算机相比,微型计算机的最大特点是采用总线结构,其中三总线结构尤为普遍,目前已成为微型计算机的一种基本结构,如图2-2所示。

图2-2 微型计算机的基本结构

由图2-2可见,微处理器MPU是通过AB、DB和CD三总线同ROM存储器、RAM存储器及I/O接口相连的,虽然这个结构并不复杂,但并不好理解。为此,在分析微型计算机基本工作原理前,先对图中各部件作基本介绍是十分必要的。 (1)ROM和RAM存储器

这里的R()M和RAM是半导体存储器,是一种采用大规模或超大规模集成电路工艺制成的存储器芯片。这种芯片体积小、重量轻、集成度高,现已制成包含1.4亿只晶体管的8MBDRAM芯片,并已投放市场。

ROM存储器是一种在正常工作时只能读不能写的存储器,故它通常用来存放固定程序和常数,固定程序和常数是利用特殊手段存放进去的,一旦写入便能长期保存,需要时便可读出使用。ROM种类虽然很多,但常按存储容量分类。例如:4K(1K=1024)×8 ROM最多可以存放4096个8位二进制数。每片ROM上都有用于传送信号的引脚线。这些引线共分四组,地址线用于输送ROM的地址码:数据线是双向的,可以为芯片传送读/写数据;控制线用于传送控制信号,以控制芯片是否工作以及是读还是写等等;电源线可以供给芯片+5V直流电源。在这些引脚线中.地址线及数据线条数和芯片的存储容量有关。地址线越多,存储容量就越大;

- 2 -

数据线越多,每个二进制数的位数就越长。

RAM存储器是一种在正常工作时既能读又能写的存储器,故它通常用来存放原始数据、中间结果、最终结果和实时数据等。RAM中存入的信息不能长久保存,停电后便立即消失,故它又称为易失性存储器。RAM存储器的规格品种也很多,如4KB、8KB、32KB、64KB、256Kb、1MB,等等。

ROM和RAM的内部结构大致相同,所不同的是存储每位二进制数码的基本电路不一样。ROM的基本存储电路采用特殊的FAMOS管,由FAMOS管浮栅内有电荷和无电荷表示存“0”还是存“1”;RAM的基本存储电路是触发器,用触发器的两个暂稳状态来表示存“0”或存“1”。为使读者对存储器内部结构有一个基本了解,我们在图2-3中示出了一个容量为16×8 RAM芯片的内部结构。

图2-3 16×8 RAM的内部结构框图

由图中可见,A3~A0为地址线,共4条,传送地址码;D7~D0是数据线,共8条,传送一个二进制数的八位;RD和WR为控制线,传送读/写控制信号,存储阵列是芯片的主体,它有16个地址单元,分别对应于4条地址线的16种组合,每个地址单元有8个触发器,用于存储一个八位二进制数,故它可以存储16个八位二进制数。在16个地址单元中,哪一个工作是由地址译码器输出的16条地址选择线中哪一条为高电平决定的。地址译码器的译码信号由地址译码器输出的16条地址选择线中哪一条为高电平决定的。地址译码器的译码信号由地址线上地址译码经地址寄存器暂存后送来。因此,地址线条数和存储容量间关系通常为:

存储容量=2n

其中,n为地址线条数。数据线条数和每个地址单元中二进制数位数一一对应,并应和所有地址单元中的基本存储电路(即触发器)相通。

对于一个有16条地址线和8条数据线的ROM存储器,如果它的16条地址线皆为高电平(即:地址为FFFFH),则必定选中读出FFFFH号地址单元中的内容,且读出数据是送到数据线上的;如果16条地址线上的地址码为0000H(即全为低电平),则必定选中0000H单元工作。因此,一个有16条地址线的存储器,其存储器容量的地址范围为0000H~FFFFH,共64KB。

(2)微处理器MPU

- 3 -

现代微处理器MPU的内部结构极其复杂,要像电子线路那样画出它的全部原理图来加以分析介绍是根本不可能的,为了弄清它的基本工作原理,现以图2-4中的模型机框图为例加以概述。

(1)运算器

运算器用于对二进制数进行算术运算和逻辑操作;其操作顺序是在控制器控制下进行的。运算器由算术逻辑单元ALU、累加器A、通用寄存器R0、暂存器TMP和状态寄存器PSW等五部分组成。

图2-4 模型MPU结构框图

累加器A是一个具有输入/输出能力的移位寄存器,由8个触发器组成。累加器A在加法前用于存放一个操作数。加法操作适用于存放两数之和,以便再次累加,故因此得名。TMP为暂存器,也是一个8位寄存器,用于暂存另一操作数。ALU为算术逻辑单元,主要由加法器、移位电路和判断电路等组成,用于对累加器A和暂存器TMP中两个操作数进行四则运算和逻辑操作。PSW为程序状态宇,也由八位触发器组成,用于存放ALU操作过程中形成的状态。例如:累加器A中的运算结果是否为零,最高位是否有进位或借位,低四位向高四位是否有进位或借位,等等,都可以记录到PSW中去。R0为通用寄存器GR,用于存放操作数或运算结果。

(2)控制器

控制器是发布操作命令的机构,是计算机的指挥中心,相当于人脑的神经中枢、控制器由指令部件、时序部件和微操作控制部件等三部分组成。

①指令部件:是一种能对指令进行分析、处理和产生控制信号的逻辑部件,也是控制器的核心。通常,指令部件由程序计数器PC、指令寄存器IR和指令译码器IS等三部分组成。

指令是一种能供机器执行的控制代码,有操作码和地址码两部分,指令不同,

- 4 -

相应的代码长度也不一样。因此,指令可分为单字节、双字节和三字节指令,等等。指令的有序组合称为程序,程序必须先放在存储器内,机器执行程序应从第一条指令开始逐条执行。这就需要有一个专门寄存器用来存放当前要执行指令的内存地址,这个寄存器就是程序计数器PC。当机器根据PC中地址取出要执行指令的一个字节后,PC就自动加1,指向指令的下一字节,为机器下次取这个字节时作好准备。在8位微处理器MPU中,程序计数器通常为16位。

指令寄存器IR有八位长,用于存放从存储器中取出的当前要执行指令的指令码。该指令码在IR中得到寄存和缓冲后被送到指令译码器ID中译码,指令操作码译码后就知道该指令进行哪种操作,并在时序部件帮助下去推动微操作控制部件完成指令的执行。

②时序部件:由时钟系统和脉冲分配器组成,用于产生微操作控制部件所需的定时脉冲信号。其中,时钟系统产生机器的时钟脉冲序列,脉冲分配器又称“节拍发生器”,用于产生节拍电位和节拍脉冲。

③微操作控制部件:可以为ID输出信号配上节拍电位和节拍脉冲,也可和外部进来的控制信号组合,共同形成相应的微操作控制序列,以完成规定的操作。

(3)地址总线、数据总线和控制总线 所谓总线是指信息传送的公共通道,实际上是印刷电路板上的短路线,这些短路线是沟通微型计算机各种器件的桥梁。

①地址总线AB

地址总线AB也叫地址母线,因其上仅传送MPU的地址码而得名。当微处理器MPU和存储器或外部设备交换信息时,必须指明要和哪个存储单元或哪个外部设备交换。因此,地址总线AB必须和所有存储器的地址线对应相连,也必须和所有I/O接口的设备码线相连。这样,当微处理器MPU对存储器或外设读/写数据时,只要把存储单元的地址码或外部的设备码送到地址总线上便可选中它们工作,地址总线条数由所选MPU型号决定.在8位机中.它通常为16条。

②数据总线

数据总线也叫“数据母线”,因其上传送的是数据和指令码而得名。数据总线条数常和所用微处理器字长相等,但也有内部为16位运算而外部仍为8位数据总线的情况。由于MPU有时需要把数据写入存储器或从外设输出数据,有时又需要从存储器或输入设备输人数据,因此数据总线是双向的。在8位机中,数据总线通常有8条。

③控制总线CB

控制总线也叫控制母线,用于传送各类控制信号。控制总线条数因机器而异,每条控制线最多传送两个控制信号。控制信号有两类:一类是MPU发出的控制命令,如读命令、写命令、中断响应信号等;另一类是存储器或外设的状态信息,如外设的中断请求、复位、总线请求和中断请求,等等。

总之,微果汁算机采用总线结构是一大特点,它使得存储器扩充和I/O接口板

- 5 -

的增删十分方便。

(4)I/O接口和外设

I/O接口是架设在微处理器和外设间的桥梁,是一种过渡的大规模集成电路芯片。由于大多数外部设备部是机电型的,工作速度较慢,因此微处理器MPU通常不和它们直接相连,而是通过I/O接口缓冲后再和外设相连,以便实现速度、电平和信号性质的匹配。

2.1.2 微型计算机的基本工作原理

微型计算机是通过执行程序来工作的,机器执行不同程序就能完成不同的运算任务。因此,微型计算机执行程序的过程实际上也体现了微型计算机的基本工作原理。为此,我们先从指令和程序谈起。 (1).微处理器的指令系统和程序编制

前面已经谈到,指令是一种可以供机器执行的控制代码,故它又称为指令码。指令码由操作码和地址码构成;操作码用于指示机器执行何种操作,地址码用于指示参加操作的数在哪里,其格式为:

指令码的二进制形式既不便于记忆,又不便于书写,故人们通常采用助记符形式来表示。如表2-1所列。

表2-1 指令的三种形式

指令的集合或指令的全体称为“指令系统”。微处理器类型不同,它的指令系统也不一样。例如:Z82有698条,Intel8085有78条,MCS-51系列单片机有111条指令,等等。所谓程序就是采用指令系统中的指令根据题目要求排列起来的有序指令的集合。

程序的编制称为“程序设计”。通常,设计人员采用指令的汇编符(即助记符)形式编程的,这种程序设计称为汇编语言程序设计。显然,设计人员如果不熟悉机器的指令系统是无法编出优质高效程序的。 (2)微型计算机执行程序的过程

为了弄清微型计算机的工作原理,现以如下的Y=5+10求和程序来说明微型计算机的工作过程。

7405H MOV A, #05H ; A←05H 240AH ADD A, #0AH ; A←5+10 80FEH SJMP $ ; 停机

- 6 -

该程序由三条指令组成,每条指令均为双字节指令(即第一字节为操作码,第二字节为地址码)。第一条指令的含义是把05H传送到累加器A;第二条指令是加法指令,它把累加器中的5和立即数10相加,结果保留到累加器A中。第三条是停机指令,机器执行后处于动态停机状态。为了说明程序的执行过程,现在假设上述程序的指令码已装入从2000H开始的存储器区域,共占用6个存储单元,程序计数器PC中也预先放入初值地址2000H,以便机器可以根据PC中地址从第一条指令处执行程序,如图2-5所示。

1)第一条指令的执行过程 第一条指令为双字节指令,第一字节为操作码74H,它指示机器进行传送操作,操作数05H在指令的第二字节,即:2001H内。执行步骤为:

①微操作控制器使程序计数器PC中初值地址2000H送入地址寄存器AR后发出读命令,同时使程序计数器PC中内容自动加1而变成2001H,以便为取指令的第二字节预作准备。

②存储器根据地址寄存器中地址2000H,在读命令控制下完成读出操作码74H和送入数据寄存器DR中的任务。

③微操作控制序列继续使DR中操作码74H经指令寄存器IR缓冲后送人指令译码器ID。

④指令译码器1D结合时序部件产生74H操作码的微操作序列,该微操作序列把程序计数器PC中地址2001h送人AR后发出新的读命令,同时又使程序计数器PC自动加1,而变成2002H,为取第二条指令操作码24H作准备。

图2-5 指令执行操作示意图

- 7 -

⑤存储器在新的AR中地址2001H和74H微操作序列的共同作用下,把2001H单元中05H送入数据寄存器DR。

⑥74H微操作控制序列使数据寄存器DR中05H操作数送人累加器A中。 至此,第一条指令的执行宣告完成。 2)第二条指令的执行过程 第二条指令也是双字节指令,第一字节为操作码24H,指示机器进行加法操作,两个操作数中一个在累加器A中,另一个在指令的第二字节。执行步骤为:

①第一条指令执行完后,程序计数器PC中内容已变为2002H,微操作控制器也使程序计数器PC中2002H送入地址寄存器后向存储器发出读命令,同时又使PC中内容加l而变为2003H,使PC指向第二条指令的第二字节。

②存储器在地址寄存器AR中2002H和读命令作用下,读出操作码24H和送到数据寄存器DR中。

③微操作控制器发出的微操作控制序列使DR中的24H操作码送人指令寄存器IR,并通过它进入指令译码器ID。

④指令译码器ID也结合时序部件使微操作控制器产生24H的微操作控制序列,该微操作控制序列又使程序计数器PC中2003H送入AR和发出读命令,还使PC自动加1而变为2004H,使PC指向第三条指令的第一字节地址。

⑤24H微操作控制序列把存储器读出的操作数0AH从DR送入TMP,并会同累加器A中的另一操作数05H,完成两数求和操作以及把操作结果经过内部总线送人累加器A,以完成本条指令执行。

3)第三条指令的执行过程

第三条指令的执行过程和第一、二两条类似,所不同的是第三条指令执行后,MPU处于动态停机状态,在此不再赘述。

- 8 -

2.2 MCS-5l单片机结构与时序

MCS-5l是美国Intel公司的8位高档单片机系列,是在MCS-48系列基础上发展而来的.也是我国目前应用最广的一种单片机系列。在这个系列里,有多种机型,性能特点也各不相同。本节主要以8051为主线叙述MCS-51单片机的内部结构、引脚功能、工作方式和时序。

2.2.1 MCSS—51单片机内部结构

在MCS-5l系列里,所有产品都是以8051为核心电路发展起来的,他们都具有8051的基本结构和软件特征。从制造工艺来看,MCS-51系列中的器件基本上可分为HMOS(High-speed MOS,高速MOS)和CMOS两类(见表2-2)。CMOS器件的特点是电流小且功耗低(掉电方式下消耗10uA电流),但对电平要求高(高电平大干4.5V,低电平小于0.45V,HMOs对电平要求低(高电平大干2.0V,低电平小于0.8V),但功耗大。

表2-2 MCS-51系列芯片及制造工艺

8051单片机内部包含了作为微型计算机所必需的基本功能部件,各功能部件相互独立地集成在同一块芯片上。8051内部结构如图2-6所示。如果把图中ROM/EPROM这部分电路移走,则它和8031的内部结构相同。为了进一步介绍805l或8031内部结构和工作原理.现把图中各功能部件划分为CPU、存储器、I/O端口、定时器/计数器和中断系统等五部分加以介绍。 2.2.1.1 CPU结构

8051内部CPU是一个字长为二进制8位的中央处理单元,也就是说它对数据的处理是按字节为单位进行的。与微型计算机CPU类似,8051内部CPU也是由运算器(ALU)、控制器(定时控制部件等)和专用寄存器组三部分电路构成。 (1)算术逻辑部件(ALU)

8051的ALU是一个性能极强的运算器,它既可以进行加、减、乘.除四则运算,也可以进行与、或、非、异或等逻辑运算,还具有数据传送、移位、判断和程序转移等功能。8051 ALU为用户提供了丰富的指令系统和极快的指令执行速度,大部外指令的执行时间为1us,乘法指令可达4us。

8051 ALU由一个加法器.两个8位暂存器(TMP1和TMP2),和一个性能卓著的布尔处理器(图中未画出)组成。虽然TMPl和TMP2对用户并下开放,但可用来

- 9 -

为加法器和布尔处理器暂存两个8位二进制操作数。8051时钟频率可达12MHZ。 (2)定时控制部件

定时控制部件起着控制器的作用,由定时控制逻辑、指令寄存器和振荡器OSC等电路组成。指令寄存器IR用于存放从程序存储器中取出的指令码,定时控制逻辑用于对指令寄存器中的指令码进行译码,井在OSC的配合下产生执行指令的时序脉冲,以完成相应指令的执行。

图2-6 MCS-51内部结构框图

OSC(OSCillator)是控制器的心脏,能为控制器提供时钟脉冲,图2-6为HMOS型单片机内部的OSC电路.图中.引脚XTAL为反相放大管Q4的输入端,XTAL2为Q4的输出端。只要在引脚XTAL1和XTAL2上外接定时反馈回路,OSC就能自激振荡。

定时反馈回路常田石英晶振和电容组成,如图2-7所示。OSC振荡器产生矩形时钟脉冲序列,其频率是单片机的重要性能指标之一.时钟频率越高,单片机控制器的控制节拍就越快,运算速度也就越快;因此,不同型号的单片机所需要的时钟频率也是不相同的。 (3)专用寄存器组

专用寄存器组主要用来指示当前要执行指令的内存地址、存放操作数和指示指令执行后的状态等。它是任何一合计算机的CPU不可缺少的组成部件,其寄存器的多寡因机器型号的不同而异。专用寄存器组主要包括程序计数器PC.累加器A、程序状态字PSW、堆栈指示器SP、数据指针DPTR和通用寄存器B等。

- 10 -

图2-7 HMOS型单片机内部振荡器OSC 1) 程序计数器PC(Promgram Counter)

程序计数器PC是一个二进制16位的程序地址寄存器,专门用来存放下一条需要执行指令的内存地址,能自动加1。CPU执行指令时,它是先根据程序计数器PC中的地址从存储器中取出当前需要执行的指令码,并把它送给控制器分析执行.随后程序计数器PC中地址码自动加1,以便为CPU取下一个需要执行的指令码作准备。当下一个指令码取出执行后,PC又自动加1。这样,程序计数器PC一次次加1,指令就被一条条地执行。所以,需要执行程序的机器码必须在程序执行前预先一条条地按序放到程序存储器中,并为程序计数器PC设置成程序第一条指令的内存地址。8051程序计数器PC由16个触发器构成,故它的编码范围为0000H~FFFFH,共64K。这就是说,805l对程序存储器的寻址范围为64KB。如果想为8051配置大于64KB的程序存储器.就必须在制造8051器件时加长程序计数器的位数。但在实际应用中,64KB的程序存储器通常已足够了。

2) 累加器A(Accumulator)

累加器A又记作ACC,是一个具有特殊用途的二进制8位寄存器,专门用来存放操作数或运算结果。在CPU执行某种运算前,两个操作数中的一个通常应放在累加器A中,运算完成后累加器A中便可得到运算结果。例如,在如下的3+5加法程序中

MOV A, #03H ;A←3

ADD A, #05H ;A←A+05H

第一条指令是把加数3预先送入累加器A,为第二条加法指令的执行作了准备。因此,第二条指令执行前累加器A中为加数3,在执行后变为两数之和8。

3) 通用寄存器B(General Purpose Register)

通用寄存器B是专门为乘法和除法设置的寄存器,也是一个二进制8位寄存器,由8个触发器组成.该寄存器在乘法或除法前,用来存放乘数或除数,在乘法或除法完成后用于存放乘积的高8位或除法的余数。现以乘法运算为例加以说明:

MOV A, #05H ;A←5 MOV B, #03H ;B←3

MUL AB ;BA←A×B=5×3

- 11 -

上述程序中,前面两条是传送指令,是进行乘法前的准备指令。因此,乘法指令执行前累加器A和通用寄存器B中分别存放了两个乘数,乘法指令执行完后,积的高8位自动在B中形成, 积的低8位自动在A中形成。

4) 程序状态字PSW(Program Status Word)

PSW是一个8位标志寄存器,用来存放指令执行后的有关状态。PSW中各位状态通常是在指令执行过程中自动形成的,但也可以由用户根据需要采用传送指令加以改变。它的各标志位定义如下:

其中,PSW7为最高位,PSW0为最低位。

①进位行志位Cy(Carry):用于表示加减运算过程中最高位A7(累加器最高位)有无进位或借位。在加法运算时,若累加器A中最高位A7有进位,则Cy=1;否则Cy=0。在减法运算时,若A7有了借位,则Cy=1;否则Cy=0。此外,CPU在进行移位操作时也会影响这个标志位。

②辅助进位位AC(Auxiliary Carry):用于表示加减运算时低4位(即A3)有无向高4位(即A4)进位或借位。若AC=0, 则表示加减过程中A3没有向A4进位或借位;若AC=1,则表示加减过程中A3向A4有了进位或借位。

③用户标志位F0(Flag zero):F0标志位的状态通常不是机器在执行指令过程中自动形成的,而是由用户根据程序执行的需要通过传送指令确定的。该标志位状态一经设定,便由用户程序直接检测,以决定用户程序的流向。

④寄存器选择位RS1和RS0:8051共有8个8位工作寄存器,分别命名为R0~R7。工作寄存器R0~R7,常常被用户用来进行程序设计,但它在RAM中的实际物理地址是可以根据需要选定的。RS1和RS0就是为了这个目的提供给用户使用,用户通过改变RS1和RS0的状态可以方便地决定R0~R7的实际物理地址。工作寄存器R0~R7的物理地址和RS1、RS0之间的关系如表2-3所列。

表2-3 RS1、RS0对工作寄存器的选择

采用8051或803l做成的单片机控制系统.开机后的RS1和RS0总是为零状态,故R0-R7的物理地址为00H-07H,即R0的地址为00H,R1的地址为01H?,R7的地址为07H。但若机器执行如下指令

MOV PSW,#08H ;PSW←08H

- 12 -

则RS1、RS0显然为01B,故R0-R7的物理地址变为08H-0FH。因此,用户利用这种方法可以很方便地达到保护R0-R7中数据的目的,这对用户的程序设计是非常有利的。

⑤溢出标志位OV(Overflow):可以指示运算过程中是否发生了溢出,由机器执行指令过程中自动形成。若机器在执行运算指令过程中,累加器A中运算结果超出了8位数能表示的范围,即-128~+127,则OV标志自动置1,否则OV=0。因此,人们根据执行运算指令后的OV状态就可判断累加器A中的结果是否正确。

⑥奇偶标志位P(Parity):PSW1为无定义位,用户也可不使用。PSW0为奇偶标志位P,用于指示运算结果中1的个数的奇偶性。若P=1,则累加器A中1的个数为奇数;若P=0,则累加器A中1的个数为偶数。

[例2.1] 设程序执行前F0=0,RS1RS0=00B,请问机器执行如下程序后 MOV A,#0FH ;A←0FH ADD A,#F8H ;

PSW中各位的状态是什么?

解:上述加法指令执行时的人工算式是:

式中:CP为最高位进位,为l;CS为次高位进位,也为1; F0、RS1和RS0由用户设定,加法指令也不会改变其状态;Cy为1,AC为l(因为加法过程中低4位向高4位有进位);P也为1(因为运算结果中1的个数为3,是奇数);OV状态由如下关系确定

OV=CP①CS=1①l=0 所以PSW=ClH

5) 堆栈指针SP(Stack Pointor)

堆栈指针SP是一个8位寄存器,能自动加1或减1,专门用来存放堆栈的栈顶地址。

人们在堆放货物时,总是把先入栈的货物堆放在下面,后入栈的货物堆放在上面,一层一层向上堆。取货时的顺序和堆货顺序正好相反,最后入栈的货物最先被取走,最先入栈的货物最后被取走。因此,货栈的堆货和取货符合“先进后出”或“后进先出”的规律。

计算机中的堆栈类似于商业中的货栈,是一种能按:“先进后出”或“后进先出”规律存取效据的RAM区域。这个区域是可大可小的.常称为堆栈区。8051片内RAM共有128B,地址范围力00H~7FH,放这个区域中的任何子域都可以用

- 13 -

作堆栈区,即作为堆栈来用。堆栈有栈顶和栈底之分,栈底由栈底地址标识,栈顶由栈顶地址指示。栈底地址是固定不变的,它决定了堆栈在RAM中的物理位置。栈顶地址始终在SP中,即由SP指示,是可以改变的,它决定堆栈中是否存放有数据。因此,当堆栈中为空无数据时,栈顶地址必定与栈底地址重合,即SP中一定是栈底地址;当堆栈中存放的数据越多,SP中的栈顶地址比栈底地址就越大。这就是说,SP就好像是一个地址指针,始终指示着堆栈中最上面的那个数据。通常堆栈由如下指令设定:

MOV SP, #DATA ;SP←data

若把指令中的data用70H替代,则机器执行这条指令后就设定了堆栈的栈底地址70H。此时,堆栈中尚未压入数据,即堆栈是空的.故SP中的70H地址就是堆栈的栈顶地址,如图2-8(a)所示。堆栈中数据是由PUSH指令压入和POP指令弹出的,PUSH指令能使SP中内容加1,POP指令则使SP减1。例如:如下程序可以把X压入堆栈

MOV A, #X ;A←X

PUSH ACC ;SP←SP+1,SP←ACC

第一条指令可以把X送入累加器A。第二条指令先使SP加1变为71H.然后把累加器A中的X取出来按SP(即71H)压入堆栈,如图2-8(b)所示.如果要继续向堆栈中压入数据,则可继续使用PUSH指令。如果要从堆栈中弹出数据,则可使用POP指令。

由于堆栈区在程序中没有标识,因此程序设计人员在进行程序设计时应主动给可能的堆栈区空出若干存储单元,这些单元是禁止用传达指令存放数据的,只能由PUSH和POP指令访问它们。

图2-8 堆栈示意图

6) 数据指针DPTR(Data Pointer)

数据指针DPTR是一个16位的寄存器,由两个8位寄存器DPH和DPL拼成,其中,DPH为DPTR的高8位,DPL为DPTR的低8位。DPTR可以用来存放片内ROM的地址,也可以用来存放片外RAM和片外ROM的地址。例如,设片外RAM的的2000H单元中有一个数x.若要把它取人累加器A,则可采用如下程序

- 14 -

MOV DPTR, #2000H ;DPTR←2000H MOVX A, @DPTR ;A←X

第一条指令执行后,机器自动把2000H装入DPTR,第二条指令执行时,机器自动把DPTR中的2000H作为外部RAM的地址,并根据这个地址把x取到累加器A中。其中,第二条指令操作码助记符中的X指示DPTR中的2000H是外部RAM的地址。

2.2.1.2存储器结构

MCS-51的存储器不仅有ROM和RAM之分,而且有片内和片外之分。MCS-5l的片内存储器集成在芯片内部,是MCS-51的一个组成部分;片外存储器是外接的专用存储器芯片,MCS-51只提供地址和控制命令,需要通过印刷电路板上三总线才能联机工作。

图2-9 MCS-51 存储器地址分配 (1) 存储器地址分配

不论是单片机的片内还是片外存储器,MCS-51对某存储单元的读/写地址都是由MCS-51提供的,存储器的地址分配有三个地址空间,这三个地址空间是:ROM存储器地址空间(包括片内ROM和片外ROM),地址范围是0000H~FFFFH;片内RAM地址空间,地址范围是00H~FFH;片外RAM地址空间,地址范围是0000H~FFFFH,如图2-9所示。 (2) 片内ROM

8031内部没有ROM,只有8051才有4KB ROM,地址范围为0000H~0FFFH。无论8031还是8051,都可以外接外部ROM,但片内和片外之和不能超过64KB。8051和87C5l有64KB ROM的寻址区,其中0000H~0FFFH的4KB地址区可以为片内ROM和片外ROM公用,1000H~FFFFH的60KB地址区为片外ROM所专用。在0000H~0FFFH的4KB地址区,片内ROM可以占用,片外ROM也可以占用,但不能为两者同时占用。为了指示机器的这种占用,器件设计者为用户提供了一条专用的控制引脚EA。若EA接+5v高电平,则机器使用片内4KB ROM;若

- 15 -

EA接低电平,则机器自动使用片外ROM,这一关系如图2-9(a)所示.由于803l片内无ROM,故它的EA应接地。 (3) 片外RAM

MCS-51的片内RAM容量有128个存储单元,可以用来存放操作数。操作结果和实时数据。如果片内RAM容量太小,不能满足控制需要,也可以外接外部RAM。但外接外部RAM的最大容量不能超过64KB,地址范围为0000H~FFFFH。

MCS-51可以对片外RAM中数据进行读/写。读/写指令共有如下四条。前两条用于把片外RAM中数据读入累加器A,后两条用于把累加器A中数据写入片外RAM中。

MOVX A, @R1 ;A←(Ri) MOVX A, @DPTR ;A←(DPTR) MOVX @Ri, A ;A→(Ri) MOVX @DPTR, A ;A→(DPTR) (4) 片内RAM

由表2-2可见,8052AH/8752BH的片内RAM共有256个存储单元.地址范围为00H—FFH其中,00H~7FH为片内RAM的低]28字节区.80H—FFH为片内RAM的高128字节区。由于片内RAM的高128字节区和特殊功能寄存器SFR的物理地址区产生冲突,故8052AH/8752BH的设计师们采用不同的寻址方式对它们分别存取。即8052AH/8752BH采用间接寻址方式存取片内RAM的高128字节区,采用直接寻址方式存取SFR(Special Function Register,特殊功能寄存器)区。例如,若要把片内RAM的83H中内容存人累加器A,则应采用如下两条指令,因为MOV A,@R0为间接寻址指令。

MOV R0, #83H ;R0←83H A4(JV A, @R0 ;A←(83H) 若要把DPH中内容送入累加器A,则可采用如下一条直接寻址指令,因为DPH寄存器的物理地址是83H(见表2-4),这两个83H显然不是同一个存储单元。

MOV A, 83H ;A←DPH

00H~7FH是片内RAM的低128字节区。由于这个地址范围和SFR的物理地址不产生冲突,因此MC5-51既可以采用直接寻址方式对它寻址,也可以采用间接寻址方式寻址。对于8051/8031,除无片内RAM的高128字节区外,其余与8052AH/8752BH没有任何区别。

在00H-07FH这个地址空间中,根据不同功能又可分为工作寄存器区.位寻址区和便笺区等三个子区域,如图2-10所示。

- 16 -

图2-10 8051内部RAM分配

1)工作寄存器区(00H~1FH) 这32个RAM单元共分四组,每组占8个RAM单元,分别用代号R0~R7表示。R0~R7可以指向四组中的任一组,由PSW中RS1RS0状态决定,如表2-3所列。

2)位寻址区(20H~2FH) 这16个RAM单元具有双重功能。它们既可以像普通RAM单元一样按字节存取,也可以对每个RAM单元中的任何一位单独存取,这就是位寻址。

20H~2FH用作位寻址时,共有16×8=128位,每位都分配了一个特定地址,即00H~7FH。这些地址称为位地址,如图2-10所示。位地址在位寻址指令中使用。例如,欲把2FH单元中最高位(位地址为7FH)置位成1,则可使用如下位置位指令

SETB 7FH ;7FH←1

其中:SETB为位置位指令的操作码。

位地址的另一种表示方法是采用字节地址和位数相结合的表示法00H可以表示成20H,0,位地址1AH可以表示成23H.2,等等。

- 17 -

3)便笺区(30H~7FH) 便笺区共有80个RAM单元,用于存放用户数据或作堆栈区使用。MCS-51对便笺区中每个RAM单元是按字节存取的。

(5) 特殊功能寄存器SFR(80H-FFH)

特殊功能寄存器是指有特殊用途的寄存器集合。SFR的实际个数和单片机型号有关:8051或8031的SFR有21个,8052的SFR有26个。每个SFR占有一个RAM单元,它们离散地分布在80H-FFH地址范围内,不为SFR占用的RAM单元实际上并不存在,访问它们也是没有意义的,如表2-4所列。

表2-4 特殊功能寄存器一览表

对于8051,已对累加器A、B寄存器、PSW、SP和DPTR等作过介绍。在21个SFR中,用户可以通过直接寻址指令对它们进行字节存取,也可以对带有*的11

- 18 -

个字节寄存器中的每一位进行位寻址。在字节型寻址指令中,直接地址的表示方法有两种:一种是使用物理地址,如累加器A要用E0H、B寄存器用F0H.SP用81H,等等;另一种是采用表2-3中的寄存器标号,如累加器A要用ACC,B寄存器用B、程序状态字寄存器用PSW,等等。这两种表示方法中,采用后一种方法比较普遍,因为它们比较容易为人们所记忆。

在SFR中.可以位寻址的寄存器有11个,共有位地址88个,其中5个未用.其余83个位地址离散地分布于80H~FFH范围内,如图2-11所示。

图2-11 SFR中的位地址分布

2.2.1.3 MCS-5l内部并行I/O端口

8031有4个并行I/O端口,分别命名为P0,P1,P2和P3。这4个并行I/O端口的内部结构如图2-12所示。每个端口皆有8位,但图中只画出了其中的一位。由图可见,每个I/O端口都由一个8位数据锁存器和—个8位数据缓冲器组成。其中,8位数据锁存器和端口号P0,P1,P2和P3同名,属于21个特殊功能寄存器中的4个,用于存放需要输出的数据,8个数据缓冲器用于对端口引脚上输入数据进行缓冲,但不能锁存,因此各引脚上输入的数据必须一直保持到CPU把它读走为止。

- 19 -

- 20 -

忆和难修改等缺点。因此人们通常不用它来编写程序。指令的十六进制形式虽然读写方便,但仍不易为人们识别和修改,通常也不被用来编写程序,只是在某些场合(如实验室,才被用来作为输人程序的一种辅助手段。指令以这种十六进制代码输入机器以后,需要由常驻于机器内部的监控程序把它们翻译为二进制形式存人内存储器,而后才能为机器所识别和执行。指令的助记符形式又称为指令的汇编符形式或汇编语句形式,是一种由英文单词或缩写字母形象表征指令功能的形式。这种形式不仅易为人们识别和读写,而且记忆和交流极为方便,常常被人们用来进行程序设计。但编好和修改好的程序必须通过人工或机器把它们翻译成机器码形式才能被计算机执行。例如,如果累加器A中已有一个加数10,那么,能够完成10+8并把结果送人累加器A的加法指令的二进制形式为0010010000001000B;指令的十六进制形式为2408H;指令的助记符形式为: ADD A, #08H ;A←A+08H

其中,ADD为操作码,指示进行加法操作,逗号右侧为源操作数或第一操作数,逗号左侧的累加器A在指令执行前为第二操作数寄存器,在指令执行后为结果操作数寄存器;分号的后面部分为注释,它并非指令的组成部分。只是用来标明相应指令的功能。

2.3.1.3 指令的字节数

在指令的二进制形式中,指令不同,指令的操作码和操作数也不相同。有些指令的操作码和操作数加起来只有1个字节,这种指令称之为单字节指令;有些指令是双字节指令,操作码和操作数各占1个字节。同样道理,可以有3字节指令、4字节指令等等。

按照指令码的字节来分,MCS-51单片机通常可以分为单字节、双字节和3字节指令三种。

(1) 单字节指令(49条)

单字节指令码只有一个字节,由8位二进制数组成。这类指令共有49条,占总指令数的44%。通常,单字节指令又可打为两类:一类是无操作数的单字节指令;另一类是含有操作数寄存器编号的单字节指令。

1) 无操作数单字节指令 这类指令的指令码只有操作码字段,没有专门指示操作数的字段,操作数是隐含在操作码中的。例如,INC DPTR指令的二进制形式为

其中:8位二进制数码皆为操作码,DPTR数据指针由操作码隐含。

2) 含有操作数寄存器号的单字节指令 这类指令的指令码由操作码字段和专门用来指示操作数所在寄存器号的字段组成。 例如,8位数传送指令

MOV A, Rn ;A←Rn

- 26 -

其中:n的取值范围为0~7,相应指令码格式如图2-14所示。

图2-14 MOV A, Rn指令的格式

图2-14中,r r r 3位为源操作数所在的寄存器号。取值范围为000B~111B;其余5位为操作码,目的操作数寄存器是累加器A,由操作码字段隐含。 (2) 双字节指令(46条)

双字节指令含有两个字节,可以分别存放在两个存储单元中,操作码字节在前,操作数字节在后。操作数字节可以是立即数(即指令码中的数),也可以是操作数所在的片内RAM地址。 例如:8位数传送指令

MOV A, #data ;A←data

这条指令的含义是把指令的第2字节data取出来存放到累加器A中,该指令的指令码为:

其中:74H为操作码,占1个字节;data为源操作数,也占1个字节;累加器A是目的操作数寄存器,由操作码隐含。 (3) 三字节指令(16条)

这类指令的指令码的第1字节为操作码,第2和第3字节为操作数或操作数地址。由于有两个字节的操作数或操作数地址,故三字节指令共有如下四类:

- 27 -

通常,指令字节数越少,指令执行速度越快,所占存储单元也就越少。因此,在程序设计中,应在可能的情况下注意选用指令字节数少的指令。 2.3.1.4指令的分类

指令通常是按功能分类的。MCS51单片机按功能可以分为5类:数据传送指令、算术运算指令、逻辑操作和环移指令、控制转移指令和位操作指令等。 (1) 数据传送指令(28条)

这类指令共有28条,主要用于在单片机片内RAM和特殊功能寄存器SFR之间传送数据,也可以用于在单片机片内和片外存储单元之间传送数据。数据传送指令是把源地址中操作数传送到目的地址(或目的寄存器)的指令,在该指令执行后源地址中的操作数不被破坏,源操作数有8位和16位之分,前者称为8位数传送指令,后者称为16位数传送指令。

交换指令也属于数据传送指令,是把两个地址单元中的内容相互交换。因此,这类指令中的操作数或操作数地址是互为“源操作数/源操作数地址”和“目的操作数/目的操作数地址”的。 (2) 算术运算指令(24条)

算术运算指令共有24条,用于对两个操作数进行加、减、乘、除等算术运算。在两个操作数中,一个应放在累加器A中,另一个可以放在某个寄存器或片内RAM单元中,也可以放在指令码的第2和第3个字节中。指令执行后,运算结果便可保留在累加器A中,运算中产生的进位标志、奇偶标志和溢出标志等皆可保留在PSW中,参加运算的两数可以是8位的,也可以是16位的。 (3) 逻辑操作和环移指令(25条)

这类指令包括逻辑操作和环移两类指令。逻辑操作指令用于对两个操作数进行逻辑乘、逻辑加、逻辑取反和异或等操作,大多数指令也需要把两个操作数中的一个预先放人累加器A,操作结果也在累加器A中。环移指令可以对累加器A中的

- 28 -

数进行环移,环移指令有左环移和右环移之分,也有带进位位Cy和不带进位位Cy之分。

(4) 控制转移指令(17条)

控制转移指令分为条件转移、无条件转移、调用和返回等指令,共17条。这类指令的共同特点是可以改变程序执行的流向,或者是使CPU转移到另一处执行,或者是继续顺序地执行。无论是哪一类指令,执行后都以改变程序计数器PC中的值为目标。

(5) 位操作指令(17条)

位操作指令又称布尔变量操作指令,共分为位传送、位置位、位运算和位控制转移指令等四类。其中,位传送、位置位和位运算指令的操作数不是以字节为单位进行操作,而是以字节中某位中的内容为单位进行的;位控制转移指令不是以检测某个字节为条件而转移,而是以检测字节中的某一位的状态来转移的。

2.3.1.5 指令系统综述

指令的集合或全体称为指令系统。指令系统是微型计算机核心部件CPU的重要性能指标,是进行CPU内部电路设计的基础,也是计算机应用工作者共同关心的问题。因此,计算机类型不同,指令系统中每条指令的格式和功能也不相同。 MCS-51单片机指令系共有111条指令,可以实现51种基本操作。这111条指令的分类方法颇多,除可以按照指令功能和字节数分类外,还可以按照指令的机器周期数来分类。如果按照指令的机器周期数来分,MCS-51系列单片机常可以分为单机器周期指令57条,双机器周期指令52条和四机器周期指令2条等。 (1) 指令系统中所用符号的说明

MCS-51指令系统中的所有指令如附录所列,附表中,除了操作码字段采用了42种操作码助记符外,还在源操作数和目的操作数字段中使用了一些符号。这些符号的含义归纳如下:

1) Rn:工作寄存器,可以是R0-R7中的一个;

2) #data:8位立即数,实际使用时data应是00H-FFH中的一个。

3) direct:8位直接地址,实际使用时direct应该是00H-FFH中的一个,也可以是特殊功能寄存器SFR中的一个。

4) @Ri:表示寄存器间接寻址,Ri只能是R0或R1。 5) #data16:16位立即数。

6) @DPTR:表示以DPTR为数据指针的间接寻址,用于对外部64K RAM/ROM寻址。 7) bit: 位地址

8) addr11:11位目标地址。 9) addrl6:16位目标地址。

10) rel: 8位带符号地址偏移量。

- 29 -

11) $:当前指令的地址 (2) 指令对标志位的影响

MCS-51指令分两类:一类指令执行后要影响到PSW中某些标志位的状态,即不论指令执行前标志位状态如何,指令执行时总按标志位的定义形成新的标志状态;另一类指令执行后不会影响到标志位的状态,标志位原来是什么状态,指令执行后也是这个状态。

不同的指令对标志位影响是不相同的,每条指令对标志位的影响如附录所示,其中,√表示对相应标志位有影响,×表示对相应标志位无影响。 2.3.2 寻址方式

在计算机中,寻找操作数的方法定义为指令的寻址方式。在执行指令时,CPU首先要根据地址寻找参加运算的操作数,然后才能对操作数进行操作,操作结果还要根据地址存入相应存储单元或寄存器中。因此,计算机执行程序实际上是不断寻找操作数并进行操作的过程。通常,指令的寻址方式可以有多种,寻址方式越多,指令功能就越强。

在MCS-51单片机中.操作数的存放范围是很大的.可以放在片外ROM/RAM中,也可以放在片内ROM/RAM以及特殊功能寄存器SFR中。为了适应这一操作数范围内的寻址,MCS-51的指令系统共使用了7种寻址方式,它们是:寄存器寻址、直接寻址、立即寻址、寄存器寻址、变址寻址、相对寻址和位寻址等。 (1) 寄存器寻址

这类指令所需操作数在MCS-51内部累加器A、通用寄存器B和某个工作寄存器R0-R7等中,指令码内含有该操作数的寄存器号。例如,加1指令INC Rn,含义是把Rn工作寄存器中的内容加1,其指令格式为:

其中:r r r三位二进制代码可以代表工作寄存器R0-R7中的任何一个。其编号如图3-1所示。苦r r r=000B,则上述指令变为 INC R0,指令码为08H,CPU执行后可使R0中的内容加1。由表2-2可知,R0的物理地址由PSW中RS1和RS0的状态决定。因此,若设RS1=01B,则R0的物理地址必为08H,MCS-51单片机执行INC R0指令后,08H单元中的内容可由原来的24H变为25H,如图2-15所示。

- 30 -

图2-19 相对寻址示意图

(7) 位寻址

在计算机中,操作数不仅可以按字节为单位进行存取和操作,而且也可以按8位二进制数中的某一位为单位进行存取和操作。当把8位二进制数中的某一位作为操作数看待时,这个操作数的地址就称为位地址,对位地址寻址简称位寻址。 位寻址指令的指令码中含有位地址。计算机根据指令码中的位地址就可以找到位操作数,完成相应位操作。在位寻址指令中,位地址用bit表示,以区别字节地址direct。们在指令码中bit用实际的物理地址代替后计算机区别它们的根据是位寻址指令的操作码,它和字节寻址指令是不相同的。

在MCS-51单片机中,位寻址区专门安排在片内RAM中的两个区域:一是片内RAM的位寻址区,字节地址范围是20H-2FH,共16个RAM单元,其中每一位都可单独作为操作数(见图2-10); 二是某些特殊功能寄存器SFR,其特征是它们的物理地址应能被8整除,共16个,它们分布在80H-FFH的字节地址区(见图2-11)。

为了使程序设计方便可读,MCS-51特地为用户提供了多种位地址的表示方法,归纳起来共有4种:

1)直接使用物理的位地址。例如 MOV C, 7FH ;Cy←(7FH)

其中:7FH为位地址的物理形式,它表示2FH单元中最高位D7(见图2-10)。 2)采用第几字节单元第几位的表示法。例如,上述7FH的位地址可以表示为2FH.7,相应指令为

MOV C, 2FH.7 ;Cy←(7FH)

3)可以位寻址的特殊功能寄存器容许直接采用寄存器名加位数的命名法。例

- 36 -

如,累加器A中最高位可以表示为ACC.7,可以把ACC.7位状态送到进位标志位Cy的指令是

MOV C, ACC.7 ;Cy←ACC.7 4)经伪指令定义过的字符名称。

2.3.3 MCS-51汇编语言 2.3.3.1汇编语言的构成

汇编语言是一种面向机器的程序设计语言,常因机器的不同而有差别。现已MCS-5l单片机为例来介绍汇编语言的构成。 (1) 程序设计语言

计算机程序设计语言是指计算机能够理解和执行的语言,它随着计算机的诞生而诞生,随着计算机的发展而发展。迄今为止,计算机程序设计语言很多,但通常分为机器语言、汇编语言和高级语言等三类,现对它们的性能特点分析如下: 1) 机器语言(machine language)是一种能为计算机直接识别和执行的机器级

语言。通常,机器语言有两种表示形式,一种是二进制形式,一种是十六进制形式.如表2-6所列。机器语言的二进制形式由二进制代码“0”和“1”构成,可以直接存放在计算机存储器内;十六进制形式由0—F等16个数字符号组成,是人们通常采用的一种形式,它输入计算机后由监控程序翻译成二进制形式,以供机器直接执行。机器语言不易为人们识别和读写,用机器语言编写程序具有难编写、难读懂、难查错和难交流等缺点。因此,人们通常不用它进行程序设计。

表2-6 机器语言和汇编语言的形式

2)汇编语言(assembly language)是人们用来替代机器语言进行程序设计的一种语言,由助记符、保留字和伪指令等组成,很容易为人们所识别、记忆和读写,故有时也称为符号语言。采用汇编语言编写的程序称为汇编语言源程序,该程序虽然不能为计算机直接执行,但它可由“汇编程序”翻译成机器语言程序(即日标代码)。汇编(assembler)程序由计算机软件公司编写,可以驻留在微型计算机开发系统的程序存储器内,也可以存放在软盘或硬盘上,使用时调入系统机内存。

汇编语言并不独立于具体机器,是一种非常通用的低级程序设计语言,表2-6中列出了一段MCS-51汇编语言源程序。采用汇编语言编程,用户可以直接操作到

- 37 -

单片机内部的工作寄存器和片内RAM单元,能把数据的处理过程表述得非常具体和翔实。因此,汇编语言程序设计可以在空间和时间上充分发掘微型计算机的潜力,是一种经久不衰的广泛用于编写实时控制程序的计算机语言。

3)高级语言(high-level language)是面向过程和问题并能独立于机器的通用程序设计语言.是一种接近人们自然语言和常用数学表达式的计算机语言。因此,人们在利用高级语言编程时可以不去了解机器内部结构而把主要精力集中于掌握语言的语法规则和程序的结构设计方面。采用高级语言编写的程序是不能被机器直接执行的,但可以被常驻内存或磁盘上的解释程序和编译程序等编译,编译成目标代码才能被CPU执行。随着计算技术的飞速发展,高级语言不仅在类型和版本上有所增强,而且在功能上也越来越接近于人类的自然语言。常用的高级语言有BASIC、FORTRAN、COBOL、PASCAL和VB等,它们都在按自身的规律发展。 (2) 汇编语言格式

根据题目要求,人们采用汇编语言编写的程序称为汇编语言源程序。这种程序是不能被CPU直接识别和执行的,必须由人工或机器把它翻译成机器语言才能被计算机执行。为了使机器能够识别和正确汇编,人们必须对汇编语言的格式和语法规则作出种种规定。因此,用户在进行程序设汁时必须严格遵循汇编语言的格式和语法规则,才能编出符合要求的汇编语言源程序。 汇编语言源程序由—条一条的汇编语言语句构成。这就好像写文章,文章由语句构成,每个语句要正确,不能有病句和漏句,标点符号也要正确。因此,汇编语言源程序中的汇编语言语句也要正确.必须符合相应的语法规则。

汇编语言直接面向机器,因机器而异;对MCS-51来说,汇编语言中的每条语句应当符合典型的四分段格式: 标号段 操作码段 操作数段 注释段 格式中的标号段和操作码段之间要有冒号“:”相隔;操作码和操作数段间的分界符是空格;双操作数之间用逗号“,”相隔;操作数段和注释段之间的分界符采用分号“,”相隔。操作码段是必选项,其余各段为任选项。这就是说,任何语句都必须有操作码字段。

现结合如下程序进行分析: OPG 0060H

START: MOV A, #00H ;A←0 MOV R2, #0AH ;R2←10 MOV R1, #03H ;R1←3 LOOP: ADD A, R1 ;A←A+R1

DJNZ R2, LOOP ;若R2-1≠0,则LOOP NOP SJMP ﹩ END

- 38 -

这个程序共由9条语句组成,第1、9两条是伪指令,其余为指令性语句。第2、5两条是四分段齐全的语句,第3、4、6、7等四条是缺省标号段的语句,第7、9两条只有操作码字段。在第6条语句中,LOOP是一个符号,不是标号地址,实际上是一个相对地址偏移量,可以理解为$-LOOP,$是DJNZ R2,LOOP这条指令操作码所在内存单元的地址。为了进一步弄清汇编语句中各字段的语法规则,现结合本程序对各字段加以说明。

1)标号字段 标号字段位于一条语句的开头,用于存放语句的标号,以指明标号所在指令操作码在内存的地址。标号又称为标号地址或符号地址,是一个可有可无的任选项。例如,上述程序中的START和LOOP皆为标号,分别指明了第2、5两条指令操作码的内存地址。标号由大写英文字母开头的字母和数字串组成,长度为1—8个字符。在标号长度超过8个字符时,汇编程序自动舍去超过部分的字符。为了避免机器错误地把标号中的字符当作指令来汇编,用户在编写自己的程序时绝对不应采用指令保留符、寄存器号以及伪指令符等作为语句的标号,而且同一标号决不能在同一程序的不同语句中使用。

2)操作码字段 操作码字段可以是指令的保留字(如上述程序中的MOV、ADD和NOP等),也可以是伪指令和宏指令的助记符(如ORG和END),用于指示计算机进行何种操作。操作码字段是任一语句不可缺少的必选项,汇编程序根据这一字段生成目标代码。

3)操作数字段 操作数字段用于存放指令的操作数或操作数地址,可以采用字母和数字等多种表示形式。在操作数字段中,操作数个数因指令不同而不同,通常有双操作数.单操作数和无操作数3种情况。

在MCS-51单片机的汇编中,操作数通常有以下5种合法表示形式:

①操作数的二进制、十进制和十六进制形式。在大多数情况下、操作数或操作数地址总是采用十六进制形式表示的,只有在某些特殊场合才采用二进制或十进制的表示形式。若操作数采用二进制形式,则需加后缀B;若操作数采用十进制形式,则需加后缀D;若操作数或操作数地址采用十六进制形式,则需加后缀H。若十六进制的操作数以字符A~F中的某个开头时,则还需在它前面加一个前导“0”,以便机器可以把它和字母A~F区别开来。例如如下程序中的语句都是合法的:

ORG 0500H

MOV A, #00110101B ;A←53 ADD A, #20D ;A←53+20 MOV R0, #20H ;R0←20H MOV R1, #0BFH ;R1←BFH SJMP ﹩ END

- 39 -

②工作寄存器和特殊功能寄存器。当操作数在某个工作寄存器或特殊功能寄存器中时,操作数字段允许采用工作寄存器或特殊功能寄存器的代号表示。例如,上例中的累加器A和工作寄存器R0—R7。

③标号地址。为了便于记忆和编程序方便,操作数字段里的操作数地址常常可以采用经过定义的标号地址表示。例如,若地址M中有一个操作数X,且M已在某处作过定义,则如下指令是合法的:

MOV A, M

④带加减算符的表达式。在上例中,若M已在某处作过定义,则M+1和M-1都是可以作为直接地址来使用的。

MOV A, M+1 MOV A, M+3

⑤采用﹩符,美元符﹩常在转移类指令的操作数字段中使用,用于表示该转移指令操作码所在的内存地址。例如以下指令:

JNB TFO, $

该指令含义是:若TFO=0,则机器总执行该指令;只有TFO≠0时才继续往下执行程序(TFO是TCON中的一位)。

4)注释字段 注释字段用于注解指令或程序的含义,对编写和阅读程序有利。注释字段是任选项,但选用时必须以分号“;”开头,一行不够写需另起一行时也必须以分号“;”开头。在机器汇编时.注释段可以输入系统机,也可以不输入系统机。若需要输入系统机,则汇编时不会产生机器码,但可以原文输出到CRT显示器或打印纸上,供用户阅读和长久保存。当程序较长较复杂时,在汇编语言源程序的适当位置上标上简练的英文注释,这对程序的交流和以后重读颇有方便之处。

分界符也称分隔符,是汇编语言语句的组成部分。汇编程序对汇编语言源程序汇编时,机器遇到不合法分界符就会出错停机,要求用户改正。因此,读者在编程时对每条语句中的分界符也不能掉以轻心,必须正确使用。标号字段中的冒号“:”用于指示标号字段的结束;操作数字段中的逗号“,”用于分隔两个操作数;注释段的开头是分号“;”,操作码字段和操作数字段之间应加空格。 (3)汇编语言构成

汇编语言是汇编语言语句的集合,是构成汇编语言源程序的基本元素,也是汇编语言程序设计的基础。汇编语言语句因机器而异,常可分为指令性语句和伪指令语句两类。

- 40 -

本文来源:https://www.bwwdw.com/article/qea7.html

Top