程序设计的基本方法.ppt_第1页
程序设计的基本方法.ppt_第2页
程序设计的基本方法.ppt_第3页
程序设计的基本方法.ppt_第4页
程序设计的基本方法.ppt_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章程序设计的基本方法 顺序 分支 循环程序和子程序的设计是汇编语言程序设计的基本内容 在此基础上还要掌握汇编语言程序设计的基本方法和技巧 包括递归子程序设计 多模块程序设计方法等 4 1概述 程序设计通常从两个方面入手 一是要认真分析问题的要求 选择好的解决方法 二是要针对选定的算法 编写高质量的程序 高质量的程序在满足设计要求 实现预定功能的基础上 还应尽可能实现以下几点 1 结构清晰 简明 易读 易调试 2 执行速度快 3 占用存储空间少 多读 多写 多上机调试各种程序 一 汇编语言程序设计的一般步骤 分析问题 合适的解题方法 根据具体问题 确定输入输出数据的格式 分配存储区并给变量命名 包括分配寄存器 绘制程序流程图 根据流程图编写程序 静态检查 上机调试 二 程序流程图常用符号 4 2顺序程序设计 例1从键盘输入0至9中任一自然数x 求其立方值 分析 可以用乘法运算 也可以用查表实现 输入数据 1位自然数 用一字节单元存放 输出数据最大为729 用一个字单元存放 存储单元分配 字节变量X存放输入的自然数 字变量XXX存放X的立方值 立方表首址为TAB 表中共10项 每项占一个字 X与其立方值的对应关系 TAB 2 X X的立方值绘制流程图 编写程序 4 3分支程序设计 在分支程序中 不同的条件往往是通过标志寄存器中条件标志的不同状态反映的 而程序的分支通过转移指令来实现 因此分支程序设计中一个重要问题是根据各标志的不同状态选用合适的转移指令 4 3 1转移指令 转移指令共计19条 分为两类无条件转移指 条件转移指令 不影响任何标志位 一 条件转移指令 18条 基本格式为 J 标号 代表一种转移条件 条件转移指令根据检测标志位的状态来判断条件 若条件为真 则转至标号处执行程序 否则顺序往下执行程序 操作 IP IP D 8位偏移量 128 127 4 3 1转移指令 一 条件转移指令 18条 1 简单条件转移指令在IBMPC中 标志CF ZF SF OF PF分别为0或1 可以表示10种状态 因而设置了10条简单条件转换指令 先执行影响标志位的指令 如算术运算 比较及位测试等指令 再执行适当的条件转移指令检测相应的标志位 根据条件实现转移 例 下列程序中X Y均为字变量 X中存放着有符号数x MOVY 1MOVAX XCMPAX 0JEEXIT1ADDAX 1000HJOOVERFLOWJNSEXIT1NEGAX EXIT1MOVY AXMOVAH 4CHINT21HOVERFLOW MOVAH 4CHINT21H 一 条件转移指令 18条 一 条件转移指令 18条 2 无符号数条件转移指令该类指令往往跟在比较指令之后 视比较对象为无符号数 设置了高于 高于或等于 低于 低于或等于4条指令 1 JA JNBE 当CF 0且ZF 0时转移 2 JAE JNB 当CF 0或ZF 1时转移 3 JB JNAE 当CF 1且ZF 0时转移 4 JBE JNA 当CF 1或ZF 1时转移 一 条件转移指令 18条 3 有符号数条件转移指令该类指令往往跟在比较指令之后 视比较对象为有符号数 设置了大于 大于或等于 小于 小于或等于4条指令 1 JG JNLE 当SF OF且ZF 0时转移 2 JGE JNL 当SF OF或ZF 1时转移 3 JL JNGE 当SF不等于OF且ZF 0时转移 4 JLE JNG 当SF不等于OF或ZF 1时转移 一 条件转移指令 18条 例1 MOVAL 40HCMPAL 50HJGL1 比较JAL1例2 分析下述代码的功能MOVSI 0L MOVWORDPRT SI 0ADDSI 2CMPSI OF000HJBEL 无条件转移指令不构成分支程序 但在分支程序中经常使用它将各分支的出口汇集到一起 特别是当条件转移指令的转移范围超过 128 127个字节时 往往要借助无条件转移指令实现 例 JLL1 L1 二 无条件转移指令 JGEL0JMPL1L0 L1 无条件转移指令分为段内直接转移 段内间接转移 段间直接转移 段间间接转移 例 直接转移 JMPNEXT间接转移 JMPWORDPTR BX JMPDWORDPTR BX 二 无条件转移指令 分析问题 合适的解题方法 根据具体问题 确定输入输出数据的格式 分配存储区并给变量命名 包括分配寄存器 绘制程序流程图 根据流程图编写程序 静态检查 上机调试 4 3 2分支程序设计举例 4 3 2分支程序设计举例 例1编写计算下面函数值的程序 x y的值均在 128 127之间 输入数据为x y 输出数据为a 4 3 2分支程序设计举例 例2从键盘输入0 9中任一自然数x 求其立方值 若输入的字符不是0 9中的某数字 显示 INPUTERROR 表明输入错误 4 3 2分支程序设计举例 选择合适的分支指令 要为每个分支安排出口 应把各分支中的公共部分尽量提到分支前或分支后的公共程序段中 使程序简短 清晰 在分支比较多时 流程图中对每个分支判断的先后次序应尽量与问题提出的先后次序一致 程序也要与流程图中各分支的先后次序一致 在调试分支程序时 要假定各种可能的输入数据 沿着每一支路逐一检查 测试程序是否正确 分支程序设计中的注意事项 4 4循环程序设计 在实际问题处理程序中 常常需要按照一定规律 多次重复执行一串语句 这类程序叫做循环程序 本节主要内容 循环程序的结构和控制方法 单重循环程序的设计 多重循环程序的设计 4 4 1循环程序的结构 4 4 1循环程序的结构 例1已知有n个元素存放在以BUF为首址的字节存储区中 试统计其中负元素的个数 存储单元及寄存器分配 BX BUF存储区地址指针 CX 循环计数器 初值为元素个数n AX 记录负元素的个数 字变量R 存放负元素的个数 保证循环正常执行和结束的条件 正确地初始化循环控制计数和初始条件 正确地检测循环条件 必须保证能达到循环结束条件 例如在循环体内有修改循环控制值的指令 4 4 2循环控制方法 一 计数控制当循环次数已知时 通常使用计数控制法 常用以下三种方式实现 循环次数n送入循环计数器 每循环一次计数器减1 直至计数器为0时结束 循环次数的负值送入循环计数器 每循环一次计数器加1 直至计数器为0时结束 先将0送循环计数器 每循环一次计数器加1 直至计数器的内容与循环次数n相等时结束 4 4 2循环控制方法 二 条件控制当循环次数无法事先确定 但它与问题中的某些条件有关 这些条件可以通过指令来测试 若测试结果满足循环条件 则继续循环 否则结束循环 MOVCL 0L ANDAX AXJZEXITSALAX 1JNCLINCCLJMPLEXIT MOVCL 0MOVBX 16L SALAX 1JNCNEXTINCCLNEXT DECBXJNZL 4 4 2循环控制方法 循环控制指令 循环控制指令的转移范围为 128 127字节 CX 0且ZF 1 CX 0且ZF 0 MOVCX 80MOVSI 1MOVAL AGAIN INCSICMPAL STRS SI LOOPNEAGAINMOVLEN SI 设 STRSDB string 例 求存放在STRS存储区中的字符串长度 4 4 2循环控制方法 4 4 3单重循环程序设计 循环体内不再包含循环结构的程序 一 循环次数已知的循环程序设计例1已知以BUF为首址的字存储区中存放着n个有符号二进制数 试编写程序 将其中大于等于0的数依次送入BUF1为首址的字存储区中 小于0的数依次送入以BUF2为首址的字存储区中 4 4 3单重循环程序设计 一 循环次数已知的循环程序设计例2顺序查表程序设有n个登记项存放在以TAB为首址的字节存储区中 每个登记项占4个字节 主目占1个字节 信息占3个字节 在字节变量A中存有一主目 现需要在表中查找与A中主目相同的登记项 若查到 则把该登记项主目的地址送入DI 信息部分依次送入DH DL CH3个8位寄存器中 且将字节变量F置1 若未查到 将F清0 4 4 3单重循环程序设计 二 最大循环次数未知的循环程序设计例3已知在以BUF为首地址的字节存储区 存放着以 作结束标志的字符串 试编写程序 在CRT上显示该字符串 并要求将小写字母以大写字母形式显示 二 最大循环次数未知的循环程序设计例4已知在以PROG为首地址的字节存储区中存放着一段汇编源程序 最后以Ctrl Z 其ASCII码为1AH 作为结束标志 试编写程序 统计 MOV 的出现次数 并将结果送入字变量NUM中 4 4 3单重循环程序设计 4 4 3单重循环程序设计 二 最大循环次数未知的循环程序设计例5已知若干个非0整数存放在以A为首址的字存储区中 末尾以0作为结束标志 现要求将其中的负数删除 而把留下的正数仍连续地重新存储在以A为首址的字存储区中 并把结束标志改为 1 试编写其程序 4 4 3单重循环程序设计 二 最大循环次数未知的循环程序设计练习试编制一个程序 产生n个斐波纳契数数列 该数列的第1 2个数分别为0 1 从第3个数开始 每一个数等于前两个数之和 提示存储空间分配 NUMDW20HFIBONADW50HDUP 0 寄存器 AX BX中存放数列中连续两个元素 CX为计数器 DI为存储数列元素的指针 4 4 4多重循环程序设计 多重循环即循环体内再套有循环 设计多重循环程序时 可以从外层循环到内层循环一层层进行 在设计外层循环时将内层循环看成一个处理粗框 然后再将粗框细化 分成置初值 工作 修改和控制四个部分 例1已知m n矩阵A的元素aij按行序存放在以BUFA为首址的字节存储区中 试编写程序 示每行元素的和Si 其中aij为8位二进制数 4 4 4多重循环程序设计 例2在以BUF为首址的字节存储区中存放有n个无符号数x1 x2 xn 现需将它们按从小到大的顺序排列在BUF存储区中 试编写程序 4 4 4多重循环程序设计 4 5子程序设计 在一个程序中 当不同的地方需要多次使用的某程序段常常单独编制一指令序列 在程序运行时 若需要完成社个给定功能 就转移到这个指令序列 待指令序列执行完后 又返回到原来位置继续执行 这个单独的指令序列就是子程序 本节主要内容 子程序的调用与返回 指令 子程序的定义格式及现场保护方法 主程序与子程序之间传递参数的方式 子程序及其调用举例 子程序设计时要考虑的主要问题 子程序的调用和返回 子程序的定义 主程序和子程序间的参数传递 如何编制子程序 4 5 1子程序的概念 一 子程序调用指令CALL 1 段内直接调用格式 CALL过程名功能 IP 入栈 目的地址EA IP2 段间直接调用格式 CALLFARPTR过程名功能 CS 入栈 目的地址段首址 CS IP 入栈 目的地址EA IP 4 5 2子程序的调用与返回 一 子程序调用指令CALL 3 段内间接调用格式 CALLWORDPTROPD功能 IP 入栈 OPD IP3 段间间接调用格式 CALLDWORDPTROPD功能 CS 入栈 OPD 2 CS IP 入栈 OPD IP 4 5 2子程序的调用与返回 二 返回指令RET 1 格式1格式 RET功能 SP IP SP CS 段内返回只执行 2 格式2格式 RETn其中n是偶数 该指令用来废除栈顶n 2个无用的参数 即执行格式1中的步骤后再执行 SP n SP 4 5 2子程序的调用与返回 一 子程序的定义格式 1 格式1子程序名PROCNEAR NEAR可省略 子程序名ENDP2 格式2子程序名PROCFAR 子程序名ENDP 4 5 3子程序的定义格式及现场保护方法 二 现场的保护与恢复 如果在子程序中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论