




已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 汇编语言程序设计,4.1 汇编语言程序设计方法 4.2 汇编语言程序的基本结构 顺序、循环、分支、子程序 4.3 常用程序设计举例 代码转换、查表、逻辑运算、极值查找等,4.1 汇编语言程序设计,程序: 计算机的一系列指令的有序集合 程序设计: 编制程序的过程 机器语言程序:目标程序 直接由机器语言(指令代码)编写的程序 汇编语言程序: 用汇编语言编写的程序,4.1 汇编语言程序设计方法 4.1.1 程序的设计步骤与方法 汇编语言程序设计的特点在于: (1) 用汇编语言进行程序设计时,对数据的存放、寄存器和工作单元的使用等要由设计者安排。而高级语言程序设计时,这些工作都由计算机软件安排,程序设计者不必考虑。 (2) 汇编语言程序设计要求设计人员必须对所使用的计算机的硬件结构有较为详细的了解。特别是对各类寄存器、端口、定时器/计数器、中断等内容要熟悉,以便在程序设计时能熟练使用。,汇编语言程序的设计步骤: (1)分析问题,抽象出描述问题的数学模型 (2)确定解决问题的算法 (3)分配存储空间及工作单元 (4)根据算法绘制流程图 (5)编写源程序 (6)汇编和调试 程序质量的判断: 程序执行时间短;占用的内存单元少;程序的逻辑性,可读性;程序的兼容性,可扩展性;程序的可靠性。,4.1.2 汇编语言源程序的编辑和汇编 汇编语言源程序的编辑 编写完成的源程序应以“.ASM”的扩展名保存,以备汇编程序调用。 汇编语言源程序的汇编 汇编语言源程序必须转换为机器码表示的目标程序,计算机才能执行,这种转换过程称为汇编。对单片机来说,有手工汇编和机器汇编两种汇编方法。鉴于现在PC机的使用非常普遍,这种交叉汇编通常都是在PC机上进行的。汇编完成后,再由PC机把生成的目标程序加载到用户样机上。由于proteus软件有单片机仿真功能,所以我们完全可以通过软件来进行单片机的仿真。,源程序编辑是在微型计算机上,借助编辑软件,编写汇编语言源程序。可供使用的编辑工具很多。 例如,在文本区编写一个源程序如下: ORG 0030 MOVX DPTR,A MOV A,#41H END 编辑结束后,存盘退出。 接下来是使用交叉汇编软件,对编辑完成的源程序进行汇编。 汇编完成后,如果没有错误则形成目标码文件,格式为: 0030 0033 F07441 首地址 末地址 目标码,4.2 汇编语言源程序的基本结构,共有四种基本结构形式: 顺序结构 循环结构 分支结构 子程序结构,4.2.1 顺序结构程序设计 顺序结构的程序是指既无循环又无分支(不产生跳转),按程序中指令书写的顺序执行的程序,又称直线程序。这种结构的程序虽然简单,但它是构成任何结构程序的基础。,例: 两个1位十进制数相加,结果存于工作寄存器R6、R4中。设两个加数分别在工作寄存器R0和R2中。 源程序清单: ORG 1000H MAIN: CLR PSW.4 ; 选定工作寄存器区 CLR PSW.3 MOV A, R0 ; 取第一个数 ADD A, R2 DA A ; 十进制调整 MOV R4, A ; 低位保存 MOV A, #0 ADDC A, #0 MOV R6, A ; 高位保存 END,例: 已知X、Y、Z分别为片内RAM 30H、31H、32H单元的内容,设XY,试编程完成下式的算术运算:S=(X-Y)*Z, 并将计算结果S存入片内RAM 34H(高字节)、35H(低字节)单元中。 由于XY,所以X-Y0,不需要借位;(X-Y)*Z的结果最多占用两个字节。实现该要求的程序流程图如图所示。,程序清单如下: ORG 0030H START: MOV A, 30H ; (A)X SUBB A, 31H ; (A)(A)-Y MOV B, 32H ; (B)Z MUL AB MOV 34H, B ; (34H)A*B的高字节 MOV 35H, A ; (35H)A*B的低字节 SJMP $ END,4.2.2 循环程序 循环程序一般由四个主要部分组成: (1) 初始化部分:设置循环过程工作单元的初始值,例如循环次数、各变量初值、和地址指针初值等。 (2) 处理部分:为反复执行的程序段,是循环程序的主体部分(简称循环体),一般用于完成主要的计算与操作、地址指针修改等。 (3) 循环控制部分:用于控制循环的执行和结束。当循环结束条件不满足时,修改控制变量,继续循环;当条件满足时停止循环。 (4) 结束部分:对循环程序的结果进行分析、处理和存放。,有先执行后判断和先判断后执行两种结构:,循环程序分为单重循环和多重循环。 若循环程序的循环体中不再包含循环程序,则称之为单重循环;如果在循环体中还有其他循环程序,即循环嵌套,这样的程序则称为多重循环(二重以上)。 在多重循环程序中,只允许外重循环嵌套内重循环程序,而不允许循环体互相交叉,另外,也不允许从循环程序的外部跳入循环程序的内部。,例: 把外部RAM 5000H50FFH单元的内容清零。 ORG 2000H START1: MOV DPTR, #5000H ; 循环初始化 MOV R0, #00H MOV A, #00H LOOP1: MOVX DPTR, A ; 循环体 INC DPTR INC R0 CJNZ R0,#00H,LOOP1 ; 循环控制 END,INC R0 - DEC R0 ?,如果改为先判断后执行?,例:将内部RAM从40H开始连续单元的数据传送到外部RAM从2000H开始的连续单元中,当所传送的数据为0FFH时,传送停止。 ORG 2000H MAIN: MOV R0,#40H ;循环初始化 MOV DPTR,#2000H LOOP: MOV A,R0 CJNE A,#0FFH,LOOP1 ;循环控制 SJMP NEXT LOOP1: MOVX DPTR,A ;循环体 INC R0 INC DPTR SJMP LOOP NEXT: SJMP $ END,例:设MCS-51单片机的时钟频率为fosc = 12 MHz,试设计延时50ms的延时程序。 延时程序所花费的时间是该程序指令的总机器周期数与机器周期的乘积。 通常,延时程序采用MOV和DJNZ指令来实现。 单循环延时程序,最大的循环次数位256,则程序段为: MOV R0, #00H ; 机器周期数为1 DJNZ R0, $ ; 机器周期数为2 若单片机晶振为12MHz,则一个机器周期为1us。 延时时间:(1+2562)1s513s。 需采用多重循环。,多重循环:在一个循环体中又包含了其它的循环程序。 这种方式是实现延时程序的常用方法。 使用多重循环时,必须注意: (1) 循环嵌套, 必须层次分明, 不允许产生内外层循环交叉。 (2) 外循环可以一层层向内循环进入, 结束时由里往外一层层退出。 (3) 内循环可以直接转入外循环, 实现一个循环由多个条件控制的循环结构方式。,MOV R1, #M ; 1 Tosc LOOP:MOV R2, #N ; 1 Tosc NOP ; 1 Tosc DJNZ R2, $ ; 2 Tosc DJNZ R1, LOOP ; 2 Tosc 内层循环的机器周期数为Tn=1+1+2*N, 总机器周期数为Tm(Tn+2)*M+1. 设N=123,M=200,则延时时间为50.001ms。,程序清单: ORG 2000H M EQU 200 N EQU 123 MOV R1,#M ; #200 LOOP: MOV R2,#N ; #123 NOP DJNZ R2,$ DJNZ R1,LOOP SJMP $ END,4.2.3 分支结构程序设计 在实际应用中,不可能所有程序都是直线运行的,相反,多数情况都需要根据不同的条件进行不同的处理,这就会使程序跳转到不同位置去执行,这种结构的程序称为分支结构程序。 MCS-51单片机中条件转移指令、比较转移指令、位转移指令等都可实现程序分支。,分支程序基本结构分为单分支和多分支两种。 多分支结构特点是:各处理模块是相互排斥的。,条件转移指令,分别为: JZ,JNZ: 累加器判零转移指令; CJNE: 比较条件转移指令; DJNZ: 减1条件转移指令; JC, JNC , JB,JNB,JBC: 位控制条件转移指令等。 散转指令:JMP A+DPTR (双字节字节),例:片外RAM 2000H、2001H单元分别存放两个数,判断这两个数是否相等,如果相等,则位地址7FH置1,否则清零。 若判断两个数相等使用比较转移指令很容易实现该题中的要求,程序流程如图所示。,程序流程图,程序如下: ORG 0100H MOV DPTR,#2000H ;地址指针指向片外2000H单元 MOVX A,DPTR ;(2000H)A MOV R0,A ;AR0 MOV DPTR,#2001H ;地址指针指向2001H单元 MOVX A,DPTR ;(2001H)A MOV 30H,R0 CJNE A,30H,NE ;若两个数不相等,则转NE SETB 7FH ;若两个数相等,则7FH单元置1 AJMP OVER ;转OVER NE: CLR 7FH ;7FH单元清零 OVER: RET,散转结构 例: 在内部RAM 20H和21H单元中有两个无符号的数,由22H中的值决定对该数完成加、减、乘或除运算(20H单元的数为被减数或被除数),运算规则及结果保存处见下表。,ORG 1000H MOV A,22H MOV B,21H RL A ;AJMP为双字节指令,乘2改变偏移量 MOV DPTR,#TAB JMP A+DPTR NOP TAB: AJMP ADDM ; 散转表 AJMP SUBM AJMP MULM AJMP DIVM ADDM: MOV A,20H ; 加法运算 ADD A,B MOV 30H,A MOV A,#0 ADDC A,#0 MOV 31H,A SJMP FINISH,SUBM: MOV A,20H ;减法运算 SUBB A,B MOV 40H,A SJMP FINISH MULM: MOV A,20H ;乘法运算 MUL AB MOV 51H,B MOV 50H,A SJMP FINISH DIVM: MOV A,20H ;除法运算 DIV AB MOV 61H,A MOV 60H,B FINISH: END,例:假定R0中存放的是采集到的被按键键值,共有128个键值(0127),根据该键值转向不同键的处理程序中去。 跳转方法: 逐个比较,类似CASE。 使用散转指令JMP A+DPTR 。 设(R0)= 0 n,对应的处理程序入口地址分别为 PROG0PROGn,且按照一定的规律排列。,ORG 2000H MOV DPTR, #TAB ; 设置处理程序入口首地址 MOV A,R0 ; R0 = 0127 RL A ; ? NEXT:JMP A+DPTR ; 转向形成的散转地址入口 TAB:AJMP PROG0 ; 直接转移地址表 AJMP PROG1 AJMP PROGn ,4.2.4 子程序设计 子程序的概念 通常把一些基本操作功能编制为程序段作为独立的子程序,以供不同程序或同一程序反复调用。在程序中需要执行这种操作的地方放置一条调用指令,当程序执行到调用指令,就转到子程序中完成规定的操作,并返回到原来的程序继续执行下去。,子程序的调用 调用子程序的指令有“ACALL”和“LCALL”, 执行调用指令时, 先将程序地址指针PC改变(“ACALL”加2, “LCALL”加3), 然后 PC值压入堆栈, 用新的地址值代替。执行返回指令(RET或RETI)时, 再将 PC值弹出。 子程序调用中,主程序应先把有关的参数存入约定的位置,子程序在执行时,可以从约定的位置取得参数,当子程序执行完,将得到的结果再存入约定的位置,返回主程序后,主程序可以从这些约定的位置上取得需要的结果,这就是参数的传递。,在编写子程序时应注意以下几点: (1) 要给每个子程序赋一个名字。 子程序的第一条指令的地址被称为子程序的地址或入口地址,该指令前的标号就是该子程序的名称,也是子程序入口地址的代号。 (2) 在子程序的末尾必须有子程序返回指令RET / RETI。 (3) 要能正确地传递参数。 首先要有入口条件,说明进入子程序时它所要处理的数据如何得到,另外,要有出口条件,即处理的结果是如何存放的。,(4) 注意保护现场和恢复现场。 注意保存主程序和子程序共同涉及的,但值不同的累加器、寄存器和单元的内容。 保护现场: PUSH, 恢复现场:POP (5) 注意子程序的通用性。 子程序中操作对象尽量采用地址或寄存器形式,而不用立即数。 主程序调用子程序的指令:“LCALL”,“ACALL”。 子程序返回指令:RET / RETI。 子程序可以嵌套,嵌套次数从理论上说是无限的,但实际上由于受堆栈深度的影响,嵌套次数是有限的。,子程序调用与返回过程示意图,例:设有a,b,c三个数(09),存于内部RAM的DataA、DataB和DataC三个单元。 编程实现: c = a2 + b2。 设DataA、DataB、DataC分别对应内部RAM的40H、41H和42H单元。,ORG 5000H DataA EQU 40H DataB EQU 41H DataC EQU 42H START: MOV A, DataA ;取第一操作数 ACALL SQR ;调用查表子程序 MOV R1,A ;a2暂存R1 MOV A,DataB ;取第二操作数 ACALL SQR ;调用查表子程序 ADD A,R1 ;Aa2b2 MOV DataC,A ; 保存结果,子程序: SQR: INC A ;偏移量调整 MOVC A, A+PC ;查平方表 RET TAB:DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 END,4.3 常用程序设计举例 4.3.1 代码转换类程序 计算机能识别和处理的仅仅是二进制数,而计算机外设(显示器、LED数码管、打印机等)常使用ASCII码和BCD码,因此,经常需要通过程序完成二进制到BCD码/ASCII码的转换。 程序设计中常采用算法处理和查表方式来实现代码转换。,1. 十六进制数与ASCII码之间的转换 例:将从30H单元开始的连续8个单元中存放的十六进制数转换成其所对应的ASCII码,并分别存放在从40H开始的16个单元中。,; 十六进制数(0F)转换成ASCII码子程序 HEXAS: CLR C SUBB A,#10 JC LOOP ADD A, #7 LOOP: ADD A, #10 ; 补偿减掉的10 ADD A, #30H RET,; 完整程序 ORG 2000H MOV R0, #30H ; 设定地址指针 MOV R1, #40H MOV R7, #8 ; 循环次数 NEXT:MOV A, R0 ; 高字节转换 SWAP A ANL A, #0FH ACALL HEXAS MOV R1, A INC R1 ; 修改存储地址指针 MOV A, R0 ; 低字节转换 ANL A, #0FH ACALL HEXAS MOV R1, A,INC R1 INC R0 DJNZ R7, NEXT NOP SJMP $ ; $表示当前PC值 HEXAS: CLR C SUBB A,#10 JC LOOP ADD A, #7 LOOP: ADD A, #10 ; 补偿减掉的10 ADD A, #30H RET END,2. 十六进制数与BCD码的转换 例. 将累加器A中0FFH范围内的二进制数转换为非压缩的BCD数(0255),并分别保存于40H、41H和42H单元(低位在前)。 非压缩的BCD码:一个字节放一位BCD码 压缩的BCD码:一个字节放两个BCD码 例: (A)0FEH255 0000 0010 0000 0101 0000 0101 应用:常用于需要数码显示的场合。 分离方法: 将A中的内容分别除以100和10。,; 子程序: HEXBCD:MOV B,#100 DIV AB ; A中为百位数 MOV 42H,A ; 保存百位 MOV A,B MOV B,#10 DIV AB ; A中为十位; B中为个位 MOV 41H,A ;保存十位 MOV 40H,B ;保存个位 RET,4.3.2 查表程序 常用于非线性修正、非线性函数转换以及代码转换等。 专用的查表指令(2条): (1) MOVC A, A+DPTR ; 远程查表, 64KB (2) MOVC A, A+PC ;近程查表,0+256B 1. 远程查表通过以下三步操作实现查表。 将所查表格的首地址送入DPTR; 将要查找的数据序号,即数据在表中的位置送入累加器A中; 执行查表指令 MOVC A,A+DPTR 进行读数并存结果存于累加器A。,(2) MOVC A, A+PC ;近程查表,0+256B 2. 近程查表也可通过以下三步操作来完成。 将要查找的数据序号,即数据在表中的位置送入累加器A中; 把从查表指令到表的首地址间的偏移量与A值相加; 执行查表指令 MOVC A,A+PC 进行读数,查表结果送累加器A。,例4.13 若累加器A中存放的是一位BCD码。通过查表将其转换成为相应的七段显示码,并存入寄存器B中。 七段数码显示管连接方式:共阳极和共阴极两种。 共阳极是低电平为有效输入, 共阴极为高电平为有效输入。,3FH,09的七段码: 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。,假设数码显示管为共阴极。,由于代码没有规律,一般采用查表完成。,若以DPTR为基址(远程查表),程序段如下: MOV A, #05H MOV DPTR, #TAB MOVC A, A+DPTR TAB: DB 3FH,06H,5BH,4FH,66H, DB 6DH,7DH,07H,7FH,6FH ,若以PC为基地址(近程查表),则程序段如下: MOV A, #05H ADD A, ? MOVC A, A+PC NOP ;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 解析卷华东师大版7年级下册期末试题【满分必刷】附答案详解
- 最短路径算法与应用试题及答案
- 押题宝典执业药师资格证之《西药学专业二》模考模拟试题附答案详解【轻巧夺冠】
- 2025年网络安全技术报告:新型网络攻击手段与防御策略
- 2025年罕见病药物研发激励政策与产业政策实施路径研究报告
- 2025年老年长期照护服务人员培训与发展报告
- 2025年数字艺术展览虚拟现实艺术作品创作与展示技术报告
- 2025至2030年中国安神补心丸行业市场发展监测及市场深度研究报告
- 基础强化自考专业(小学教育)试卷及答案(有一套)
- 2025版太阳能电池板组装与销售合同样本
- GB 46033-2025粮食仓库安全操作规程
- 化工设备基础知识培训课件
- 2025《公共基础知识》试题库(附答案)
- 2025-2026学年北师大版数学小学三年级上册(全册)教案设计及教学计划
- 医疗生产安全知识培训课件
- 2025年平凉市静宁县城镇公益性岗位人员招聘(78人)考前自测高频考点模拟试题及答案详解一套
- 2025年部编版新教材道德与法治二年级上册教学计划(含进度表)
- 2025年【秋季】小学【一年级】开笔礼校长致辞:翰墨初启 开笔破蒙
- 2025年“学宪法讲宪法”主题活动知识竞赛题库附答案
- 2025年秋八年级开学主题班会第一课课件(初二正青春拼搏向暖阳)
- 印章U盾管理办法
评论
0/150
提交评论