




已阅读5页,还剩80页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章汇编语言程序设计 1程序设计方法 2顺序程序 3分支程序 4循环程序 5子程序 6位操作程序 1 本章教学内容 1 汇编应用概述 2 简单程序设计 3 分支程序 4 循环程序 5 查表程序 6 子程序的设计及其调用 7 位操作程序 2 本章基本要求 1 掌握简单程序设计 2 掌握分支和散转程序设计 3 理解循环程序 4 掌握简单查表程序 5 掌握子程序的设计 位操作程序 5 1 2汇编语言程序设计步骤 一 分析问题 建立数学模型 二 确定算法 对待定问题求解步骤的一种描述 是指令的有限集合 算法有五个特征 有穷性 确定性 可行性 输入 输出三 制定程序流程图 表示程序结构和程序功能 四 编制源程序1 确定数据结构 合理分配存储器单元和了解I O接口地址 2 按功能设计 明确各程序之间关系 3 用注释行说明程序 生成一个ASCII码文件 扩展名为 ASM 五 对源程序进行交叉汇编得到机器代码 反汇编 分析现成产品的程序 要将二进制的机器代码语言程序翻译成汇编语言源程序 六 程序调试 通过微计算机的串行口 或并行口 把机器代码传送到用户样机 或在线仿真器 进行程序的调试和运行 5 1 3评价程序质量的标准 1 程序的执行时间 2 程序所占用的内存字节数 3 程序的逻辑性 可读性 4 程序的兼容性 可扩展性 5 程序的可靠性 5 2顺序程序程序走向只有一条路径 既无分支又无循环 例1双 字节变补程序 设数据在R4R5中 MOVA R5 取低字节CPLAADDA 1 低字节变补MOVR5 AMOVA R4 取高字节CPLAADDCA 0 高字节变补MOVR4 A org0000hsjmpstartorg30hSTART MOVA R5CPLAINCAMOVR5 AJZLOOP1MOVA R4CPLAMOVR4 ASJMPLOOP2 LOOP1 MOVA R4CPLAINCAMOVR4 ALOOP2 sjmp END 例2 数据传送和交换 将R0与R7内容互换 R4与内存20H单元内容互换 XCHR MOVA R0XCHA R7XCHA R0 R0与R7内容互换MOVA R4XCHA 20HXCHA R4 R4与20H单元内容互换 CLRCMOVA R0 取被加数低字节至AADDA R2 与加数低字节相加MOVR0 A 存和数低字节MOVA Rl 取被加数高字节至AADDCA R3 与加数高字节相加MOVRl A 存和数高字节MOVA 0ADDCA 0 加进位位MOVR2 A 存和数进位位SJMP 原地踏步 例3 两个双字节无符号数 分别存放在R1R0和R3R2中 高字节在前 低字节在后 两数相加 和数放回R2R1R0中 设被加数存放于片内RAM的21H20H 加数放于23H22H 高字节在前 低字节在后 运算结果的和存于10H21H20HSTART PUSHACC 将A进栈保护MOVR0 20H 将20H地址送R0MOVR1 22H 将22H地址值送R1MOVA R0 被加数低字节内容送AADDA R1 低字节数相加MOV R0 A 低字节数和存20H中INCR0 指向被加数高位字节 INCR1 指向加数高位字节MOVA R0 被加数高位字节送AADDCA R1 高字节数带进位相加MOV R0 A 高字节数和存21H中CLRAADDCA 00HMOV10H A 进位暂存于10H中POPACC 恢复A原内容 双字节相乘的过程如下 例5 2压缩式BCD码存放在内部RAM20H单元 分解并转换成ASCII码 高半字节存入21H 低半字节存入22H 方法一 ORG1000HMOVR0 22H 2B1TMOV R0 0H 低字节清零2B1TMOVA 20H2B1TXCHDA R01B1TORL22H 30H3B2TSWAPA 十位到低半字节1B1TORLA 30H2B1TMOV21H A2B1TSJMP 暂存END 8条指令 15个内存字节 9个机器周期 方法二 采用除10H取余数将BCD拆开ORG1000HMOVA 20H 2B1TMOVB 10H 3B2TDIVAB 1B4TORLB 30H 3B2TMOV22H B 3B2TORLA 30H 2B1TMOV21H A 2B1TSJMP END 7条指令 16个内存字节 13个机器周期 方法三 采用同 0FH 0F0H相与的方法分离高低4位 将两个BCD数分开 ORG1000HMOVA 20HANLA 0FHORLA 30HMOV22H AMOVA 20HANLA 0F0HSWAPAORLA 30HMOV21H A 9条指令 17个字节 9个机器周期 例5 4将内部RAM中的20H单元中的8位无符号二进制数转化为3位BCD码 并将结果放在FIRST 百位 和SECOND 十位 个位 两个单元中 解 将被转换数除以100 得百位 余数再除以10得十位数 最后即得个位数 FIRSTDATA22HSECONDDATA21HORG1000HHBCD MOVA 20HMOVB 100DIVABMOVFIRST A MOVA BMOVB 10 余数除十DIVAB 十位在A 个位在BSWAPA 十位交换到高半字节ORLA B 或低半字节MOVSECOND A 结果存入SECONDSJMP END 5 3分支程序由条件转移指令构成程序判断框 形成程序分支结构 5 3 1单重分支程序一个判断决策框 程序有两条出路 两种分支结构 例1求R2中补码绝对值 正数不变 负数变补 MOVA R2JNBACC 7 NEXT 为正数 CPLA 负数变补INCAMOVR2 ANEXT SJMPNEXT 结束 例5 5设内部RAM30H 31H单元存放两个无符号数 将大数存在31H 小数存于30H ORG1000HSTART CLRCMOVA 30HSUBBA 31HJCNEXT 次序符合 返回MOVA 30H 交换XCHA 31HMOV30H ANEXT NOPSJMP END 例5 6设内存单元40H存放吸入空气温度值 41H存放排出空气温度值 若40H 41H 8 则制冷正常 42H单元存放0 否则存放 FFH ORG1000HSTART MOVA 40HCLRCSUBBA 41HJCERROR 40H 41H 0SUBBA 8JCERROR 差小于8MOV42H 0SJMPEXITERROR MOV42H 0FFHEXIT SJMP END 5 3 2多重分支程序多次使用条件转移指令 形成两个以上判断框 例5 7设30H单元存放的是一元二次方程ax2 bx c 0根的判别式 b2 4ac的值 值为有符号数 有三种情况 即大于零 等于零 小于零 根据其值分别置31H为2 1 0 ORG1000HSTART MOVA 30H 值送AJNBACC 7 YES 0转YESMOV31H 0 0转TOWMOV31H 1 0有相同实根SJMPFINISHTOW MOV31H 2 有两个不同实根FINISH SJMP END 例5 8变量X存于30H单元 求函数Y存于31H单元 X 1 10 X Y 0 5 X 10 X 1 X 5 END MOVA 30HCJNEA 5 NEXT1NEXT1 JCNEXT2 X10MOVR0 0 X 10SJMPNEXT4NEXT2 MOVR0 ADECR0NEXT4 MOV31H R0SJMP 5 3 3N路分支程序 N路分支程序 根据入口R3值决定进入哪一分支 方法1 采用逐次判断法 N路分支程序 根据程序运行的结果 可以有N种选择 并能转向其中任一处理程序 分支转移序号在R3 分支程序入口地址在TAB中 MOVDPTR BRTAB 分支入口地址表首地址MOVA R3RLA 2MOVR1 AINCA 取低位地址MOVCA A DPTRPUSHA 低位地址入栈MOVA R1MOVCA A DPTR 取高位地址 并入栈PUSHARET 分支入口地址出栈送入PCTAB DWBR0RET与PUSH配对 压栈先 低 后 高 DW先 高 后 低 例11 通过堆栈操作实现分支程序转移 缺点 N较大时 运行速度慢 方法2 读分支程序相对地址表 散转指令法 在程序存储器中设置各分支程序相对地址表 用MOVCA A DPTR读分支程序相对地址表 使用散转指令转向分支入口 例5 9N 8路分支程序 设N 4 功能 根据入口条件 转向4个程序段 分别从内部RAM256B 外部RAM256B 外部RAM64KB 外部RAM4KB读数 入口条件 R3 0 1 2 3 R0 RAM低8位地址 R1 RAM高8位地址 出口条件 A中为读出数据 参考程序 MOVA R3 MOVDPTR PRGTBL DPTR散转表首址MOVCA A DPTR APRGi PRGTBLJMP A DPTR 散转PRG0 MOVA R0 内部RAM256BSJMPPRGE PRGTBL DBPRG0 PRGTBLDBPRG1 PRGTBLDBPRG2 PRGTBLDBPRG3 PRGTBL PRG1 MOVXA R0 外部RAM256B SJMPPRGEPRG2 MOVDPL R0 外部RAM64KB MOVDPH R1MOVXA DPTRSJMPPRGEPRG3 MOVA R1 外部RAM4KB读数 ANLA 0FH 屏蔽高4位ANLP2 11110000B P2高4位作它用ORLP2 A 送高4位地址MOVXA R0 取外部RAM4KB数PRGE SJMP 方法2相对地址表PRGTBL DBPRGi PRGTBL决定地址表长加分支处理程序长小于256B 方法3 跳转表 散转指令例5 10128路分支程序 功能 根据R3的值 00H 7FH 转到128个目的地址 参考程序 JMPl28 MOVA R3RLA A 2MOVDPTR PRGTBL 散转表首址JMP A DPTR 散转PRGTBL AJMPROUT00AJMPROUT01 AJMPROUT7F 128个AJMP指令占RORT00 ROUT01 注意 通过AJMP跳到各分支 限制分支程序入口RORTi必须于对应AJMP指令在同一2KB范围 例5 11256路分支程序功能 根据R3的值转移到256个目的地址 入口条件 R3 转移目的地址代号 00H FFH 出口条件 转移到相应分支处理程序入口 JMP256 MOVA R3 取N值MOVDPTR PRGTBL 指向分支地址 表首址CLRCRLCA A 2JNCLOWl28 前128个分支程序 则转移INCDPH 否则基址加256 LOWl28 MOVTEMP A 暂存分支偏移值INCA 指向地址低8位MOVCA A DPTR 读分支地址低8位PUSHACC 地址低8位入栈MOVA TEMP 恢复A 指向地址高8位MOVCA A DPTR 读分支地址高8位PUSHACC 地址高8位入栈RET 分支地址弹入PC实现转移PRGTBL DWROUT00 地址由高字节到低字节放置DWROUT01 占用512个字节 例5 12大于256路分支转移程序功能 根据入口条件转向n个分支处理程序入口条件 R7R6 转移目的地址代号 出口条件 转移到相应分支处理程序入口 程序散转表中有N条LJMP指令 每条LJMP指令占3个字节 因此要按入口条件将地址代号乘以3 用乘积的高字节加DPH 乘积的低字节送A 变址寄存器 JMPN MOVDPTR PRGTBL 指向表首址MOVA R7 取地址代号高8位MOVB 3 MULAB 3 ADDA DPH MOVDPH A 修改指针高8位MOVA R6 取地址代号低8位MOVB 3 3MULAB XCHA B 交换乘积的高低字节ADDA DPH 乘积的高字节加DPHMOVDPH AXCHA B 乘积的低字节送AJMP A DPTR 散转 PRGTBL LJMPROUT0LJMPROUT1 LJMPROUTN 5 4循环程序包含多次重复执行的程序段 循环结构使程序紧凑 5 4 1循环程序的导出 一 初始化部分循环准备工作 清结果单元 设指针 设循环控制变量初值等 二 循环体A 循环工作部分 多次重复工作 B 循环控制部分 1 修改指针和循环控制变量 2 检测循环条件 满足条件循环 否则退出 1 已知循环次数 计数器控制循环 正计数和倒计数2 循环次数未知 条件控制循环 设定特征标志控制三 结束部分 处理和保存循环结果 例5 13 在内部RAM30H 4FH连续32个单元中存放无符号数 求累加和 高位 低位存入内部RAM51H 50H ORG030HSUM MOVR7 31 循环计数器MOVR1 0H 高字节单元清零MOVA 30H 取数MOVR0 31H 加数地址指针LOOP ADDA R0 修改指针JNCNEXT 处理进位INCR1 有进位 高字节加1NEXT INCR0DJNZR7 LOOP 数据是否加完 MOV50H A 循环结束 保存结果MOV51H R1RET 5 4 2多重循环 循环体中套循环结构 执行一段循环程序 而循环程序执行的时间即为延时时间 DELAY MOVR2 data 预置计数控制常数DELAY1 DJNZR2 DELAY1RET根据R2的不同初值可实现3 513个机器周期延时 第一条单周期指令 第二条为双周期指令 例l4 软件延时 软件延时程序 用循环程序将指令重复多次执行实现 例5 16 延时 ms子程序 晶振频率 Z DELY MOVR7 100 1TDLY0 MOVR6 98H 1TNOP 1TDLY1 DJNZR6 DLY1 2T2us 98DJNZR7 DLY0 2TRET 2T时间计算 us us us ms 例5 14从外部RAMBLOCK单元开始有一无符号数据块 块长度存入LEN单元 求最大数存入MAX单元 ORG0030HBLOCKDATA0100HMAXDATA31HLENDATA30HFMAX MOVDPTR BLOCKDECLENMOVXA DPTR LOP CLRCMOVB AINCDPTRMOVXA DPTRSUBBA BJNCNXT A BMOVA B A BSJMPNXT1NXT ADDA B 恢复NXT1 DJNZLEN LOP MOVMAX ASJMP END 查找最大值程序已知采样值存放在外部RAM1000H 100FH中 试编程找出其中的最大值存入内部RAM区的20H中 ORG0000HMOVR0 10H 采样值数据区长度MOVDPTR 1000H 采样值存放首址MOV20H 00H 最大值单元初始值设为最小数LP MOVXA DPTR 取采样值CJNEA 20H CHK 数值比较SJMPLP1 相等 则转移CHK JCLP1 A值小 转移 MOV20H A A值大 则送20HLP1 INCDPTRDJNZR0 LP 继续HERE SJMPHERE 结束 注 若要寻找最小值 只要在初始化时 把可能的最大值放入最小值存放单元 比较转移用的标志位由C改NC即可 3 数据搜索程序在数据区中寻找关键字 称为数据搜索 常用方法有两种 顺序搜索 把关键字与数据区中数据逐个比较 相等者即为找到的关键字 对分搜索 数据区中数已排好序 按对分原则进行取数与关键字比较 这样搜索一次后 搜索的数据区范围缩小一半 搜索速度快 例 已知内部RAM30H开始有16个数 搜索关键字在20H中 若搜索到关键字 则在21H中记录关键字在数据区中的序号 若没有搜索到关键字 则置用户标志F0为1 ORG0030HMOVR0 30H 数据区首址MOVR1 16 数据区长度MOV20H KEY 关键字送20H单元CLRF0 清用户标志位MOV21H 01 序号置1 LP MOVA R0 取数CJNEA 20H LP1HERE SJMPHERE 找到关键字 结束LP1 INC21H 序号加1INCR0 数据区地址指针加1DJNZR1 LP 继续SETBF0 未搜索到 置位标志SJMPHERE 例16内部RAM始地址DATA数据串传送到外部RAMBUFFER首地址区域 直到发现 ASCII码为止 数据串最大长度在内存20H中 MOVR0 DATA 数据区首地址MOVDPTR BUFFER 数据区长度指针LOOP MOVA R0CJNEA 24H LOOP2 是否为 符 24H SJMPLOOP1 是 符 则结束LOOP2 MOVA R0 不是 符 则传送MOVX DPTR AINCR0 INCDPTRDJNZ20H LOOP 数据串未查完 继续LOOP1 RETDATA 数据串注 循环控制条件有两个 一个是条件循环控制 以找到ASCII码 符为循环结束条件 笫二个是计数循环结构 万一找不到ASCII码 符 由数据串最大长度作为计数循环控制 例将内存一串单字节无符号数升序排序 步骤 每次取相邻单元的两个数比较 决定是否需要交换数据位置 第一次循环 比较N 1次 第二次循环 比较N 2次 第N 1次循环 比较一次 开始 SORT MOVA N 1 N个数据排序MOVR4 A 外循环次数LOOP1 MOVA R4MOVR3 A 内循环次数MOVR0 TAB 设数据指针 LOOP2 MOVA R0 取二数MOVB AINCR0MOVA R0CJNEA B L1 比较L1 JNCUNEX A B 不交换DECR0 否则交换数据XCHA R0INCR0MOV R0 AUNEX DJNZR3 LOOP2 内循环结束 DJNZR4 LOOP1 外循环结束 5 5查表程序非线性运算 对数 指数 三角函数 微积分等 1 用DB DW把表格存于程序存贮器ROM 2 MOVCA A PC或MOVCA A DPTR指令 A PC指令 变址A 项数 变指调整值 调整值指此条指令后的PC值到表格首的地址 即两地间其他指令所占的字节数 注意 表格放在此指令后 距本指令256个字节 查表就是根据变量x 在表格中查找对应的y值 使y f x 步骤 例5 19一个十六进制数存放在HEX单元低四位 将其转换成ASCII码并送回 编程 ORG0100HHEXEQU30H HEXASC MOVA HEXANLA 00001111BADDA 3 变址调整MOVCA A PCMOVHEX A 2字节RET 1字节ASCTAB DB30H 3lH 32H 33HDB34H 35H 36H 37HDB38H 39H 41H 42HDB43H 44H 45H 46HEND 例5 21求y n n 0 1 2 3 4 9 的计算 已知n值存于30H单元 表首为TBL 用MOVCA A DPTR指令取出y存于R2R1R0 Y地址 函数表首址 n 3编程 ORG2000HTEMEQU30HCALN MOVA TEMMOVB 3MULABMOVB A MOVDPTR TABLMOVCA A DPTRMOVR0 AINCDPTRMOVA BMOVCA A DPTRMOVR1 AINCDPTRMOVA BMOVCA A DPTRMOVR2 ARETTBL DB01 00 00 01 00 00 80 28 36 MOVCA A DPTR 远程查表MOVCA A PC 近程查表设有一个巡回检测报警装置 4路输入每路设有一个最大额定值 为双字节数 控制时需根据检测的路号R2找出该路对应的最大额定值 存放于31H和32H单元中 地址机器码源程序注释ORG0000H0000EAMOVA R2 检测路号送A00012AADDA R2 R2 20002F531MOV31H A 距表首址偏移量00042408ADDA 08H 偏移量000683MOVCA A PC 读取第一字节0007C531XCHA 31H 存入31H单元00092404ADDA 04H 偏移量000B83MOVCA A PC 读取第二字节000CF532MOV32H A 存入32H单元000E22RET 000F1230DW1230H 1540H 0 路号10011154000132340DW2340H 2430H 路号2 路号300152430END 例设表中1024个元素 每个元素两个字节 则表格总长为2048个字节 按R4和R5的内容从表格中查出对应的数据元素值 送存R4和R5中 TBDP1 MOVDPTR TBL 表首送DPTRMOVA R5 查表参数低位字节送ACLRC 清CYRLCAMOVR5 A 带进位左移一位MOVA R4 将查表参数R4内容送ARLCA 带进位左移一位MOVR4 A R4与R5内容互换MOVA R5 ADDA DPL DPL 查表参数低位字节MOVDPL A 调整DPL DPHMOVA DPH DPH送AADDCA R4 DPH 查表参数高位字节MOVDPH A 相加和存DPHCLRA 清A MOVCA A DPTR 查表 读第一字节MOVR4 A 第一字节存入R4CLRA 清AINCDPTR DPTR 1MOVCA A DPTR 查表 读第二字节MOVR5 A 第二字节存入R5RETTBL DW 数据表DW 优点 1 不必重复书写同样的程序 提高编程效率 2 程序的逻辑结构简单 便于阅读 3 缩短源程序和目标程序的长度 节省了程序存储器空间 4 程序模块化 通用化 便于交流 共享 5 便于按某种功能调试 5 6子程序设计子程序 能完成某项特定功能的独立程序段 可被反复调用 1 子程序结构1 子程序入口用标号作为子程序名 2 用返回指令RET结束子程序 它具有弹出断点地址的功能 3 调用子程序的指令有LCALLSUB1和ACALLSUB1两种 主程序地址入栈和寻址子程序入口的功能 4 子程序嵌套须考虑堆栈容量 5 提供足够的调用信息 如 子程序名 子程序功能 入口参数和出口参数 子程序占用的硬件资源 子程序中调用的其他子程序名 2 参数传递 主程序与子程序信息交换约定 入口参数 调用子程序之前 需要传给子程序的参数 出口参数 子程序送回调用程序的结果参数 1 子程序无须传递参数 LCALLDELY DELY MOVR7 100 1TDLY0 MOVR6 100 1TDLY1 DJNZR6 DLY1 2T2us 100DJNZR7 DLY0 2TRET 2T 例5 24双字节求补子程序CPLD 解入口参数 R7R6 16位数出口参数 R7R6 求补后的16位数 2 用累加器和工作寄存器传递参数入口 出口参数 A及R0 R7 直接 简单 速度高 CPLD MOVA R6CPLA 求反 ADDA 1MOVR6 AMOVA R7CPLAADDCA 0MOVR7 ARET 例5 25n字节求补子程序 间址实现变字长 解入口参数 R0 求补数低字节指针 R7 n 1出口参数 R0 求补后的高字节指针 3 通过
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防火门培训知识课件
- 救援运马具项目可行性研究报告
- 企业文化建设章程的法律要素
- 地热能热泵技术-第1篇-洞察及研究
- 2025年高考政治总复习主观题必背知识复习宝典
- 纺织工艺参数优化-洞察及研究
- 部队司机安全培训课件
- 四川省资阳市雁江区保和中学2024-2025学年九年级上学期期中考试化学试卷含答案
- 期中专题复习-语篇填空训练-2025-2026学年 译林版2024 英语八年级上册 解析卷
- 河南省商丘市永城市第三初级中学2025年统编版六年级下册小升初分班考试语文试卷(无答案)
- 窑炉施工安全管理制度
- QGDW10936-2018物料主数据分类与编码规范
- 大学生劳动教育论文2000字论文
- 2025年卫生系统招聘考试医学基础知识新版真题卷(附详细解析)
- 广东省广州市2023-2024学年二年级下学期数学期末试卷(含答案)
- 有机食品连锁超市商业运营计划
- 机器学习赋能空间环境:特征识别与深度分析的创新探索
- 2025-2030年中国压裂砂行业市场现状供需分析及投资评估规划分析研究报告
- 基础公共卫生知识试题及答案
- AI赋能与素养导向:初中英语智慧课堂的融合实践研究
- 沪教版初中英语九年级上册知识点
评论
0/150
提交评论