收藏 分销(赏)

汇编程序设计.ppt

上传人:a199****6536 文档编号:2404089 上传时间:2024-05-29 格式:PPT 页数:79 大小:638.93KB
下载 相关 举报
汇编程序设计.ppt_第1页
第1页 / 共79页
汇编程序设计.ppt_第2页
第2页 / 共79页
汇编程序设计.ppt_第3页
第3页 / 共79页
汇编程序设计.ppt_第4页
第4页 / 共79页
汇编程序设计.ppt_第5页
第5页 / 共79页
点击查看更多>>
资源描述

1、第4章MCS-51汇编语言程序设计 程序设计是为了解决某一个问题而将指令有序地组合在一起的过程。程序有简有繁,但复杂程序往往是由简单的基本程序所构成的。本章将通过一些基本程序,介绍部分常用的程序设计方法。程序设计的过程大致可以分为以下几个步骤:(1)编制要解决问题的程序框图。(2)确定数据结构、算法、工作单元、变量设定。(3)根据所用计算机的指令系统,按照已编制的程序框图用汇编语言编制出源程序。(4)将编制的程序在计算机上调试,直至实现预定的功能。第4章MCS-51汇编语言程序设计 一、汇编程序功能一、汇编程序功能 源程序源程序 (汇编指令程序)(汇编指令程序)汇编汇编 目标程序目标程序(机器

2、码指令程序)(机器码指令程序)汇编指令与机器码指令有一一对应的关系。汇编指令与机器码指令有一一对应的关系。汇编程序是一种翻译程序,将源程序翻译成目标程序。汇编程序是一种翻译程序,将源程序翻译成目标程序。第4章MCS-51汇编语言程序设计 二、汇编程序的汇编过程二、汇编程序的汇编过程 汇编有两种方法:手工汇编、机器汇编。汇编有两种方法:手工汇编、机器汇编。1 1、手工汇编:、手工汇编:第一次汇编:确定地址,翻译成各条机器码,字符标号第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出;原样写出;第二次汇编:标号代真,将字符标号用所计算出的具体第二次汇编:标号代真,将字符标号用所计算出的具体地

3、址值或偏移地址值或偏移量代换。量代换。第4章MCS-51汇编语言程序设计 源程序源程序目标程序目标程序地址地址 ORG 1000H ORG 1000H START START:MOV R0MOV R0,2FH 2FH MOV R2 MOV R2,#00H#00H MOV A MOV A,R0 R0 MOV R3 MOV R3,A A INC R3 INC R3 SJMP SJMP NEXT NEXT LOOP LOOP:INC R0 INC R0 CJNE R0 CJNE R0,#44H#44H,NEXTNEXT INC R2 INC R2 NEXT NEXT:DJNZ R3DJNZ R3,L

4、OOPLOOP MOV MOV 2AH2AH,R2 R2 SJMP$SJMP$END END第一次汇编第一次汇编第二次汇编第二次汇编1000A82F10027A001004E61005FB10060B100780NEXT100908100AB644NEXT100D0A100EDBLOOP10108A2A101280FEA82F7A00E6FB0B800508B644010ADBF98A2A80FE第4章MCS-51汇编语言程序设计 2 2、机器汇编、机器汇编两次扫描过程。两次扫描过程。第一次扫描:第一次扫描:检查语法错误,确定符号名字;检查语法错误,确定符号名字;建立使用的全部符号名字表;建立

5、使用的全部符号名字表;每一符号名字后跟一对应值(地址或数)。每一符号名字后跟一对应值(地址或数)。第二次扫描:第二次扫描:是在第一次扫描基础上,将符号地址转换成是在第一次扫描基础上,将符号地址转换成 地址(代真);地址(代真);利用操作码表将助记符转换成相应的目标码。利用操作码表将助记符转换成相应的目标码。第4章MCS-51汇编语言程序设计 三、伪指令三、伪指令 伪指令是告诉汇编程序,如何汇编源程序的指令。伪指令是告诉汇编程序,如何汇编源程序的指令。伪指令既不控制机器的操作,也不能被汇编成机器代码,伪指令既不控制机器的操作,也不能被汇编成机器代码,故称为伪指令。故称为伪指令。1 1、起始地址伪

6、指令、起始地址伪指令 ORGORGORG addr16ORG addr16 用于规定目标程序段或数据块的起始地址,用于规定目标程序段或数据块的起始地址,设置在程序开始处。设置在程序开始处。2 2、汇编结束伪指令、汇编结束伪指令 ENDEND 告诉汇编程序,对源程序的汇编到此结束。告诉汇编程序,对源程序的汇编到此结束。一个程序中只出现一一个程序中只出现一 次,在末尾。次,在末尾。第4章MCS-51汇编语言程序设计 3 3、赋值伪指令、赋值伪指令 EQUEQU 告诉汇编程序,将汇编语句操作数的值赋予本语句的标号。告诉汇编程序,将汇编语句操作数的值赋予本语句的标号。格式:格式:标号名称标号名称 EQ

7、U EQU 数值或汇编符号数值或汇编符号 “标号名称标号名称”在源程序中可以作数值使用,也可以作数据地址、在源程序中可以作数值使用,也可以作数据地址、位地址使用。位地址使用。先定义后使用,放在程序开头。先定义后使用,放在程序开头。4 4、定义字节伪指令、定义字节伪指令 DBDB 告诉汇编程序从指定的地址单元开始,定义若干字节存储单告诉汇编程序从指定的地址单元开始,定义若干字节存储单 元并赋初值。元并赋初值。格式:格式:标号:标号:DB DB 字节数据或字节数据表字节数据或字节数据表第4章MCS-51汇编语言程序设计 例、例、ORG 1000HORG 1000H PIOI PIOI:DW 765

8、4HDW 7654H,40H40H、1212、ABAB6 6、数据地址赋值伪指令、数据地址赋值伪指令 DATADATA 将表达式指定的数据地址赋予规定的字符名称将表达式指定的数据地址赋予规定的字符名称 格式:格式:字符名称字符名称 DATA DATA 表达式表达式注:该指令与注:该指令与EQUEQU指令相似,只是,可先使用后定义,指令相似,只是,可先使用后定义,放于程序开头、结尾均可。放于程序开头、结尾均可。5、定义字伪指令、定义字伪指令DW从指定地址开始,定义若干个从指定地址开始,定义若干个16个位数据,高八位存入低个位数据,高八位存入低地址;低八位存入高地址。地址;低八位存入高地址。第4章

9、MCS-51汇编语言程序设计 7 7、定义空间伪指令、定义空间伪指令 DSDS 从指定地址开始,保留由表达式指定的若干字节空间作从指定地址开始,保留由表达式指定的若干字节空间作 为备用空间。为备用空间。格式:格式:标号:标号:DS DS 表达式表达式例例2 2、ORG 1000HORG 1000H DS 0AH DS 0AH DB 71H DB 71H,11H11H,11H 11H ;从;从100BH100BH开始存放开始存放 ;71H11H71H11H、11H11H。注:注:DBDB、DWDW、DS DS 只能用于程序存储器;只能用于程序存储器;而不能用于数据存储器。而不能用于数据存储器。第

10、4章MCS-51汇编语言程序设计 8 8、位地址赋值伪指令、位地址赋值伪指令 BITBIT将位地址赋予规定的字符名称。将位地址赋予规定的字符名称。格式:格式:字符名称字符名称 BIT BIT 位地址位地址例例3 3、X1 BIT P12X1 BIT P12 相当于相当于 X1 EQU 92HX1 EQU 92H第4章MCS-51汇编语言程序设计 程序设计有时是一件很复杂的工作,但往往程序设计有时是一件很复杂的工作,但往往有些程序结构是很典型的。采用结构化编程时,有有些程序结构是很典型的。采用结构化编程时,有规律性极强、简单清晰、容易读写、可靠性高等特规律性极强、简单清晰、容易读写、可靠性高等特

11、点。点。根据根据结构化程序设计的观点结构化程序设计的观点,功能复杂的程序,功能复杂的程序结构由基本算法结构组成,基本结构有三种:结构由基本算法结构组成,基本结构有三种:顺序顺序结构、循环结构和分支结构。结构、循环结构和分支结构。第4章MCS-51汇编语言程序设计 语句 3语句 2顺序结构顺序结构入口入口语句 1出口出口分支结构分支结构入口入口条件满足否?条件满足否?分支分支1出口出口YN 分支分支2循环结构循环结构入口入口 处理 修改条件条件满足否?Y出口出口N第4章MCS-51汇编语言程序设计 4.1简单程序设计简单程序设计简单程序又称顺序程序。计算机是按指令在存储器中存放的先后次序来顺序执

12、行程序的。【例4-1】两个8位的无符号数相加的和仍是8位。设内部 RAM的40H、41H单元中分别存放8位数N1、N2,两数相加的结果送42H单元。程序如下:AD1:MOV R0,#40H ;设R0为数据指针 MOV A,R0 ;取N1 INC R0 ;修改指针 ADD A,R0 ;N1+N2 INC R0 MOV R0,A ;存结果 END第4章MCS-51汇编语言程序设计【例4-2】将两个半字节数合并成一个一字节数。设内部RAM的40H、41H单元中分别存放着8位二进制数,要求取出两个单元中的低半字节,并将其合并成一个字节后存放在42H单元。程序如下:第4章MCS-51汇编语言程序设计 S

13、TART:MOV R1,#40HMOV A,R1 ANL A,#0FH ;取第一个半字节 SWAP A ;移至高4位 INC R1 XCH A,R1 ;取第二个字节 ANL A,#0FH ;取第二个半字节 ORL A,R1 ;拼字 INC R1 MOV R1,A ;存放结果 END第4章MCS-51汇编语言程序设计 以上程序均采用了寄存器寻址方式,可以方便地取数、存数。例4-2 中用XCH A,R1指令,既取出了数,又保存了中间结果。第4章MCS-51汇编语言程序设计 4.2分支程序设计分支程序设计在处理实际事务中,只用简单程序设计的方法是不够的,因为大部分程序总包含有判断、比较等情况,程序将

14、根据判断、比较的结果转向不同的分支。下面举两个分支程序的例子。第4章MCS-51汇编语言程序设计【例4-3】两个无符号数比较大小。设存储单元ST1和ST2中存放着两个不带符号的二进制数,找出其中的大数存入ST3单元中。流程图如图4-1所示。第4章MCS-51汇编语言程序设计 图4-1两个无符号数的比较流程 第4章MCS-51汇编语言程序设计 程序如下:ST1:EQU 8040HORG 8000HSTART1:CLR C ;进位位清0 MOV DPTR,#ST1 ;设数据指针 MOVX A,DPTR ;取第一个数 MOV R2,A ;暂存于R2 INC DPTR MOVX A,DPTR ;取第二

15、个数 SUBB A,R2 ;两数比较 JNC BIG1 XCH A,R2 ;第一个数大第4章MCS-51汇编语言程序设计 BIG0:INC DPTR MOVX DPTR,A ;存大数 RET BIG1:MOVX A,DPTR ;第二个数大 SJMP BIG0 END第4章MCS-51汇编语言程序设计 上面程序中,用减法指令SUBB来比较两数的大小。由于这是一条带借位的减法指令,因此在执行该指令前,应先把进位位清0。用减法指令通过借位(CY)的状态判别两数的大小,是两个无符号数比较大小时常用的方法。设有两数x,y,执行x-y,当xy 时,结果无借位产生,则CY=0;反之,则CY=1,表示x0,1

16、ASJMPFINISHSUL:MOVA,#0SJMPFINISHNEG1:MOVA,#FFH;x0,-1AFINISH:MOVDPTR,#BUFMOVXDPTR,AEND第4章MCS-51汇编语言程序设计 4.3循环程序设计循环程序设计在程序设计中,在程序设计中,只有简单程序和分支程序是不够的。只有简单程序和分支程序是不够的。因为简单程序每条指令只执行一次,因为简单程序每条指令只执行一次,而分支程序则根据条而分支程序则根据条件的不同,件的不同,会跳过一些指令,会跳过一些指令,执行另一些指令。执行另一些指令。它们的它们的特点是,特点是,每一条指令至多执行一次。每一条指令至多执行一次。在处理实际事

17、务时,在处理实际事务时,有时会遇到有时会遇到多次重复处理的问题,多次重复处理的问题,用循环程序的方法来解用循环程序的方法来解决就比较合适。决就比较合适。第4章MCS-51汇编语言程序设计 循环程序中的某些指令可以反复执行多次。采用循环程采用循环程序,序,可以缩短程序,可以缩短程序,节省存储单元。节省存储单元。当重复次数越多时,循环程序的优越性就越明显。但是程序的执行时间并不节省。由于要有循环准备、结束判断等指令,速度要比简单程序稍慢些。循环程序一般由五部分组成:(1)初始化部分:为循环程序做准备。如设置循环次数计数器的初值、地址指针置初值、为循环变量赋初值等。(2)处理部分:为反复执行的程序段

18、,是循环程序的实体。第4章MCS-51汇编语言程序设计(3)修改部分:每执行一次循环体后,对指针作一次修改,使指针指向下一数据所在位置,为进入下一轮处理做准备。(4)控制部分:根据循环次数、计数器的状态或循环条件等检查循环是否能继续进行,若循环次数到或循环条件不满足时,应退出循环,否则继续循环。通常(2)、(3)、(4)部分又称为循环体。(5)结束部分:分析及存放执行结果。第4章MCS-51汇编语言程序设计 循环程序的结构一般有两种形式:(1)先进入处理部分,再控制循环,即至少执行一次循环体,如图4-3(a)所示。(2)先控制循环,后进入处理部分,即根据判断结果控制循环的执行与否,有时可以不进

19、入循环体就退出循环程序,如图4-3(b)所示。第4章MCS-51汇编语言程序设计 图4-3循环程序的结构形式 第4章MCS-51汇编语言程序设计 循环结构的程序,循环结构的程序,不论是先处理后判断,不论是先处理后判断,还是先判断还是先判断后处理,后处理,其关键是控制循环的次数。其关键是控制循环的次数。根据需解决问题的实际情况,根据需解决问题的实际情况,对循环次数的控制有多对循环次数的控制有多种:种:循环次数已知的,用计数器控制循环循环次数已知的,用计数器控制循环;循环次数未知循环次数未知的,的,可以按条件控制循环,可以按条件控制循环,也可以用逻辑尺控制循环。也可以用逻辑尺控制循环。循环程序又分

20、单循环程序和多重循环程序。循环程序又分单循环程序和多重循环程序。下面举例说明循环程序的使用。第4章MCS-51汇编语言程序设计 1.单循环程序单循环程序1)循环次数已知的循环程序下面举几个循环次数已知的循环程序例子。【例4-5】工作单元清0。在程序设计时,有时需要将存储器中的部分地址作为工作单元,存放程序执行的中间值和结果。工作单元清0工作常常放在程序的初始化部分中。设有50个工作单元,其首址存放在DPTR中,循环次数存放在R2寄存器中,每执行一次循环,R2的内容减1,直至R2=0时,循环程序结束。流程图见图4-4 第4章MCS-51汇编语言程序设计 图4-4工作单元清0流程图 第4章MCS-

21、51汇编语言程序设计 CLEAR:CLR A MOV R2,#32H ;置计数值LOOP:MOVX DPTR,A INC DPTR ;修改地址指针 DJNZ R2,LOOP ;控制循环 END本例中循环次数是已知的。用R2作循环次数计数器,用DJNZ指令修改计数器值,控制循环的结束与否。第4章MCS-51汇编语言程序设计【例4-6】多个单字节数据求和。已知有n个单字节数据,依次存放在内部RAM的40H单元开始的连续单元中,要求把计算结果存入R2、R3中(高位存R2,低位存R3)。流程图见图4-5。第4章MCS-51汇编语言程序设计 图4-5多个单字节数据求和流程图 第4章MCS-51汇编语言程

22、序设计 程序如下:NUM EQU 0AHORG 8000H SAD:MOV R0,#40H ;设数据指针 MOV R5,#NUN ;计数值0AHR5 SAD1:MOV R2,#0 ;和的高8位清0 MOV R3,#0 ;和的低8位清0 CLR A LOOP:ADD A,R0;取加数 MOV R3,A ;存和的低8位 JNC LOP1 INC R2 ;有进位,和的高8位+1 LOP1:INC R0 ;指向下一数据地址 DJNZ R5,LOOP END 第4章MCS-51汇编语言程序设计 上述程序中,用R0作间址寄存器,每做一次加法,R0加1,数据指针指向下一数据地址,R5为循环次数计数器,控制循

23、环的次数。第4章MCS-51汇编语言程序设计 2)循环次数未知的循环程序以上介绍的几个循环程序例子,它们的循环次数是已知的,适合用计数器置初值的方法。而有些循环程序事先不知道循环次数,不能用以上方法。这时需要根据判断循环条件的成立与否,或用建立标志的方式控制循环程序的结束。第4章MCS-51汇编语言程序设计【例4-7】测试字符串长度。设有一串字符依次存放在内部RAM的从50H单元开始的连续单元中。该字符串以回车符为结束标志。测字符串长度程序,即将该字符串中的每一个字符依次与回车符相比;若比较不相等,则统计字符串长度的计数器加1;若比较相等,则表示该字符串结束,计数器中的值就是字符串的长度。第4

24、章MCS-51汇编语言程序设计 程序如下:CONT:MOV R2,#0FFHMOV R0,#4FH ;数据指针R0置初值LOOP:INC R0INC R2CJNE R0,#0DH,LOOPEND 待测字符以ASCII码形式存放在RAM中,回车符的ASCII码为0DH,程序中用一条CJNZ R0,#0DH,LOOP指令实现字符比较及控制循环的任务,当循环结束时,R2的内容为字符串长度。第4章MCS-51汇编语言程序设计 3)用逻辑尺控制循环次数的循环程序在实际应用中,有时并不要求按一定的固有顺序执行循环处理,而要求处理部分是不规则的循环过程。如调用处理部分的子程序PRG0、PRG1共8次。调用顺

25、序为:第1、3、4、7次是调用PRG1;其余是调用PRG0。第4章MCS-51汇编语言程序设计 程序的设计方法是:程序的设计方法是:设总的调用次数为循环次数,设总的调用次数为循环次数,并且另设一个标志,并且另设一个标志,用来识别调用哪个子程序。用来识别调用哪个子程序。两个子程序可以用0和1两种逻辑状态识别,如用0状态表示调用PRG0,用1状态表示调用PRG1。由于总共调用8次,因此用一个寄存器的8位作为8个标志位,按调用子程序的顺序,把0、1存放在寄存器的不同位上。当当执行程序时,执行程序时,由寄存器的第由寄存器的第0位或第位或第7位起逐位测试,位起逐位测试,根根据此位的状态决定调用哪个子程序

26、。据此位的状态决定调用哪个子程序。因此该寄存器好像一把“尺”,它的内容犹如“尺”的“刻度”,作为识别调用子程序的标志,人们称它为“逻辑尺”。“逻辑尺”的长宽视需要而定,一个字节不够用,可以把相邻的字节串联起来,或者设定n把“逻辑尺”。第4章MCS-51汇编语言程序设计【例4-8】逻辑尺使用。设R0为原始数首地址,R1存放结果首地址,R3为逻辑尺,流程图如图4-6所示。第4章MCS-51汇编语言程序设计 图4-6逻辑尺程序流程图 第4章MCS-51汇编语言程序设计 程序如下:PRG0 EQU 8360H PRG1 EQU 8200H ORG 8000H TEST:MOV R2,#08H ;逻辑尺

27、长度 MOV R3,#10110010B ;设定逻辑尺 LOOP:MOV A,R0 ;取数据 XCH A,R3 RLC A ;左移,读尺刻度 XCH A,R3 JC LOOP1 ;转调用PRG1 LCALL PRG0 ;是0,调用PRG0 SJMP RELT第4章MCS-51汇编语言程序设计 LOOP1:LCALL PRG1 RELT:MOV R1,A ;存结果 INC R0 INC R1 DJNZ R2,LOOP ;R20,继续循环END 第4章MCS-51汇编语言程序设计 2.多重循环程序多重循环程序如果在一个循环体中又包含了其他的循环程序,即循环中还套着循环,则这种程序称为多重循环程序。

28、【例4-9】10 s延时程序。延时程序与MCS-51执行指令的时间有关,如果使用6 MHz晶振,则一个机器周期为2 s,计算出执行一条指令以及一个循环所需要的时间,给出相应的循环次数,便能达到延时的目的。程序如下:第4章MCS-51汇编语言程序设计 DEL:MOV R5,#100DEL0:MOV R6,#200DEL1:MOV R7,#248DEL2:DJNZ R7,DEL2 ;248*2+4 DJNZ R6,DEL1 ;(248*2+4)*200+4 DJNZ R5,DEL0 ;(248*2+4)*200+4)*100+4 RET 第4章MCS-51汇编语言程序设计 上例延时程序实际延时为1

29、0.000 406 s。它是一个三重循环程序,利用程序嵌套的方法对时间实行延迟是程序设计中常用的方法。使用多重循环程序时,必须注意以下几点:(1)循环嵌套必须层次分明,不允许产生内外层循环交叉。(2)外循环可一层层向内循环进入,结束时由里往外一层层退出。(3)内循环体可以直接转入外循环体,实现一个循环由多个条件控制的循环结构方式。第4章MCS-51汇编语言程序设计 3.循环程序应用举例循环程序应用举例 1)不带符号数的多字节加法在处理多字节运算时,应注意低字节向高字节的进位(或借位)(用进位CY判别,当CY=0时,表示无进位或借位,反之则表示有进位或借位)。在进行不带符号的单字节二进制数加减运

30、算时,用进位CY判别数的溢出与否。第4章MCS-51汇编语言程序设计【例4-11】两个多字节数P、Q均以低字节在前,高字节在后的次序,分别存放在由R0、R1指出的内部RAM中,相加后存入P数据区,见图4-8。第4章MCS-51汇编语言程序设计 图4-8RAM数据存储示意 第4章MCS-51汇编语言程序设计 程序如下:N1 EQU 0AHORG 8000HSTART1:CLR C ;清进位 MOV R2,#N1;取字节数MADD:MOV A,R0;取加数(一个字节)ADDC A,R1;两数相加(由低字节开始)MOV R0,A INC R0 INC R1 DJNZ R2,MADD;两数加完?JC

31、ERR ;和字节数大于n,则溢出错 RETERR:END 第4章MCS-51汇编语言程序设计 上例中若将ADDC A,R1指令改为SUBB A,R1指令,则该程序就是多字节减法程序。无符号数的减法运算,被减数必须大于减数。不带符号的十进制数加法程序的设计思想与上例相同。MCS-51指令系统中没有直接的十进制数加法指令,要做十进制BCD码加减运算,只要在加、减指令后跟一条DA A指令,即可使运算结果成为十进制数的形式。第4章MCS-51汇编语言程序设计 4.4散转程序设计散转程序设计散转程序是分支结构程序中的一种并行分支程序。它是根据某种输入或运算结果,分别转向各个处理程序。在MCS-51单片机

32、中,散转指令为JMP A+DPTR,它按照程序运行时决定的地址执行间接转移指令。例:根据R7中的内容,转向各个子程序。第4章MCS-51汇编语言程序设计 第4章MCS-51汇编语言程序设计 第4章MCS-51汇编语言程序设计 说明:(1)采用AJMP即把PC指向子程序的起始地址;(2)R7+R7=R72,与AJMP的机器码匹配,因n128,不会进位;(3)如用LJMP,则需R73,程序需要作相应修改。第4章MCS-51汇编语言程序设计 图4.2 散转程序流程图第4章MCS-51汇编语言程序设计 4.5子程序和参数传递方法子程序和参数传递方法在解决实际问题时,经常会遇到一个程序中多次使用同一个程

33、序段,例如延时程序、查表程序、算术运算程序段等功能相对独立的程序段。为了节约内存,我们把这种具有一定功能的独立程序段编为了节约内存,我们把这种具有一定功能的独立程序段编成子程序。调用程序称为主程序,被调用的程序称为子程序。成子程序。调用程序称为主程序,被调用的程序称为子程序。第4章MCS-51汇编语言程序设计 调用子程序有几个优点:(1)避免了对相同程序段的重复编制。(2)简化程序的逻辑结构,同时也便于子程序调试。(3)节省存储器空间。MCS-51指令系统中,提供了两条调用子程序指令:ACALL及LCALL,并提供了一条返回主程序的指令RET。第4章MCS-51汇编语言程序设计 子程序的编写和

34、调用应该做到:子程序的编写和调用应该做到:(1)标准化。注释中应该注明程序名、功能、入口、标准化。注释中应该注明程序名、功能、入口、出口和所占用的寄存器和存储单元。出口和所占用的寄存器和存储单元。(2)现场保护。现场保护。如果在如果在调用前调用前,程序已经使用了某些存储单元或寄存,程序已经使用了某些存储单元或寄存器,在调用时,这些寄存器和存储单元又有其它用途,就器,在调用时,这些寄存器和存储单元又有其它用途,就应该先把这些单元和寄存器中的内容压入堆栈进行保护。应该先把这些单元和寄存器中的内容压入堆栈进行保护。调用完后调用完后,再从堆栈中弹出,加以恢复。如果有较多的寄,再从堆栈中弹出,加以恢复。

35、如果有较多的寄存器需要保护,应使主程序和子程序使用不同的寄存器组。存器需要保护,应使主程序和子程序使用不同的寄存器组。第4章MCS-51汇编语言程序设计 例例1:从内部:从内部RAM22H单元开始存有一个无符号数数据块,长单元开始存有一个无符号数数据块,长度度n存于存于21H中。求出数据块中的最小数,存于中。求出数据块中的最小数,存于20H中。中。ORG0030HMOVR0,#22H;数据块起始地址;数据块起始地址MOV R1,21H;数据个数;数据个数nMOV20H,#0FFH;初始化最小数为;初始化最小数为0FFHLOOP:MOV A,R0;取新数;取新数INCR0;为取下一个新数做准备;

36、为取下一个新数做准备CJNE A,20H,LOOP1;与原最小数比较;与原最小数比较LOOP1:JNC NEXT;大于等于,原最小数保留;大于等于,原最小数保留MOV 20H,A;小于,改变最小数;小于,改变最小数NEXT:DJNZ R1,LOOP;判断循环;判断循环END第4章MCS-51汇编语言程序设计 4.6查表程序设计查表程序设计查表程序是一种常用程序,查表程序是一种常用程序,它广泛使用于它广泛使用于LED显示器显示器控制、控制、打印机打印以及数据补偿、打印机打印以及数据补偿、计算、计算、转换等功能程序转换等功能程序中,中,具有程序简单、具有程序简单、执行速度快等优点。执行速度快等优点

37、。查表,就是根据变量x与y的关系y=f(x),在表格中查找y。MCS-51系列单片机专门提供了两条查表指令:MOVCA,A+DPTRMOVCA,A+PC第4章MCS-51汇编语言程序设计 例1:设有一个巡回检测报警装置,需对16路输入进行控制,每路有一个最大允许值(为双字节)。控制时需根据测量的通道,找出每路的最大值,高、低8位分放于R3、R4。第4章MCS-51汇编语言程序设计 ORG0000HSTART:MOVA,R2;待查通道数送;待查通道数送AADDA,R2;待查通道数乘;待查通道数乘2,与数据表中的地址相配,与数据表中的地址相配MOVR3,A;保存通道数;保存通道数MOVDPTR,#

38、ADDR8;表格首址送;表格首址送DPTRMOVC A,A+DPTR;查出对应通道的最大允许值高位字节;查出对应通道的最大允许值高位字节INCR3;为指向下一个地址单元做准备;为指向下一个地址单元做准备XCHA,R3MOVCA,A+DPTR;查出对应通道的最大允许值低位字节;查出对应通道的最大允许值低位字节MOVR4,A;存入;存入R4 ADDR8:DW1520H,3721H,4264H,7850H;最大允许值表;最大允许值表DW3484H,3265H,8830H,9947HEND第4章MCS-51汇编语言程序设计 例2 在程序中定义一个09的平方表,利用查表指令找出累加器A=05H的平方值。

39、(1)题意分析题意分析 所谓表格是指在程序中定义的一串有序的常数,如平方表、字型码表、键码表等。因为程序一般都是固化在程序存储器(通常是只读存储器ROM类型)中,因此可以说表格是预先定义在程序的表格是预先定义在程序的数据区中,然后和程序一起固化在数据区中,然后和程序一起固化在ROM中的一串中的一串常数。常数。第4章MCS-51汇编语言程序设计 查表程序的关键是表格的定义和如何实现查表。(2)汇编语言源程序。汇编语言源程序。ORG0000HMOVDPTR,#TABLE;表首地址;表首地址DPTR(数据指针)(数据指针)MOVA,#05;05AMOVC A,A+DPTR;查表指令,;查表指令,25

40、A,A=19HSJMP$;程序暂停;程序暂停TABLE:DB0,1,4,9,16,25,36,49,64,81;定义;定义09平方表平方表END第4章MCS-51汇编语言程序设计 4.7数制转换数制转换日常生活中,人们习惯用十进制数进行各种运算,但在计算机内部却只能用二进制数运算。用二进制编码的十进制数就是能把十进制数转换成适合计算机使用的一种数制,称为BCD码。数制转换、代码转换在使用计算机时是必不可少的部分。下面将介绍几个常用的转换程序。第4章MCS-51汇编语言程序设计 3十六进制数转换成七段代码十六进制数转换成七段代码七段发光二极管显示一个数时,该数对应的代码为七段代码,图4-15为七

41、段代码显示器的共阳极接法,当相应段加上“0”电平时,该段亮。第4章MCS-51汇编语言程序设计 图4-15七段数码管显示器结构 第4章MCS-51汇编语言程序设计 由表4-1的七段代码表看出,七段代码和数字之间没有什么规律,所以适合用查表的方法进行转换。先把七段代码按0F的顺序存入存储器,表首地址为TABS。利用表首地址相加待转换值,即得到对应代码所在的单元地址,从中取得需要的代码。第4章MCS-51汇编语言程序设计 表表4-1七七段段代代码码表表 第4章MCS-51汇编语言程序设计【例4-27】将R中的2位十六进制数转换成七段代码,存于R2,R3。TABSEQU 20H ORG 1000HH

42、ESEC:MOV DPTR,#TABS MOV A,R2 ANL A,#0FH ;取低半字节 MOVC A,A+DPTR ;查表 MOV R3,A ;结果存R3 MOV A,R2 MOV A,#0F0H ;取高半字节 SWAP AMOVC A,A+DPTR ;查表MOV R2,A ;结果存R2RET END 第4章MCS-51汇编语言程序设计 习题与思考题习题与思考题4-1有两个无符号数x、y,分别存放在内部存储器50H、51H单元中,试编写一个程序,实现x*10+y,结果存入52H、53H两个单元中。4-2从内部存储器20H单元开始,有30H个数据。试编一个程序,把其中的正数、负数分别送到5

43、1H和71H开始的存储单元,并分别记下正数、负数的个数,并将结果送50H和70H单元。4-3内部存储单元40H中有一个ASCII码字符,试编一程序,给该数的最高位加上奇校验。4-4编写一段程序,将存放在自DATA单元开始的一个4字节数(高位在前)取补后送回原单元。第4章MCS-51汇编语言程序设计 4-5以BUF1为起始地址的外存储区中,存放有16个单字节无符号二进制数,试编一程序,求其平均值并送BUF2单元。4-6在DATA1单元中有一个带符号8位二进制数x,试编一程序,按以下关系计算y值,并送DATA2单元。第4章MCS-51汇编语言程序设计 4-7设内部RAM的30H和31H单元中有两个

44、带符号数,求出其中的大数并存放在32H单元中。4-8利用逻辑尺控制的方法,设计一个主程序,在第1、3、5、6次调用SB1子程序,在第2、4、7、8次调用SB2子程序。4-9将DATA单元存放的以ASCII码表示的十六进制数转换成十进制数并存放于DATA+1单元。4-10编一个将十六进制数转换成十进制数的子程序。4-11编一个程序,将存储区DATA1单元开始的20个单字节数据依次与DATA2单元为起始地址的20个单字节数据进行交换。第4章MCS-51汇编语言程序设计 4-12试编写一程序,将存储区DATA1单元开始的50个单字节数逐一移至DATA2单元开始的存储区中。4-13试编一采用查表法求120的平方数的子程序(要求:x在累加器A中,1x20,平方数高位存放在R6,低位存放在R7)。4-14试编写一个三字节无符号数乘法程序。4-15试编写一个三字节无符号数除法程序。

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服