您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 第3章89C51单片机汇编语言简介
48第3章89C51单片机汇编语言简介教学目标本章主要介绍89C51单片机的寻址方式、指令系统、基本程序结构及汇编语言程序的编写,并给出了两个简单的应用实例。通过本章节的学习,读者应初步掌握89C51单片机汇编语言的基本指令,并能够完成一些简单程序的编写和调试。任务导入:基于汇编语言的静态LED显示系统的实现:利用89C51单片机的I/O端口驱动一个共阳极数码管,在数码管上循环显示0-9数字,时间间隔0.5秒。任务分析要实现用一个数码管循环显示数字0~9的功能,我们可把数码管的段选线连接到单片的I/O口上,再通过程序让单片机的I/O口分时输出0~9对应的段码就可以了。单片机的程序又如何编写呢?通过本章的学习,就可以用单片机的汇编语言让数码管按照要求进行显示。任务必备知识3.189C51单片机指令系统3.1.189C51单片机指令分类89C51单片机指令系统共有111条指令。这些指令可按不同方法进行分类:1.按字节数分单字节指令(49条)、双字节指令(45条)、三字节指令(17条)。2.按指令的执行时间分单机器周期指令(64条)、双机器周期指令(45条)、四机器周期指令(2条)。493.按指令的功能分数据传送指令(28条)、算术运算指令(24条)、逻辑运算指令(25条)、控制转移指令(17条)、位操作指令(17条)。指令一般由两部分组成,即操作码和操作数。在介绍指令系统前,我们先了解一些特殊符号的意义,这对今后程序的编写是相当有用的。Rn——当前选中的寄存器区的8个工作寄存器R0—R7(n=0-7)。Ri——当前选中的寄存器区中可作为地址寄存器的两个寄存器R0和R1(i=0,1)direct—内部数据存储单元的8位地址。包含0—127(255)内部存储单元地址和特殊功能寄存地址。#data—指令中的8位常数。#data16—指令中的16位常数。addr16—用于LCALL和LJMP指令中的16目的地地址,目的地址的空间为64kB程序存储器地址。#addr11—用于ACALL和AJMP指令中的11目的地地址,目的地址必须放在与下条指令第一个字节同一个2kB程序存储器空间之中。rel—8位带符号的偏移字节,用于所有的条件转移和SJMP等指令中,偏移字节对于下条指令的第一个字节开始的-128——+127范围内。@—间接寄存器寻址或基址寄存器的前缀。/—为操作的前缀,声明对该位操作数取反。DPTR—数据指针。bit—内部RAM和特殊功能寄存器的直接寻址位。A—累加器。B—累加器B,用于乘法和除法指令中。C—进位标志位。(x)—某地址单元中的内容。((x))—由X寻址单元中的内容。3.1.2汇编指令格式各种汇编语言的语句格式是基本相同的,表示如下:[标号:]操作码助记符[第一操作数][,第二操作数][,第三操作数][;注释]即一条汇编语句是由标号、操作码、操作数和注释四个都分所组成。其中方括号括起来的是可选择部分,可有可无,视需要而定。1.标号标号是表示指令位置的符号地址,它是以英文字母开始的字母或数字组成的字符串,并以“:”结尾。通常在子程序入口或转移指令的目标地址处才赋予标号。有了标号,程序中的其它语句才能访问该语句。89C51汇编语言有关标号的规定如下:1)标号是由ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字50或其它特定字符。2)不能使用本汇编语言已经定义了的符号作为标号,如指令助记符,伪指令助记符以及寄存器的符号名称等。3)标号后边必须跟以冒号。4)同一标号在一个程序中只能定义一次,不能重复定义。5)一条语句可以有标号,也可以没有标号,标号的有无决定着本程序中的其它语句是否需要访问这条语句。下面例举一些例子,以加深了解。错误的标号正确的标号2BT:(以数字开头)LOOP4:BEGIN(无冒号)STABL:TB+5T:(“+”号不能在标号中出现)TABLE:ADD:(用了指令助记符)Q¥:2.操作码操作码助记符是表示指令操作功能的英文缩写。每条指令都有操作码,它是指令的核心部分。操作码用于规定本语句执行的操作,操作码可为指令的助记符或伪指令的助记符,操作码是汇编指令中唯一不能空缺的部分。3.操作数操作数用于给指令的操作提供数据或地址。在一条指令中,可能没有操作数,也可能只包括一项,也可能包括二项、三项。各操作数之间以逗号分隔,操作码与操作数之间以空格分隔。操作数可以是立即数,如果立即数是二进制数,则最低位之后加“B”;如果立即数是十六进制数,则最低位之后加“H”;如果立即数是十进制数,则数字后面不加任何标记。操作数可以是本程序中已经定义过的标号或标号表达式,例如MOON是一个已经定义的标号,则表达式MOON+1或MOON-1都可以作为地址来使用。操作数也可以是寄存器名。此外,操作数还可以是位符号或表示偏移量的操作数。相对转移指令中的操作数还可使用一个特殊的符号“$”,它表示本相对转移指令所在的地址,例如:JNBTF0,$表示当TF0位不为0时,就转移到该指令本身,以达到程序在“原地踏步”等待的目的。4.注释注释不属于语句的功能部分,它只是对每条语句的解释说明,它可使程序的文件编制显得更加清楚,是为了方便阅读程序的一种标注。只要用“;”开头,即表明后面为注释内容,注释的长度不限,一行不够时,可以换行接着写,但换行时应注意在开头使用“;”号。5.分界符(分隔符)分界符可以是空格、冒号、分号和逗号等。这些分界符的使用情况如下:1)冒号(:)用于标号之后。2)空格()用于操作码和操作数之间。3)逗号(,)用于操作数之间。514)分号(;)用于注释之前。例如MOVA,#0AH表示取一个立即数0AH(十六进制,如转换成二进制为00001010B)传送到A累加器。3.1.3寻址方式寻址的“地址”即为操作数所在单元的地址,绝大部分指令执行时都需要用到操作数,那么到哪里去取得操作数呢?最易想到的就是告诉CPU操作数所在的地址单元,从那里可取得响应的操作数,这便是“寻址”之意。89C51的寻址方式很多,使用起来也相当方便,功能也很强大,灵活性强。下面我们分别讨论几种寻址方式的原理。1.直接寻址方式指令中操作数直接以单元地址形式出现,例如:MOVA,35H这条指令的意义是把内部RAM中的35H单元中的数据内容传送到累加器A中。值得注意的是直接寻址方式只能使用8位二进制地址,因此这种寻址方式仅限于内部RAM进行寻址。低128位单元在指令中直接以单元地址的形式给出。对于特殊功能寄存器可以使用其直接地址(MOVA,80H)进行访问,还可以以它们的符号形式(MOVA,P0)给出,但是特殊功能寄存器只能用直接寻址方式访问,而无其它方法。2.寄存器寻址方式寄存器寻址对选定的8个工作寄存器R0-R7进行操作,即操作数在寄存器中,因此指定了寄存器就得到了操作数,寄存器寻址的指令中以寄存器的符号来表示寄存器,例如:MOVA,R3这条指令的意义是把所用的工作寄存器组中的R3的内容送到累加器A中。需要注意的是工作状态寄存器的选择是通过程序状态字寄存器来控制的,在这条指令前,应通过PSW设定当前工作寄存器组。3.寄存器间接寻址寄存器寻址方式在寄存器中存放的是操作数,而寄存器间接寻址方式在寄存器中存放的则为操作数的地址,也即操作数是通过寄存器所指向的地址单元得到的,这便是寄存器间接寻址名称的由来。例如:MOVA,@R1这条指令的意义是R0寄存器指向地址单元中的内容送到累加器A中。假如R1=#67H,那么是将67H单元中的数据送到累加器A中。寄存器间接寻址方式可用于访问内部RAM或外部数据存储器。访问内部RAM或外部数据存储器的低256字节时,只通过R0和R1作为间接寄存器。然而内部RAM的高128字节地址与专用寄存器的地址是重叠的,所以这种寻址方式不能用于访问特殊功能寄存器。外部数据存储器的存储空间为64KB,可采用DPTR作为间址寄存器进行访问,例如:MOVXA,@DPTR52这条指令的意义是与上述类似,不再赘述。4.立即寻址立即寻址就是把操作数直接在指令中给出,即操作数包含在指令中,指令操作码的后面紧跟着操作数,一般把指令中的操作数称为立即数。为了与直接寻址方式相区别,在立即数前加上“#”符号,例如:MOVA,#0CH这条指令的意义是将0CH这个操作数送到累加器A中。立即数存放在程序存储器中。5.变址寻址变址寻址是以DPTR或PC作为基址寄存器,以累加器A作为变址寄存器,将两寄存器的内容相加形成16位地址作为操作数的实际地址。例如:MOVA,@A+DPTRMOVXA,@A+PCJMP@A+DPTR在这三条指令中,A作为偏移量寄存器,DPTR或PC作为变址寄存器,A作为无符号数与DPTR或PC的内容相加,得到访问的实际地址。其中前两条是程序存储器读指令,后一条是无条件转移指令。6.位寻址在89C51单片机中,RAM中的20H—2FH字节单元对应的位地址为00H—7FH,特殊功能寄存器中的某些位也可进行位寻址,这些单元既可以采用字节方式访问它们,也可采用位寻址的方式访问它们。7.相对寻址相对寻址方式是为了程序的相对转移而设计的,以PC的内容为基址,加上给出的偏移量作为转移地址,从而实现程序的转移。转移的目的地址可参见如下表达式:目的地址=转移指令所在地址+转移指令字接数+偏移量值得注意的是,偏移量是有正负号之分的,偏移量的取值范围是当前PC值的-128—+127之间。偏移量是以补码形式给出的。3.1.4数据传送类指令数据传送指令共有28条,数据传送指令一般的操作是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数。如果要求在进行数据传送时,目的操作数不丢失,则不能用直接传送指令,而采用交换型的数据传送指令,数据传送指令不影响标志CY,AC和OV,但可能会对奇偶标志P有影响。1.以累加器A为目的操作数类指令(4条)这4条指令的作用是把源操作数指向的内容送到累加器A。有直接、立即数、寄存器和寄存器间接寻址方式:53MOVA,data;(data)→(A)直接单元地址中的内容送到累加器A。MOVA,#data;#data→(A)立即数送到累加器A。MOVA,Rn;(Rn)→(A)Rn中的内容送到累加器A。MOVA,@Ri;((Ri))→(A)Ri内容指向的地址单元中的内容送到累加器A。2.以寄存器Rn为目的操作数的指令(3条)这3条指令的功能是把源操作数指定的内容送到所选定的工作寄存器Rn中。有直接、立即和寄存器寻址方式:MOVRn,data;(data)→(Rn)直接寻址单元中的内容送到寄存器Rn。MOVRn,#data;#data→(Rn)立即数直接送到寄存器Rn。MOVRn,A;(A)→(Rn)累加器A中的内容送到寄存器Rn。3.以直接地址为目的操作数的指令(5条)这组指令的功能是把源操作数指定的内容送到由直接地址data所选定的片内RAM中。有直接、立即、寄存器和寄存器间接4种寻址方式:MOVdata,data;(data)→(data)直接地址单元中的内容送到直接地址单元。MOVdata,#data;#data→(data)立即数送到直接地址单元。MOVdata,A;(A)→(data)累加器A中的内容送到直接地址单元。MOVdata,Rn;(Rn)→(data)寄存器Rn中的内容送到直接地址单元。MOVdata,@Ri;((Ri))→(data)寄存器Ri中的内容指定的地址单元中数据送到直接地址单元。4.以间接地址为目的操作数的指令(3条)这组指令的功能是把源操作数指定的内容送到以Ri中的内容为地址的片内RAM中。有直接、立即和寄存器3种寻址方式:MOV@Ri,data;(data)→((Ri))直接地址单元中的内容送到以Ri中的内容为地址的RAM单元。MOV@Ri,#data;#data→((Ri))立即数送到以Ri中的内容为地址的RAM单元。MOV@Ri,A;(A)→((Ri))累加器A的内容送到以Ri中的内容为地址的RAM单元。5.查表指令(2条)指令的功能是对存放在程序存储器中的数据表格进行查
本文标题:第3章89C51单片机汇编语言简介
链接地址:https://www.777doc.com/doc-2155521 .html