




已阅读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软件有单片机仿真功能 所以我们完全可以通过软件来进行单片机的仿真 源程序编辑是在微型计算机上 借助编辑软件 编写汇编语言源程序 可供使用的编辑工具很多 例如 在文本区编写一个源程序如下 ORG0030MOVX DPTR AMOVA 41HEND编辑结束后 存盘退出 接下来是使用交叉汇编软件 对编辑完成的源程序进行汇编 汇编完成后 如果没有错误则形成目标码文件 格式为 00300033F07441首地址末地址目标码 4 2汇编语言源程序的基本结构 共有四种基本结构形式 顺序结构循环结构分支结构子程序结构 4 2 1顺序结构程序设计顺序结构的程序是指既无循环又无分支 不产生跳转 按程序中指令书写的顺序执行的程序 又称直线程序 这种结构的程序虽然简单 但它是构成任何结构程序的基础 例 两个1位十进制数相加 结果存于工作寄存器R6 R4中 设两个加数分别在工作寄存器R0和R2中 源程序清单 ORG1000HMAIN CLRPSW 4 选定工作寄存器区CLRPSW 3MOVA R0 取第一个数ADDA R2DAA 十进制调整MOVR4 A 低位保存MOVA 0ADDCA 0MOVR6 A 高位保存END 例 已知X Y Z分别为片内RAM30H 31H 32H单元的内容 设X Y 试编程完成下式的算术运算 S X Y Z 并将计算结果S存入片内RAM34H 高字节 35H 低字节 单元中 由于X Y 所以X Y 0 不需要借位 X Y Z的结果最多占用两个字节 实现该要求的程序流程图如图所示 程序清单如下 ORG0030HSTART MOVA 30H A XSUBBA 31H A A YMOVB 32H B ZMULABMOV34H B 34H A B的高字节MOV35H A 35H A B的低字节SJMP END 4 2 2循环程序循环程序一般由四个主要部分组成 1 初始化部分 设置循环过程工作单元的初始值 例如循环次数 各变量初值 和地址指针初值等 2 处理部分 为反复执行的程序段 是循环程序的主体部分 简称循环体 一般用于完成主要的计算与操作 地址指针修改等 3 循环控制部分 用于控制循环的执行和结束 当循环结束条件不满足时 修改控制变量 继续循环 当条件满足时停止循环 4 结束部分 对循环程序的结果进行分析 处理和存放 有先执行后判断和先判断后执行两种结构 循环程序分为单重循环和多重循环 若循环程序的循环体中不再包含循环程序 则称之为单重循环 如果在循环体中还有其他循环程序 即循环嵌套 这样的程序则称为多重循环 二重以上 在多重循环程序中 只允许外重循环嵌套内重循环程序 而不允许循环体互相交叉 另外 也不允许从循环程序的外部跳入循环程序的内部 例 把外部RAM5000H 50FFH单元的内容清零 ORG2000HSTART1 MOVDPTR 5000H 循环初始化MOVR0 00HMOVA 00HLOOP1 MOVX DPTR A 循环体INCDPTRINCR0CJNZR0 00H LOOP1 循环控制END INCR0 DECR0 如果改为先判断后执行 例 将内部RAM从40H开始连续单元的数据传送到外部RAM从2000H开始的连续单元中 当所传送的数据为0FFH时 传送停止 ORG2000HMAIN MOVR0 40H 循环初始化MOVDPTR 2000HLOOP MOVA R0CJNEA 0FFH LOOP1 循环控制SJMPNEXTLOOP1 MOVX DPTR A 循环体INCR0INCDPTRSJMPLOOPNEXT SJMP END 例 设MCS 51单片机的时钟频率为fosc 12MHz 试设计延时50ms的延时程序 延时程序所花费的时间是该程序指令的总机器周期数与机器周期的乘积 通常 延时程序采用MOV和DJNZ指令来实现 单循环延时程序 最大的循环次数位256 则程序段为 MOVR0 00H 机器周期数为1DJNZR0 机器周期数为2若单片机晶振为12MHz 则一个机器周期为1us 延时时间 1 256 2 1 s 513 s 需采用多重循环 多重循环 在一个循环体中又包含了其它的循环程序 这种方式是实现延时程序的常用方法 使用多重循环时 必须注意 1 循环嵌套 必须层次分明 不允许产生内外层循环交叉 2 外循环可以一层层向内循环进入 结束时由里往外一层层退出 3 内循环可以直接转入外循环 实现一个循环由多个条件控制的循环结构方式 MOVR1 M 1ToscLOOP MOVR2 N 1ToscNOP 1ToscDJNZR2 2ToscDJNZR1 LOOP 2Tosc内层循环的机器周期数为Tn 1 1 2 N 总机器周期数为Tm Tn 2 M 1 设N 123 M 200 则延时时间为50 001ms 程序清单 ORG2000HMEQU200NEQU123MOVR1 M 200LOOP MOVR2 N 123NOPDJNZR2 DJNZR1 LOOPSJMP END 4 2 3分支结构程序设计在实际应用中 不可能所有程序都是直线运行的 相反 多数情况都需要根据不同的条件进行不同的处理 这就会使程序跳转到不同位置去执行 这种结构的程序称为分支结构程序 MCS 51单片机中条件转移指令 比较转移指令 位转移指令等都可实现程序分支 分支程序基本结构分为单分支和多分支两种 多分支结构特点是 各处理模块是相互排斥的 条件转移指令 分别为 JZ JNZ 累加器判零转移指令 CJNE 比较条件转移指令 DJNZ 减1条件转移指令 JC JNC JB JNB JBC 位控制条件转移指令等 散转指令 JMP A DPTR 双字节字节 例 片外RAM2000H 2001H单元分别存放两个数 判断这两个数是否相等 如果相等 则位地址7FH置1 否则清零 若判断两个数相等使用比较转移指令很容易实现该题中的要求 程序流程如图所示 程序流程图 程序如下 ORG0100HMOVDPTR 2000H 地址指针指向片外2000H单元MOVXA DPTR 2000H AMOVR0 A A R0MOVDPTR 2001H 地址指针指向2001H单元MOVXA DPTR 2001H AMOV30H R0CJNEA 30H NE 若两个数不相等 则转NESETB7FH 若两个数相等 则7FH单元置1AJMPOVER 转OVERNE CLR7FH 7FH单元清零OVER RET 散转结构例 在内部RAM20H和21H单元中有两个无符号的数 由22H中的值决定对该数完成加 减 乘或除运算 20H单元的数为被减数或被除数 运算规则及结果保存处见下表 ORG1000HMOVA 22HMOVB 21HRLA AJMP为双字节指令 乘2改变偏移量MOVDPTR TABJMP A DPTRNOPTAB AJMPADDM 散转表AJMPSUBMAJMPMULMAJMPDIVMADDM MOVA 20H 加法运算ADDA BMOV30H AMOVA 0ADDCA 0MOV31H ASJMPFINISH SUBM MOVA 20H 减法运算SUBBA BMOV40H ASJMPFINISHMULM MOVA 20H 乘法运算MULABMOV51H BMOV50H ASJMPFINISHDIVM MOVA 20H 除法运算DIVABMOV61H AMOV60H BFINISH END 例 假定R0中存放的是采集到的被按键键值 共有128个键值 0 127 根据该键值转向不同键的处理程序中去 跳转方法 逐个比较 类似CASE 使用散转指令JMP A DPTR 设 R0 0 n 对应的处理程序入口地址分别为PROG0 PROGn 且按照一定的规律排列 ORG2000HMOVDPTR TAB 设置处理程序入口首地址MOVA R0 R0 0 127RLA NEXT JMP A DPTR 转向形成的散转地址入口TAB AJMPPROG0 直接转移地址表AJMPPROG1 AJMPPROGn 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三个数 0 9 存于内部RAM的DataA DataB和DataC三个单元 编程实现 c a2 b2 设DataA DataB DataC分别对应内部RAM的40H 41H和42H单元 ORG5000HDataAEQU40HDataBEQU41HDataCEQU42HSTART MOVA DataA 取第一操作数ACALLSQR 调用查表子程序MOVR1 A a2暂存R1MOVA DataB 取第二操作数ACALLSQR 调用查表子程序ADDA R1 A a2 b2MOVDataC A 保存结果 子程序 SQR INCA 偏移量调整MOVCA A PC 查平方表RETTAB DB0 1 4 9 16 25 36 49 64 81END 4 3常用程序设计举例4 3 1代码转换类程序计算机能识别和处理的仅仅是二进制数 而计算机外设 显示器 LED数码管 打印机等 常使用ASCII码和BCD码 因此 经常需要通过程序完成二进制到BCD码 ASCII码的转换 程序设计中常采用算法处理和查表方式来实现代码转换 1 十六进制数与ASCII码之间的转换例 将从30H单元开始的连续8个单元中存放的十六进制数转换成其所对应的ASCII码 并分别存放在从40H开始的16个单元中 十六进制数 0 F 转换成ASCII码子程序HEXAS CLRCSUBBA 10JCLOOPADDA 7LOOP ADDA 10 补偿减掉的10ADDA 30HRET 完整程序ORG2000HMOVR0 30H 设定地址指针MOVR1 40HMOVR7 8 循环次数NEXT MOVA R0 高字节转换SWAPAANLA 0FHACALLHEXASMOV R1 AINCR1 修改存储地址指针MOVA R0 低字节转换ANLA 0FHACALLHEXASMOV R1 A INCR1INCR0DJNZR7 NEXTNOPSJMP 表示当前PC值HEXAS CLRCSUBBA 10JCLOOPADDA 7LOOP ADDA 10 补偿减掉的10ADDA 30HRETEND 2 十六进制数与BCD码的转换例 将累加器A中0 FFH范围内的二进制数转换为非压缩的BCD数 0 255 并分别保存于40H 41H和42H单元 低位在前 非压缩的BCD码 一个字节放一位BCD码压缩的BCD码 一个字节放两个BCD码例 A 0FEH 255 000000100000010100000101应用 常用于需要数码显示的场合 分离方法 将A中的内容分别除以100和10 子程序 HEXBCD MOVB 100DIVAB A中为百位数MOV42H A 保存百位MOVA BMOVB 10DIVAB A中为十位 B中为个位MOV41H A 保存十位MOV40H B 保存个位RET 4 3 2查表程序常用于非线性修正 非线性函数转换以及代码转换等 专用的查表指令 2条 1 MOVCA A DPTR 远程查表 64KB 2 MOVCA A PC 近程查表 0 256B1 远程查表通过以下三步操作实现查表 将所查表格的首地址送入DPTR 将要查找的数据序号 即数据在表中的位置送入累加器A中 执行查表指令MOVCA A DPTR进行读数并存结果存于累加器A 2 MOVCA A PC 近程查表 0 256B2 近程查表也可通过以下三步操作来完成 将要查找的数据序号 即数据在表中的位置送入累加器A中 把从查表指令到表的首地址间的偏移量与A值相加 执行查表指令MOVCA A PC进行读数 查表结果送累加器A 例4 13若累加器A中存放的是一位BCD码 通过查表将其转换成为相应的七段显示码 并存入寄存器B中 七段数码显示管连接方式 共阳极和共阴极两种 共阳极是低电平为有效输入 共阴极为高电平为有效输入 3FH 0 9的七段码 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH 假设数码显示管为共阴极 由于代码没有规律 一般采用查表完成 若以DPTR为基址 远程查表 程序段如下 MOVA 05HMOVDPTR TABMOVCA A DPTR TAB DB3FH 06H 5BH 4FH 66H DB6DH 7DH 07H 7FH 6FH 若以PC为基地址 近程查表 则程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 拆迁建筑工程居间与政府沟通协议
- 商业场地移交协议书范本
- 财务共享服务中心财务报告编制与审核合同
- 生态型仓库租赁及绿色物流解决方案合同
- 餐饮企业店长职位竞聘与员工激励机制合同
- 医疗卫生机构医护工作服采购及消毒管理协议
- 大堂经理服务工作总结
- 社保服务礼仪培训
- 不符合项整改之5Why分析法讲解
- 培训学校活动方案
- 小学数学单元整体教学问题与对策
- 2025芜湖市鸠江区裕溪口街道社区工作者考试真题
- 2025年广东省深圳市龙华区中考数学二模试卷
- 熊胆粉初稿完整版本
- 坚守廉洁底线弘扬清风正气
- 小区物业管理计划书:范文
- 公司法务部职责与职能
- 泉州市石狮市2024-2025学年六年级下学期小升初数学考前押题卷含解析
- 物流仓储设备选型与配置规范
- 水电工程验收单
- 2025年广东省高中历史学业水平考试综合测评(一)历史试题(原卷版+解析版)
评论
0/150
提交评论