找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

走进单片机世界(五)

  [复制链接]
187196467 发表于 2011-11-21 22:26:24 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
汇编语言程序指令
要使用单片机,就要学会编写程序.一台计算机,无论是大型机还是微型机,如果只有硬件,而没有软件(程序),是不能工作的.单片机也不例外,它必须配合各种各样的软件才能发挥其运算和控制功能.单片机的程序一般用汇编语言指令来表示.
所谓指令是规定计算机进行某种操作的命令.一条指令只能实现有限的功能,为使计算机实现一定的或复杂的功能就需要一系列指令.计算机能够执行的各种指令的集合称为指令系统.计算机的主要功能由指令系统来体
现的.一般来说,一台计算机的指令越丰富,寻址方式越多,且每条指令的执行速度越快,则它的总体功能越强.



MCS―51 单片机的指令系统


MCS-51单片机指令系统使用了7种寻址方式,共有111条指令.如按字节数来分类,其中单字节指令49条,双字节指令45条,三字节指令17条,如按运算速度分类,单周期指令64条,双周期指令45条,四周期指令2条.可见,MCS-51指令系统在占用存储空间方面和运行时间方面效率都比较高.另外,MCS-51有丰富的为操作指令,这些指令与位操作部件组合在一起,可以把大量的硬件组合逻辑用软件来代替,这样可方便地用于各种逻辑控制.
指令一般由两部分组成,即操作码和操作数.对于单字节指令有两种情况:一种是操作码,操作数均包含在这一字节之内;另一种情况是只有操作码无操作数.对于双字节指令,均为一字节是操作码,一字节是操作数;对于三字节指令,一般是一字节为操作码,两个字节为操作数.
由于计算机只能识别二进制数,所以计算机的指令均由二进制代码组成.为了阅读和书写方便,常把它写成十六进制形式,通常称这样的指令为机器指令.现在一般的计算机都有几十甚至几百种指令.显然,即便用十六进制去书写和记忆也是不容易的.为了偏于记忆和使用,制造厂家对指令系统的每一条指令都给出了助记符.助记符是根据机器指令不同的功能和操作对象来描述指令的符号.由于助记符是用英文缩写来描述指令的特征的,因此它不仅便于记忆,也便于理解和分类.这种助记符形式来表示的机器指令称为汇编语言指令.因此汇编语言是一种采用助记符表示指令,数据和地址来设计程序的语言.

汇编语言的特点

(1) 助记符指令和机器指令一一对应.用汇编语言编制的程序,效率高,占用存储空间小,运行速度快.因此汇编语言能编写出最优化的程序,而且能反映出计算机的实际运行情况.
(2) 用汇编语言编程比用高级语言困难.因为汇编语言是面向计算的,程序设计人员必须对计算机有相当深入的了解,才能使用汇编语言编制程序.
(3) 汇编语言能直接和存储器及接口电路打交道,也能申请中断.因此汇编语言程序能直接管理和控制硬件设备.
(4) 汇编语言缺乏通用性,程序不易移植.各种计算机都有自已的汇编语言,不同计算机的汇编语言之间不能通用.但是掌握了一种计算机的汇编语言,就有助于学业其它计算机的汇编语言.

汇编语言的语句格式

各种汇编语言的语句格式是基本相同的,表示如下:
[标号:]操作码助记符[第一操作数][,第二操作数][,第三操作数][;注释]
即一条汇编语句由标号,操作码,操作数和注释4个部分组成.其中包括起来的是可选择部分,可有可无,视需要而定.

1.标号
标号表示指令位置的符号地址,它是以英文字母开始的由1~6个字母或数字组成的字符串,并以:结尾.通常在子程序入口或转移指令的目标处才赋予标号.有了标号,程序中的其它语句才能访问该语句.MCS-51汇编语言有关标号的规定如下:
(1) 标号由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
(2) 不能使用本汇编语言已经定义了的符号作为标记,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(3) 标号后边必须跟以冒号。
(4) 同一标号在一个程序中只能定义一次,不能重复定义。
(5) 一条语句可以有标号,也可以没有标号,标号的有无决定着本程序中的其它语句是否需要访问这条语句。
下面列举一些例子,以加深了解。
错误的标号 正确的标号
2BT:(以数字开头) LOOP4:
BEGIN(无冒号) STSBL
TB+5T:(+号不能在标号中出现) TABLE
ADD:(用了指令助记符) Q¥:

2.操作码

操作码助记符是表示指令操作功能的英文缩写。每条指令都有操作码,它是指令的核心部分。操作码用于规定本语句执行的操作,操作码可为指令的助记符或伪指令的助记符,操作码是汇编指令中唯一的不能空缺的部分。

3.操作数

操作数用于给指令的操作提供数据或地址。在一条指令中,可能没有操作数,也可能只包括一项,也可能包括二项、三项。各操作数之间以逗号分隔,操作码与操作数之间以空隔分隔。操作数可以是力即数,如果立即数是二进制数,则最低位之后加B;如果立即数是十六进制数,则最低位之后加H;如果立即数是十进制数,则数字后面不用加任何标记。
操作数可以是本程序中定义的标号或标号表达式,例如,MOON是一个定义好的标号,则表达式MOON+1或MOON-1都可以作为地址来使用;操作数也可以是寄存器名;操作数还可以是为符号或表示偏移量的操作数。相对转移指令中的操作数还可使用一个特殊的符号$, 它表示本相对转移指令所在的地址,例如,JNB,TF0,$表示当TF0位不为0时,就转移到该指令本身,以达到程序在原地踏步等待的目的。

4.注释

注释不属于语句的功能部分,它只是对每条语句的解释说明,它可使程序的文件编制显得更加清晨,是为了方便阅读程序的一种标注。只要用;开头,即表明后面为注释内容,注释的长度不限,一行不够时,可以换行接着写,但换行时应注意在开头使用 ; 号。

5.分界符(分隔符)

汇编程序在上述每段的开头或结尾使用分界符把个段分开,一便于区分。分界符可以是空格、冒号、分号等。这些分界符在MCS-51汇编语言中使用情况如下:
(1) 冒号(:)用于标号之后。
(2) 空格( )用于操作码和操作数之间。
(3) 逗号(,)用于操作数之前。
(4) 分号(;)用于注释之前。
例如,MOV A,#0AH表示取一个(立即)数0A(十六进制,如转换成二进制为00001010)传送到累加器A。

指令的寻址方式

指令的操作对象大多是各类数据,而数据在寄存器、存储器中可以用多种方式存取。指令执行过程中寻找操作数的方式,称为指令的寻址方式。
为了弄清楚什么是寻址方式,从以下的指令着手进行研究。
MOV P1,#0FFH
MOV R7,#0FFH
这些指令都是将一些数据送到相应的位置中去,分析MOV P1,#0FFH这条指令可以看到,MOV 是命令动词,决定做什么事情。这条指令的用途是数据的传递。数据传递必须要有一个源――要送什么数,还要有一个目的――要把这个数送到什么地方去。在上述指令中,要送的数是0FFH,而要送达的地方(目的地)是P1这个寄存器。在数据传递类指令中,一般都将目的地写在紧跟择令的后面,而将源操作数写在最后。

一、立即寻址

在这种寻址方式中,指令中的操作数给出的是参与运算或传送的数据本身,所以又称为立即数,因此就把这种寻址方式称为立即寻址。
例如:MOV A,#30

就是一条立即寻址方式的指令,它的功能是把数据30传送到累加器A。

二、直接寻址

在这种寻址方式中,操作数直接给出的是参与运算或传送的数据所在的地址,即该地址单元的内容是操作的对象。
例如:MOV A,30H

指令中的30H操作数就是直接寻址方式,它的功能是把RAM中的30H单元的内容传送到累加器A中 。

三、寄存器寻址

寄存器寻址是指操作数存放于寄存器中,对寄存器中的数据进行操作,寄存器包括通用寄存器R0~R7、累加器A,寄存器B,地址指针DPTR和进位标志位CY。
工作寄存器的选择有程序状态字寄存器中的RS0、RS1决定。
例如:MOV A,R1

指令中的操作数在R1中,因此在指令中指定了R1,就能从中取得操作数,其功能是把寄存器R1的内容传送到累加器A中。

四、寄存器间接寻址

寄存器间接寻址方式的寄存器中存放的是操作数的地址,即操作数是通过寄存器间接得到的,因此称之为寄存器间接寻址。
在这种寻址方式中,寄存器名称前面加前缀标志@.可作为间接寻址用的通用工作寄存器有R0和R1、堆盏指针寄存器SP、地址指针寄存器DPTR。
假定R0寄存器的内容是30H,则指令的功能是以R0寄存器内容30H为地址,把30H地址单元中的内容送到累加器A.
例如:MOV A,@R0
ec78365f.jpg
五、变址寻址

这种寻址方式是以DPTR或PC为基地址寄存器,以累加器A为变址寄存器,两者内容相加形成操作数所在的单元地址。
例如:MOVC A,@A+DPTR
其功能是把DPTR和A中的内容相加,其和为操作数所在的地址,把该地址单元的内容传送到A.假设A中原有内容为34H,DPTR的内容为1200H,则该指令源操作数的地址为1200H+34H=1234H.又设ROM的1234H单元的内容为0AH,则指令执行的结果累加器A的值改变为0AH.
c164178b.jpg
六、位寻址

MCS—51系列单片机具有位处理功能,可以对数据位进行操作,因此就有了位寻址方式。即对一位二进制进行操作时,可以在指令中直接给出位地址,这种寻址方式称为位寻址。例如:SETB 20H
指令的功能是将位地址20H置1的操作。可以进行位寻址的地址空间有片内RAM中的位寻址区(20H~2FH单元)和可以位寻址的特殊功能寄存器。

七、相对寻址

相对寻址以程序计数器PC的当前值作为基地址。与指令中给定的相对偏移量REL进行相加,把所得之和作为程序的转移地址。
例如:JZ 30H
当A=0时,PC←PC+2+REL,若A≠0,则PC←PC+2。

 楼主| 187196467 发表于 2011-11-21 22:26:43 | 显示全部楼层
指令格式中符号意义说明

● Rn 当前选中的工作寄存器组R0~R7(n=0~7)。它在片内数据存储器中的地址由PSW中的RS1和RS0确定,可以是00H~07H(第0组)、08~0FH(第1组)等。
● Ri 当前选中的工作寄存器组中可作为地址指针的两个工作寄存器R0和R1(i=0或1)
● #data 8位立即数,即包括在指令中的8位常数。
● #data 16位立即数,即包括在指令中的16位常数。
● direct 8位片内RAM单元(包括SFR)的直接地址。
● bit 片内RAM或特殊功能寄存器的直接寻址位地址。
● @ 间接寻址方式中,表示间接寄存器的符号。
● / 位操作指令中,表示对该位先取反再参与操作,但不影响该位的原值。
● → 指令操作流程,将箭头左边的内容送入箭头右边的单元格内。

MCS—51系列单片机指令系统中的各类寻址方式对应不同的存储空间,寻址方式不太容易接受,大家在学习时慢慢体会寻址方式的应用,掌握了寻址方式有助于理解指令的功能,也就是学习单片机的关键点。
谈了那么多,可能有的读者会说,我还是不明白,看不懂,那也没关系,学单片机开始就是这样的,还是让我们结合程序与实验吧。再结合指令学习就会逐步明白的。
ahljj 发表于 2012-10-4 08:31:02 | 显示全部楼层
{:e179:}{:e179:}
ahljj 发表于 2012-10-4 08:37:06 | 显示全部楼层
{:e179:}{:e179:}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-23 13:49 , Processed in 0.097037 second(s), 9 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表