《2022年汇编语言程序设计 4.pdf》由会员分享,可在线阅读,更多相关《2022年汇编语言程序设计 4.pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第四章 MCS-51汇编语言程序设计重点及难点:单片机汇编语言程序设计的基本概念、伪指令、单片机汇编语言程序的三种基本结构形式、常用汇编语言程序设计。教学基本要求:1、掌握汇编语言程序设计的基本概念;2、掌握伪指令的格式、功能和使用方法;3、掌握顺序结构、分支结构和循环结构程序设计的步骤和方法;4、掌握常用汇编语言程序设计步骤和方法。教学内容4.1汇编语言程序设计概述一、汇编语言的特点(1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。(2)使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程
2、序设计人员必须对计算机硬件有相当深入的了解。(3)汇编语言能直接访问存储器及接口电路,也能处理中断, 因此汇编语言程序能够直接管理和控制硬件设备。(4)汇编语言缺乏通用性,程序不易移植, 各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用;但是掌握了一种计算机系统的汇编语言后,学习其他的汇编语言就不太困难了。二、汇编语言的语句格式: ; 三、汇编语言程序设计的步骤与特点(1)建立数学模型(2)确定算法(3)制定程序流程图(4)确定数据结构(5)写出源程序(6)上机调试程序4.2伪 指 令伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令。MCS- 51 常见汇编语言
3、程序中常用的伪指令:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 第四章MCS-51 汇编语言程序设计91 1ORG ( ORiGin) 汇编起始地址命令 ORG 2END ( END of assembly) 汇编终止命令 END 3EQU ( EQUate) 赋值命令 EQU 4DB (Define Byte) 定义字节命令 DB 5DW (Define Word) 定义数据字命令 DW 6DS (Define Ston
4、age ) 定义存储区命令 DW 7BIT 位定义命令 BIT 8DATA 数据地址赋值命令 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 , R0 ADD A , R1 ;低字节相加MOV R0 ,A ;存低字节相加结果DEC R0
5、DEC R1 MOV A , R0 ADDC A , R1 ;中间字节带进位相加MOV R0 ,A ;存中间字节相加结果DEC R0 DEC R1 MOV A , R0 ADDC A , R1 ;高字节带进位相加MOV R0 ,A ;存高字节相加结果CLR A 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - ADDC A ,# 00H ;存放进位的单元地址MOV R0 ,A ;进位送 00H 位保存二、分支程序1单分支程序例
6、4-2 变量 X 存放在 VAR 单元内,函数值Y 存放在 FUNC 单元中,试按下式的要求给 Y 赋值。010001XXXY本题的程序流程见图4-1(a) 。参考程序:ORG 1000H VAR DATA 30H FUNC DATA 31H MOV A ,VAR ;A XJZ DONE ;若 X=0,则转 DONE JNB ACC.7 ,POSI ;若 X0,则转 POSI MOV A ,# 0FFH ;若 X0,则 Y = 1 DONE:MOVE FUNC ,A ;存函数值SJMP $ END 图 4-1 例 4-2的分支流程图名师资料总结 - - -精品资料欢迎下载 - - - - -
7、- - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 第四章MCS-51 汇编语言程序设计93 这个程序的特征是先比较判断,然后按比较结果赋值, 这实际是三分支而归一的流程图,因此,至少要用两个转移指令。初学者很容易犯的一个错误是:漏掉了其中的SJMP DONE语句,因为流程图中没有明显的转移痕迹。这个程序也可以按图4-1(b)的流程图来编写,其特征是先赋值,后比较判断,然后修改赋值并结束。参考程序:ORG 1000H VAR DATA 30H FUNC DATA 31H MOV A ,VAR
8、 ;A X JZ DONE ;若 X=0,则转 DONE MOV R0 ,# 0FFH ;先设 X0,R0 = FFH JNB ACC.7 ,NEG ;若 X0,R0 = 1 NEG:MOV A ,# 01H ;若 X0,则 Y = 1 DONE:MOV FUNC ,A ;存函数值SJMP $ END 2多分支程序图 4-2 多分支程序转移三、循环程序循环程序一般由4 部分组成 :(1)置循环初值,即确立循环开始时的状态。(2)循环体(工作部分) ,要求重复执行的部分。(3)循环修改,循环程序必须在一定条件下结束,否则就要变成死循环。(4)循环控制部分,根据循环结束条件,判断是否结束循环。以上
9、 4 个部分可以有两种组织方式。例 4-3 从 BLOCK 单元开始存放一组无符号数,一般称为一个数据块。数据块长度放在 LEN 单元,编写一个求和程序,将和存入SUM 单元,假设和不超过8 位二进制数。在置初值时,将数据块长度置入一个工作寄存器,将数据块首地址送入另一个工作寄存器,一般称它为数据块地址指针。每做一次加法之后,修改地址指针,以便取出下一个数来相加,并且使计数器减1。到计数器减到0 时,求和结束,把和存入SUM 即可。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4
10、页,共 11 页 - - - - - - - - - 参考程序:各单元的地址是任意的。LEN DATA 20H SUM DATA 21H BLOCK DATA 22H CLR A ;清累加器MOV R2 ,LEN ;数据块长度送R2 MOV R1 ,# BLOCK ;数据块首址送Rl LOOP:ADD A ,R1 ;循环做加法INC R1 ;修改地址指针DJNZ R2 ,LOOP ;修改计数器并判断MOV SUM ,A ;存和以上程序在计数器初值不为零时是没有问题的,但若是数据块的长度有可能为零,则将出现问题。当R2 初值为零,减1 之后将为 FFH,故要做 256 次加法之后才会停止,显然和
11、题意不符。若考虑到这种情况,则可按图4-3(b)的方式来编写程序。在做加法之前,先判断一次 R2 的初值是否为零。整个程序仍基本套用原来的形式:CLR A ;清累加器MOV R2 ,LEN ;数据块长度送R2 MOV R1 ,# BLOCK ;数据块首址送Rl INC R2 SJMP CHECK LOOP:ADD A ,R1 ;循环做加法INC R1 ;修改地址指针CHECK:DJNZ R2 ,LOOP MOV SUM ,A ;存和4.4MCS-51 单片机汇编语言程序设计举例一、算术运算程序例 4-4 假定 R2、R3 和 R4、R5 分别存放两个16 位的带符号二进制数,其中R2 和 R4
12、 的最高位为两数的符号位。请编写带符号双字节二进制数的加减法运算程序,以BSUB 为减法程序入口,以BADD 为加法程序入口,以R6、R7保存运算结果。参考程序:BSUB:MOV A ,R4 ;取减数高字节CPL ACC.7 ;减数符号取反以进行加法MOV R4 ,A BADD :MOV A ,R ;取被加数MOV C ,ACC.7 MOV F0 ,C ;被加数符号保存在F0 中XRL A ,R4 ;两数高字节异或名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页
13、- - - - - - - - - 第四章MCS-51 汇编语言程序设计95 MOV C ,ACC.7 ;两数同号 CY=0,两数异号 CY=1 MOV A ,R2 CLR ACC.7 ;高字节符号位清“ 0”MOV R2 ,A ;取其数值部分MOV A ,R4 CLR ACC.7 ;低字节符号位清“ 0”MO V R4 ,A ;取其数值部分JC JIAN ;两数异号转 JIAN JIA:MOV A ,R3 ;两数同号进行加法ADD A ,R5 ;低字节相加MOV R7 ,A ;保存和MOV A ,R2 ADDC A ,R4 ;高字节相加MOV R6 ,A ;保存和JB ACC.7 ,QAZ
14、;符号位为“ 1”转溢出处理QWE:MOV C ,F0 ;结果符号处理MOV ACC.7,C MOV R6 ,A RET JIAN:MOV A ,R3 ;两数异号进行减法CLR C SUBB A ,R5 ;低字节相减MOV R7 ,A ;保存差MOV A ,R2 SUBB A ,R4 ;高字节相减MOV R6 ,A ;保存差JNB ACC.7 ,QWE ;判断差的符号,为“0”转 QWE BMP:MOV A ,R7 ;为“ 1”进行低字节取补CPL A ADD A ,#1 MOV R7 ,A MOV A ,R6 ;高字节取补CPL A ADDC A ,# 0 MOV R6 ,A CPL F0
15、;保存在 F0 中的符号取反SJMP QWE ;转结果符号处理QAZ :;溢出处理名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - 二、数制转换程序例 4-5 在内部 RAM 的 hex 单元中存有 2 位十六进制数,试将其转换为ASCII 码,并存放于 asc和 asc+1两个单元中。主程序( MAIN ) :MOV SP ,# 3FH MAIN :PUSH hex ;十六进制数进栈ACALL HASC ;调用转换子程序POP
16、 asc ;第一位转换结果送asc单元MOV A ,hex ;再取原十六进制数SWAP A ;高低半字节交换PUSH ACC ;交换后的十六进制数进栈ACALL HASC POP asc+l ;第二位转换结果送asc+l单元子程序( HASC ) :HASC:DEC SP ;跨过断点保护内容DEC SP POP ACC ;弹出转换数据ANL A ,# 0FH ;屏蔽高位ADD A ,# 7 ;修改变址寄存器内容MOVC A ,A+PC ;查表PUSH ACC ;查表结果进栈INC SP ;修改堆栈指针回到断点保护内容INC SP RET SP ASCTAB :DB “0,1,2,3,4,5,6
17、,7” ;ASCII 码表DB “8,9,A,B,C,D,E,F”三、定时程序有多个定时需要,我们可以先设计一个基本的延时程序,使其延迟时间为各定时时间的最大公约数,然后就以此基本程序作为子程序,通过调用的方法实现所需要的不同定时。例如要求的定时时间分别为5s 、l0s 和 20s 并设计一个 1s延时子程序DELAY ,则不同定时的调用情况表示如下:MOV R0 ,# 05H ;5s延时LOOP1:LCALL DELAY DJNZ R0 ,LOOP1 MOV R0 ,# 0AH ;10s 延时LOOP2:LCALL DELAY 名师资料总结 - - -精品资料欢迎下载 - - - - - -
18、 - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - 第四章MCS-51 汇编语言程序设计97 DJNZ R0 ,LOOP2 MOV R0 ,# 14H ;20s 延时LOOP3:LCALL DELAY DJNZ R0 ,LOOP3 四、查表程序一个查表程序的例子。假定有44 键盘,键扫描后把被按键的键码放在累加器A 中,键码与处理子程序入口地址的对应关系为:并假定处理子程序在ROM64KB 的范围内分布。 要求以查表方法, 按键码转向对应的处理子程序。参考程序如下:MOV DPTR ,# BS
19、 ;子程序入口地址表首址RL A ;键码值乘以 2 MOV R2 ,A ;暂存 A MOVC A ,A+DPTR ;取得入口地址低位PUSH A ;进栈暂存INC A MOVC A ,A+DPTR ;取得入口地址高位MOV DPH ,A POP DPL CLR A JMP A+DPTR ;转向键处理子程序BS:DB RK0L ;处理子程序入口地址表DB RK0H DB RK1L DB RK1H DB RK2L DB RK2H 键码入口地址0 RK0 1 RKl 2 RK2 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心
20、整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - 五、数据极值查找程序例 4-6 内部 RAM20H 单元开始存放 8 个无符号 8 位二进制数,找出其中的最大数。极值查找操作的主要内容是进行数值大小的比较。假定在比较过程中,以A 存放大数,与之逐个比较的另一个数放在2AH 单元中。比较结束后,把查找到的最大数送2BH 单元中。程序流程如图所示。参考程序如下:MOV R0 ,# 20H ;数据区首地址MOV R7 ,# 08H ;数据区长度MOV A ,R0 ;读第一个数DEC R7 LOOP:INC R0 MOV 2AH ,R0 ;读下一个数CJ
21、NE A ,2AH , CHK ;数值比较CHK:JNC LOOP1 ;A 值大转移MOV A ,R0 ;大数送 A LOOP1:DJNZ R7 ,LOOP ;继续MOV 2BH ,A ;极值送 2BH 单元HERE:AJMP HERE ;停止六、数据排序程序例 4-7 假定 8 个数连续存放在20H 为首地址的内部RAM 单元中,使用冒泡法进行升序排序编程。设R7 为比较次数计数器,初始值为07H。TR0 为冒泡过程中是否有数据互换的状态标志, TR0 = 0 表明无互换发生, TR0 = 1 表明有互换发生。图 4-8 极值查找程序流程图 4-8 极值查找程序流程名师资料总结 - - -精
22、品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - 第四章MCS-51 汇编语言程序设计99 参考程序:SORT:MOV R0 ,# 20H ;数据存储区首单元地址MOV R7 ,# 07H ;各次冒泡比较次数CLR TR0 ;互换标志清“ 0”LOOP:MOV A ,R0 ;取前数MOV 2BH ,A ;存前数INC R0 MOV 2AH ,R0 ;取后数CLR C SUBB A ,R0;前数减后数JC NEXT ;前数小于后数,不互换MOV R0 ,2
23、BH DEC R0 MOV R0 ,2AH ;两个数交换位置INC. R0 ;准备下一次比较冒泡法排序程序流程名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - SETB TR0 ;置互换标志NEXT :DJNZ R7 ,LOOP ;返回,进行下一次比较JB TR0 ,SORT ;返回,进行下一轮冒泡HERE:SJMP $ ;排序结束本章小结 :本章首先介绍了单片机汇编语言程序设计的基本概念,单片机汇编语言伪指令;详细的讲述了三种汇编语言程序设计的基本结构,即:顺序结构、分支结构和循环结构程序设计的步骤和方法;然后介绍了几种汇编语言程序设计实例。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -
限制150内