420 likes | 557 Views
第四章 汇编语言程序设计. 通过前面的学习,我们已经了解了单片机内部的结构, MCS-51 指令系统的寻址方式、各类指令的格式及功能。 下面我们就是要如何利用 MCS-51 的指令系统,来编写高效、充分利用其特点的程序。. § 4.1 概述. 4.1.1 程序设计语言. 目前,用于程序设计的语言基本上分为三种:. 1. 机器语言 在单片机中,用二进制代码表示的指令、数字和符号简称为机器语言。直接用机器语言编写的程序称为机器语言程序。 缺点:程序不易看懂,不便于记忆,容易出错。. 程序设计语言. 2. 汇编语言
E N D
第四章汇编语言程序设计 通过前面的学习,我们已经了解了单片机内部的结构,MCS-51指令系统的寻址方式、各类指令的格式及功能。 下面我们就是要如何利用MCS-51的指令系统,来编写高效、充分利用其特点的程序。
§4.1 概述 4.1.1 程序设计语言 目前,用于程序设计的语言基本上分为三种: 1. 机器语言 在单片机中,用二进制代码表示的指令、数字和符号简称为机器语言。直接用机器语言编写的程序称为机器语言程序。 缺点:程序不易看懂,不便于记忆,容易出错。
程序设计语言 • 2. 汇编语言 • 用助记符表示的指令称为符号语言或汇编语言。 • 汇编语言程序(源程序)需要“汇编”(由专门的汇编程序完成)才能转换成机器语言。得到的机器语言程序称为目标程序。 • 特点: • 是面向机器的语言,必须对硬件有一定的了解。 • 助记符指令和机器指令一一对应。 • 能直接管理和控制硬件设备(功能部件)。
3. 高级语言 • 高级语言不受具体机器的限制,都是参照一些数学语言而设计的,使用了许多数学公式和数学计算上的习惯用语,非常擅长于科学计算。 • 常用的高级语言,如BASIC、FORTRAN、C语言等。 • 特点: • 通用性强,直观、易懂、易学、可读性好。 • 计算机不能直接识别和执行。(需要进行编译) • 发展很快。
4.1.2 编制程序的步骤 1.任务分析(硬件、软件系统分析) 2.确定算法和工作步骤; 3.程序总体设计和流程图绘制 关于流程图符号: 开始、结束----圆角矩形 工作任务----矩形 判断分支----菱形 程序流向---- 程序连接---- 结束 开始
4.1.2 编制程序的步骤 4. 分配内存,确定程序与数据区存放地址; 5. 编写源程序; 6. 调试、修改,最终确定程序。
4.1.3 方法技巧 • 模块化设计(按功能分:显示、打印、输 • 入、发送等) • 2. 尽量采用循环及子程序结构(节省内存)
4.1.4 汇编语言的规范 • 汇编语言源程序由以下两种指令构成: • 汇编语句(指令语句) • 伪指令(指示性语句) • 汇编语句的格式: • 标号: 操作码 操作数 ;注释 • 数据表示形式: • 二进制(B)、十六进制(H)、十进制(D或省略)、 • ASCII码(以单引号标识)
伪指令 控制汇编用的特殊指令,这些指令不属于指令系统,不产生机器代码。 通过使用伪指令向汇编程序发出指示信息,告诉它如何完成汇编工作。 伪指令具有控制汇编程序的输入输出、定义数据和符号、条件汇编、分配存储空间等功能。
常用的伪指令 • ORG(Origin) • 定位目的程序的起始地址。 • 格式: ORG 表达式 • 如:ORG 0000H • 注:表达式必须为16位地址值。 • END 汇编语言程序结束伪指令。 注:一定放在程序末尾!
常用的伪指令 • EQU (EQUate) • 赋值伪指令。 • 格式:字符名称EQU数值或汇编符号 • 例: AA EQU 30H • K1 EQU 40H • MOV A,AA ; (30H)→A • MOV A,K1 ;(40H)→A
常用的伪指令 • DB(DefineByte) • 从指定单元开始定义(存储)若干个字节的数据或ASCII码字符,常用于定义数据常数表。 • 格式:DB 字节常数或ASCII字符 • 例: ORG 1000H • DB 34H,0DEH,“A”,“B” • DB 0AH,0BH,20
常用的伪指令 • DW(DefineWord) • 从指定单元开始定义(存储)若干个字的数据 • 或ASCII码字符。 • 格式:DW 字常数或ASCII字符 • 例: ORG 2000H • DW 1234H,“B” • DW 0AH,20 • 思考: (2000H)及其以后的地址单元中的内容是多少?
常用的伪指令 • BIT • 位地址符号指令。 • 把位地址赋于规定的字符名称。 • 格式:字符名称BIT位地址 • 例: ABC BIT P1.1 • QQ BIT P3.2
§4.2 汇编语言程序编辑和汇编 1. 编辑(源程序,以.ASM扩展名存盘); 2. 汇编(手工或机器汇编); 如:MOV A,#88H;机器码74 88 又如: 地址 目标码 源程序 ORG 1000H 1000H 74 7F MOV A,#7FH 1002H 79 44 MOV R1,#44H END
§4.3 程序设计基础与举例 4.3.1 顺序结构程序 例1:变量存在内部RAM的20H单元中,其取值范围:0~5,编成,查表法求其平方值 org 1000h start:mov dptr,#2000h mov a,20h movc a,@a+dptr mov 21h,a sjmp $ org 2000h table:db 0,1,4,9,16,25 end
开始 表格首地址送DPTR 变量送A(20H) A 查平方表(A+DPTR) A 结果送21H单元:A 21H 结束
内部RAM 22H 21H 6 9 20H 例2:将20H单元的压缩(Packed )BCD码拆成两个ACSII码存入21H、22H单元。 3 6 3 9 BCD 0 1 2 ... 9 ASCII 30H 31H 32H ... 39H
方法1 开始 (20H)A 10HB A/B,A中为高4位BCD码, B中为低4位BCD码 B+30HB B(21H) A+30HA A(22H) 结束
周期数 源程序 • ORG 2000H • MOV A,20H • MOV B,#10H • DIV AB • ORL B,#30H • MOV 21H,B • ORL A,#30H • MOV 22H,A • END 1 2 4 2 2 1 1 13 ;除以10H ;高4位BCD码转换位ASCII码 ;低4位BCD码转换位ASCII码
方法2: 开始 0 (21H) (20H)A A与(21H)的低4位交换 (21H)+30H(21H) A的高低半字节交换 A+30HA A(22H) 结束
周期数 源程序 ORG 2000H MOV R0,#21H MOV @R0,#0 MOV A,20H XCHD A,@R0 ORL 21H,#30H SWAP A ORL A,#30H MOV 22H,A END 1 1 1 1 2 1 1 1 9 ;清21H单元 ;低4位BCD码送21H单元, ;低4位BCD码转换位ASCII码 ;高4位BCD码转换位ASCII码
Y 条件成立? 条件成立? N Y N 程序段A 程序段A 程序段A 下条指令 单分支结构 双分支结构 4.3.2 分支程序 分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)
0 K=? n 1 程序段n 程序段1 程序段0 多分支结构 4.3.2 分支程序 分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)
例1:设变量x以补码形式存放在片内RAM 30H单元中,变量y与x的关系是: 编程根据x的值求y值并放回原单元。
开始 取x 即(30h) A A=? <0 >0 0 y=x+5 y=x y=20H 存y 即y 20h 结束
ORG 1000H START:MOV A,30H JZ NEXT ;x=0,转移 ANL A,#80H ;保留符号位 JZ ED ;x>0,转移 MOV A,#05H ;x<0,不转移 ADD A,30H MOV 30H,A SJMP ED NEXT:MOV 30H,#20H ED:SJMP $
TAB P0高位 P0低位 TAB+2 P1高位 P1低位 例2:根据R7的内容,转至对应的分支程序。设R7的内容为0~N,对应的处理程序地址分别为P0~P7 • START:MOV DPTR,#TAB • MOV A,R7 • ADD A,R7 ;R7×2A • MOV R3,A ; 暂存R3 • MOVC A,@A+DPTR ;取高位地址 • XCHA ,R3 • INC A • MOVC A,@A+DPTR ;取低位地址 • MOV DPL,A • MOV DPH,R3 ;转移地址送入DPTR • CLR A • JMP @A+DPTR • TAB: DW P0 • DW P1 • … • DW PN
4.3.3 循环程序 • 循环程序一般由: • 初始化部分 • 循环体部分--处理部分、修改部分、控制部分 • 结束部分 • 其结构一般有两种: • 先进入处理部分,再控制循环 • 至少执行一次循环体 • 先控制循环,再进入处理部分 • 循环体是否执行,取决于判断结果。
开始 设置循环初值 循环处理 循环修改 循环结束? 结束处理 结束 开始 设置循环初值 Y 循环结束? N 循环处理 N 循环修改 Y 结束处理 结束
循环控制的一般方法: • 循环次数已知 • 利用循环次数控制 • 循环次数未知 • 利用关键字控制 • 利用“逻辑尺” • 根据“逻辑尺”的内容,进行控制。
例4-3-6 : 50ms延时子程序。设晶振频率为12MHz,则机器周期为1us。 DEL: MOV R7,#200 ;1MC DEL1:MOV R6,#123 ;1MC NOP ;1MC DJNZ R6,$ ;2MC DJNZ R7,DEL1 ;2MC RET ;2MC 延时时间:t=1+200[(1+1+2*123)+2]+2 ≈50000us=50ms
例4-3-8:将内部RAM中起始地址为data的数据串串送到外部RAM中起始地址为buffer的存储区域中,直到发现‘$’字符,传送停止----循环次数事先不知道先判断,后执行。例4-3-8:将内部RAM中起始地址为data的数据串串送到外部RAM中起始地址为buffer的存储区域中,直到发现‘$’字符,传送停止----循环次数事先不知道先判断,后执行。 MOV R0,#data MOV DPTR,#buffer LOOP1:MOV A,@R0 CJNE A,#24H,LOOP2 ;判断是否为$字符 SJMP LOOP3 ;是,转结束 LOOP2:MOVX @DPTR,A ;不是,传送数据 INC R0 INC DPTR SJMP LOOP1 ;传送下一数据 LOOP3:END
4.3.4 子程序问题 子程序设计时注意事项: 1. 给子程序赋一个名字。实际为入口地址代号。 2. 要能正确传递参数: 入口条件:子程序中要处理的数据如何给予。 出口条件:子程序处理结果如何存放。 (寄存器、存储器、堆栈方式) 3. 保护与恢复现场: 保护现场:压栈指令PUSH 恢复现场:弹出指令POP 4. 子程序可以嵌套
例4-3-9 :利用查表法求平方和 ,设a、b、c分别存于内部RAM的DA、DB、DC三个单元中。 MOV A,DA ;取a ACALL SQR ;调用查表子程序 MOV R1,A ;a的平方暂存R1中 MOV A,DB;取b ACALL SQR ;调用查表子程序 ADD A,R1 ;求出平方和暂存阿A中 MOV DC,A ;结果存于DC 中 SJMP $ SQR:MOV DPTR,#TAB ;子程序 MOVC A,@A+DPTR RET TAB: DB 0,1,4,9,16,25,36,49,64,81 END 利用累加器或寄存器传递参数
4.3.5 码型转换程序的设计 一、十六进制数与ASCCII码之间的转换 (对比BCD与ASCCI之间的转换—4.3.1中例2) 表4-1 十六进制数与ASCII码之间的关系
例4-3-15 将一位十六进制数转换成ASCII码,设十六进制数存放在R0中,转换后的ASCII码放在R2中。 HTASC: MOV A, R0 ;取十六进制数 PUSH ACC ;保护 CLR C ; SUBB A,#0AH ;判断是否大于十 POP ACC; JC LOOP ;小于十,直接加30H ADD A,#07H ;大于十,加37H LOOP:ADD A,#30H MOV R2,A RET
例4-3-16 将多位十六进制数转换成ASCII码,设R0指向十六进制数低位, R2存放字节数,转换后R1指向ASCII码高位。 HTASC: MOV A,@R0 ;取十六进制数 ANL A,#0FH ;取低四位 ADD A,#15 ;偏移修正 MOVC A,@A+PC ;查表得ASCII码 MOV @R1,A ;保存 INC R1 MOV A,@R0 ;取十六进制数高四位 SWAP A ; ANL A,#0F0H ADD A,#06H ;偏移修正 MOVC A,@A+PC ;查表 MOV @R1,A ;保存 INC R0 ;指向下一单元 INC R1 DJNZ R2,HTASC RET ASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H
二、BCD码与二进制数之间的转换 (对比BCD与ASCCI之间的转换—4.3.1中例2) 例4-3-17:双字节数R2R3转换成压缩BCD码存在 R4R5R6中。由十进制数与二进制数之间的关系可知:十进制数D与n位二进制数的关系克表示为 D=bn-1×2n-1+bn-2×2n-2+...+b1×2+b0 ={...{[(bn-1×2+bn-2)×2]+bn-3}...+b1}×2+b0 部分和存在R4R5R6中,其中bi每次移入Cy中
DCDTH: CLR A ; MOV R4,A ;R4清零 MOV R5,A ;R4清零 MOV R6,A ;R6清零 MOV R7,#16 ;循环初值 LOOP: CLR C MOV A, R3 ; R2R3左移一位,并送回 RLC A ; (即将bi每次移入Cy中) MOV R3,A ; MOV A,R2 ; RLC A ; MOV R2,A ; MOV A,R6 ; R4R5R6×2+ bi并调整送回 ADDC A,R6 DA A ; MOV A,R5 ; ADDC A,R5 ; DA A ;
MOV A,R4 ; ADDC A,R4 DA A ; MOV R4,A ; DJNZ R7,LOOP ; END