第四章MCS-51汇编语言程序设计
- 格式:doc
- 大小:2.52 MB
- 文档页数:11
第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
MCS51单片机指令系统与汇编语言程序设计MCS-51是一种非常常见的8位单片机系列,该系列包括了多种型号的单片机,如Intel 8051、8031、8052等。
MCS-51单片机指令系统是一组用于驱动该系列单片机的指令集,汇编语言程序设计是利用这些指令来编写程序。
MCS-51单片机指令系统包含了多种指令,可以执行诸如数据传输、算术逻辑运算、控制和数据访问等功能。
这些指令通过各种不同的寻址模式来操作数据,包括立即寻址、寄存器寻址、直接寻址、间接寻址和寄存器间接寻址等。
不同的寻址模式和指令组合可以实现不同的功能。
汇编语言程序设计通过将人类可读的汇编指令翻译成机器可执行的二进制指令来编写程序。
在MCS-51单片机中,汇编指令由操作码和操作数组成。
操作码指定了所执行的操作,如数据传输、算术运算或控制指令。
操作数则指定了指令要操作的数据。
下面以一个简单的例子来说明MCS-51单片机指令系统和汇编语言程序设计的基本原理。
假设我们要编写一个程序,将两个寄存器中的数据相加,并将结果存储到第三个寄存器中。
首先,我们需要将第一个寄存器的值加载到累加器A中,这可以通过MOV指令实现。
MOV指令的操作码为01,操作数为两个寄存器的地址。
例如,MOVA,R0将R0的值加载到A中。
接下来,我们需要将第二个寄存器的值加载到B寄存器中,同样可以使用MOV指令。
MOVB,R1将R1的值加载到B中。
然后,我们可以使用ADD指令将A和B中的值相加,并将结果存储到A中。
ADD指令的操作码为04,操作数为A的地址。
例如,ADDA将累加器中的值与A寄存器中的值相加,并将结果存储到A中。
最后,我们可以使用MOV指令将A中的结果移动到第三个寄存器中,例如,MOVR2,A将A的值移动到R2中。
通过组合使用这些指令,我们可以实现将两个寄存器中的值相加并存储到第三个寄存器中的功能。
总结来说,MCS-51单片机指令系统和汇编语言程序设计是一种用于编程控制该系列单片机的方式。
第四章MCS-51汇编语言程序设计重点及难点:单片机汇编语言程序设计的基本概念、伪指令、单片机汇编语言程序的三种基本结构形式、常用汇编语言程序设计。
教学基本要求:1、掌握汇编语言程序设计的基本概念;2、掌握伪指令的格式、功能和使用方法;3、掌握顺序结构、分支结构和循环结构程序设计的步骤和方法;4、掌握常用汇编语言程序设计步骤和方法。
教学内容§4.1汇编语言程序设计概述一、汇编语言的特点(1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。
(2)使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。
(3)汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。
(4)汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用;但是掌握了一种计算机系统的汇编语言后,学习其他的汇编语言就不太困难了。
二、汇编语言的语句格式[<标号>]:<操作码> [<操作数>];[<注释>]三、汇编语言程序设计的步骤与特点(1)建立数学模型(2)确定算法(3)制定程序流程图(4)确定数据结构(5)写出源程序(6)上机调试程序§4.2伪指令伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令。
MCS- 51常见汇编语言程序中常用的伪指令:第四章MCS-51汇编语言程序设计911.ORG (ORiGin)汇编起始地址命令[<标号:>] ORG <地址>2.END (END of assembly)汇编终止命令[<标号:>] END [<表达式>]3.EQU (EQUate)赋值命令<字符名称> EQU <赋值项>4.DB (Define Byte)定义字节命令[<标号:>] DB <8位数表>5.DW (Define Word)定义数据字命令[<标号:>] DW <16位数表>6.DS (Define Stonage )定义存储区命令[<标号:>] DW <16位数表>7.BIT位定义命令<字符名称> BIT <位地址>8.DA TA数据地址赋值命令<字符名称> DATA <表达式>§4.3单片机汇编语言程序的基本结构形式一、顺序程序[例4-1]三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、5414和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。
MOV R0 ,# 52H ;被加数的低字节地址MOV R1 ,# 55H ;加数的低字节地址MOV A ,@ R0ADD A ,@ R1 ;低字节相加MOV @ R0 , A ;存低字节相加结果DEC R0DEC R1MOV A ,@ R0ADDC A ,@ R1 ;中间字节带进位相加MOV @ R0 , A ;存中间字节相加结果DEC R0DEC R1MOV A ,@ R0ADDC A ,@ R1 ;高字节带进位相加MOV @ R0 , A ;存高字节相加结果CLR AADDCA , # 00H ;存放进位的单元地址 MOV@ R0 , A ;进位送00H 位保存二、分支程序 1.单分支程序[例4-2] 变量X 存放在V AR 单元内,函数值Y 存放在FUNC 单元中,试按下式的要求给Y 赋值。
⎪⎩⎪⎨⎧<-=>=010001X X X Y本题的程序流程见图4-1(a )。
参考程序:ORG 1000HV AR DA TA 30HFUNC DA TA 31HMOV A , V AR;A ← X JZ DONE;若X=0,则转DONE JNB ACC.7 , POSI;若X>0,则转POSI MOV A , # 0FFH;若X<0,则Y=-1 SJMP DONEPOSI : MOV A , # 01H;若X>0,则Y = 1 DONE : MOVE FUNC , A;存函数值 SJMP $END图4-1 例4-2的分支流程图第四章MCS-51汇编语言程序设计93这个程序的特征是先比较判断,然后按比较结果赋值,这实际是三分支而归一的流程图,因此,至少要用两个转移指令。
初学者很容易犯的一个错误是:漏掉了其中的SJMP DONE 语句,因为流程图中没有明显的转移痕迹。
这个程序也可以按图4-1(b)的流程图来编写,其特征是先赋值,后比较判断,然后修改赋值并结束。
参考程序:ORG 1000HV AR DA TA 30HFUNC DA TA 31HMOV A ,V AR ;A ←XJZ DONE ;若X=0,则转DONEMOV R0 ,# 0FFH ;先设X<0,R0 = FFHJNB ACC.7 ,NEG ;若X<0,则转NEGMOV R0 ,# 01H ;若X>0,R0 = 1 NEG:MOV A ,# 01H ;若X>0,则Y = 1DONE:MOV FUNC , A ;存函数值SJMP $END2.多分支程序图4-2 多分支程序转移三、循环程序循环程序一般由4部分组成:(1)置循环初值,即确立循环开始时的状态。
(2)循环体(工作部分),要求重复执行的部分。
(3)循环修改,循环程序必须在一定条件下结束,否则就要变成死循环。
(4)循环控制部分,根据循环结束条件,判断是否结束循环。
以上4个部分可以有两种组织方式。
[例4-3]从BLOCK单元开始存放一组无符号数,一般称为一个数据块。
数据块长度放在LEN单元,编写一个求和程序,将和存入SUM单元,假设和不超过8位二进制数。
在置初值时,将数据块长度置入一个工作寄存器,将数据块首地址送入另一个工作寄存器,一般称它为数据块地址指针。
每做一次加法之后,修改地址指针,以便取出下一个数来相加,并且使计数器减1。
到计数器减到0时,求和结束,把和存入SUM即可。
参考程序:各单元的地址是任意的。
LEN DA TA 20HSUM DA TA 21HBLOCK DA TA 22HCLR A ;清累加器MOV R2 ,LEN ;数据块长度送R2MOV R1 ,# BLOCK ;数据块首址送Rl LOOP:ADD A ,@R1 ;循环做加法INC R1 ;修改地址指针DJNZ R2 ,LOOP ;修改计数器并判断MOV SUM , A ;存和以上程序在计数器初值不为零时是没有问题的,但若是数据块的长度有可能为零,则将出现问题。
当R2初值为零,减1之后将为FFH,故要做256次加法之后才会停止,显然和题意不符。
若考虑到这种情况,则可按图4-3(b)的方式来编写程序。
在做加法之前,先判断一次R2的初值是否为零。
整个程序仍基本套用原来的形式:CLR A ;清累加器MOV R2 ,LEN ;数据块长度送R2MOV R1 ,# BLOCK ;数据块首址送RlINC R2SJMP CHECKLOOP:ADD A ,@R1 ;循环做加法INC R1 ;修改地址指针CHECK:DJNZ R2 ,LOOPMOV SUM , A ;存和§4.4MCS-51单片机汇编语言程序设计举例一、算术运算程序[例4-4]假定R2、R3和R4、R5分别存放两个16位的带符号二进制数,其中R2和R4的最高位为两数的符号位。
请编写带符号双字节二进制数的加减法运算程序,以BSUB为减法程序入口,以BADD为加法程序入口,以R6、R7保存运算结果。
参考程序:BSUB:MOV A ,R4 ;取减数高字节CPL ACC.7 ;减数符号取反以进行加法MOV R4 , ABADD:MOV A ,R ;取被加数MOV C ,ACC.7MOV F0 , C ;被加数符号保存在F0中XRL A ,R4 ;两数高字节异或第四章MCS-51汇编语言程序设计95MOV C ,ACC.7 ;两数同号CY=0,两数异号CY=1MOV A ,R2CLR ACC.7 ;高字节符号位清“0”MOV R2 , A ;取其数值部分MOV A ,R4CLR ACC.7 ;低字节符号位清“0”MO V R4 , A ;取其数值部分JC JIAN ;两数异号转JIANJIA:MOV A ,R3 ;两数同号进行加法ADD A ,R5 ;低字节相加MOV R7 , A ;保存和MOV A ,R2ADDC A ,R4 ;高字节相加MOV R6 , A ;保存和JB ACC.7 ,QAZ ;符号位为“1”转溢出处理QWE:MOV C ,F0 ;结果符号处理MOV ACC.7, CMOV R6 , ARETJIAN:MOV A ,R3 ;两数异号进行减法CLR CSUBB A ,R5 ;低字节相减MOV R7 , A ;保存差MOV A ,R2SUBB A ,R4 ;高字节相减MOV R6 , A ;保存差JNB ACC.7 ,QWE ;判断差的符号,为“0”转QWE BMP:MOV A ,R7 ;为“1”进行低字节取补CPL AADD A ,#1MOV R7 , AMOV A ,R6 ;高字节取补CPL AADDC A ,# 0MOV R6 , ACPL F0 ;保存在F0中的符号取反SJMP QWE ;转结果符号处理QAZ: ;溢出处理二、数制转换程序[例4-5]在内部RAM的hex单元中存有2位十六进制数,试将其转换为ASCII码,并存放于asc和asc+1两个单元中。
主程序(MAIN):MOV SP ,# 3FHMAIN:PUSH hex ;十六进制数进栈ACALL HASC ;调用转换子程序POP asc ;第一位转换结果送asc单元MOV A ,hex ;再取原十六进制数SW AP A ;高低半字节交换PUSH ACC ;交换后的十六进制数进栈ACALL HASCPOP asc+l ;第二位转换结果送asc+l单元子程序(HASC):HASC:DEC SP ;跨过断点保护内容DEC SPPOP ACC ;弹出转换数据ANL A ,# 0FH ;屏蔽高位ADD A ,# 7 ;修改变址寄存器内容MOVC A ,@A+PC ;查表PUSH ACC ;查表结果进栈INC SP ;修改堆栈指针回到断点保护内容INC SPRET SPASCTAB:DB “0,1,2,3,4,5,6,7”;ASCII码表DB “8,9,A,B,C,D,E,F”三、定时程序有多个定时需要,我们可以先设计一个基本的延时程序,使其延迟时间为各定时时间的最大公约数,然后就以此基本程序作为子程序,通过调用的方法实现所需要的不同定时。