顺序结构和汇编语言程序设计’.ppt_第1页
顺序结构和汇编语言程序设计’.ppt_第2页
顺序结构和汇编语言程序设计’.ppt_第3页
顺序结构和汇编语言程序设计’.ppt_第4页
顺序结构和汇编语言程序设计’.ppt_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

程序结构和汇编语言程序设计 顺序结构分支结构循环结构子程序结构 程序结构对于程序设计极为重要 不讲究结构的程序有如一团乱麻难以理清头绪 结构较好的程序逻辑严谨 流程清晰 对于高级语言 程序的基本结构已经包含在语言的设计考虑之内 而用汇编语言编程 程序员有必要对程序结构给予更多的关注 顺序结构 程序逐条向下执行 称为顺序结构 是最简单的程序结构 分支结构 常用的程序结构之一 有两分支结构和多分支结构 即高级语言中的CASE结构 两分支结构是基础 多分支可以通过两分支嵌套实现 条件 语句序列 条件 语句序列2 语句序列1 左边的更基本 条件满足则执行语句序列 条件不满足则跳过 循环结构 也是重要的程序结构之一 有前判循环和后判循环的区别 汇编的LOOP指令为后判循环 但JMP和条件转移指令配合可以实现前判循环 条件 循环体 循环体 条件 子程序 程序设计过程中 需要共享代码的情形十分普遍 把功用的程序段写成命名的子程序 并声明子程序的调用格式 可以方便共享 大幅度节省程序开发的成本 因此子程序是一种普遍采用的程序结构 关于子程序需要讨论以下问题 汇编语言源程序中子程序的定义方法参数传递问题子程序的递归调用子程序的嵌套定义 子程序定义 上一章 讨论伪操作时 已经介绍了子程序定义 至于子程序定义中的属性选择 如果该子程序只在局部共享 即只在同一段内被调用 可以说明为NEAR 否则应说明为FAR 子程序的参数传递问题 利用高级语言编程序时 子程序或函数原型中要声明参数表 包括参数名和参数类型 称为形式参数 子程序调用时 要根据参数表填写对应的变量或数值 称为实参 利用汇编语言编程时 子程序定义不要求说明参数表 但是 调用者只有在了解参数的类型 数目和传递方式的前提下才能正确地进行调用 因此 子程序的定义者必须以其它方式通知调用者该子程序的上述相关信息 利用汇编语言编程时 调用子程序之前 先传递参数 一般放在寄存器或堆栈中 实际上 用高级语言编程也是这样做 只不过参数传递的细节交给编译程序 高级语言为程序员提供简单 直观的参数传递方法 汇编就麻烦一些 程序员必须了解要调用的子程序有几个参数 参数的类型 哪个参数应该存入哪个寄存器 或者参数应该以什么顺序压入堆栈 哪些参数应该传值 哪些参数应该传地址等 子程序递归调用 子程序直接或间接 通过其它子程序 调用自身 称为递归调用 使用递归调用常常可以使源程序简化 但要注意 递归调用有可能导致堆栈溢出 有可能使开销恶性膨胀 可以使用递归调用的例子 子程序嵌套 子程序嵌套是指在子程序体内定义其他子程序 不同的程序设计语言对此问题用不同办法处理 C语言不允许函数嵌套 而PASCAL语言允许过程嵌套 汇编语言允许子程序嵌套定义 但建议大家不要随便使用 因为子程序嵌套使程序结构复杂化 求65535以内的奇素数 p 3 t 3 t t p t不整除p t t 2 p p 2 p 65535 输出p P为待测试的数 t为用来试除的数 对每一个p 从3开始试除 若除尽 则表明p是合数 测试下一个数 否则除数加2 继续试除 直到除数平方大于p 表明p是素数 计算组合数 贾宪三角 Pascal三角11112113311464115101051161520156117213535217118285670562881 常用的组合数计算公式 算法一程序流程 inputm n c m n output m n来自主程序 n 0orn m return1 returnc m 1 n 1 c m 1 n 主程序注意 输入的m n应该满足 0 n m 子程序c m n 算法二程序流程 inputm n c m n output 主程序注意 输入的m n应该满足 0 n m m n来自主程序 n 0 return1 returnc m n 1 m n 1 n 子程序c m n 八皇后问题 皇后的威力 解的例子 求解思路 递归 回溯 数据结构 1000000000001000000000010000010000100000000000100100000000010000 用8个字节记载各行的状态 如左图所示 另用1个字节记载各列的状态 某位是1表示对应的列已被占领 是0则表示该列空闲 程序流程 i 1 8q i j 1 直线 左上 右上 i 8 output k i 1 8q k j j 1 J 8 主程序 子程序流程 子程序从主程序接受参数i 该参数表示目前正在为第几个 行 皇后安排位置 子程序的变量j表示目前正在尝试的列 从第一列开始 依次进行直线 斜线检查 通过则为下一皇后安排 递归调用 如果已经是第八个则输出结果 检查不通过则尝试下一列 8列都试过 返回调用者 长整数运算 80 x86CPU只提供字操作 字节操作 也就是对于数据宽度超过16位 386以上可以使用32位字的指令 的整数运算 直接使用机器指令将无法完成 必须由程序员自己设法解决 解决的办法并不复杂 简而言之 无非是教会计算机运算过程中进位 另外由于人们习惯使用十进制 而计算机中自然的进位制是二进制 因此 在进行长整数运算时 经常会遇到长整数十进制 二进制互化的问题 长整数十化二将输入的ASCII数字串装化为机内二进制长整数二化十将机内二进制转化为ASCII十进数字串长整数加法计算两个长整数的和实例 大阶乘计算大数的阶乘 长整数十化二 为什么要进行转化输入的数据往往是十进制数 如果这个数要经过反复运算 最好在处理之前把它转化为二进制 这样可以使运算过程效率更高 存储空间的利用率也将提高 例如 输入数据为255时 在计算机内以ASCII码格式存放 将得到字符串 323535共三个字节 与其他数进行加法运算 需要执行三条加法指令 逐位相加 还要人工考虑进位 并进行十进制调整 化为二进制 得到ff 进行运算时只需一条指令 并且不必调整 参数传递问题这类程序比较通用 因此应该写成过程 供其他程序调用 因此需要规范程序接口 并且通知有关程序 所谓接口 就是主程序与子程序之间参数传递的方式 在这里 需要传递的参数是 待转化的十进制串和转化之后的结果串 可用于参数传递的媒介一般是堆栈和寄存器 这两者都要求参数不能太大 因此不能把串作为参数传递 一般是只传送串的地址 十化二数据结构和算法 数据结构来自调用者的十进制ASCII数字串来自调用者的二进制结果串注意 利用寄存器传送串地址 由于自然的原因 十进制串的高位数字在低地址 而二进制串的高位在高地址 算法输入的十进制数为转换为 十化二程序流程 十进制串地址d 十进制串长k二进制串地址b二进制串长m i 0 m b的串长 b 0 d i b 0 i i 1 b全串乘10 i k 数据来自调用者 为了方便操作 串长占一个字 十进串存放待转换的数 二进串存放转换结果 十进制串的最后一位处理完毕 保存二进制串长 返回调用者 二进制当前串乘以10 相当于多位数乘以一位数 需要考虑进位 还需要考虑串长的增长 十进串从高位到低位逐位处理 每次将当前位加到二进制当前串然后乘以10 注意是多字节运算 进位可能涉及许多位 二化十的数据结构和算法 来自调用者的二进制数字串来自调用者的十进制ASCII结果串注意 利用寄存器传送串地址 由于自然的原因 十进制串的高位数字在低地址 而二进制串的高位在高地址 算法二进制串表示的长整数除以10 余数作为十进制数的个位 商再除以10 余数作为十位 如此继续 直至商为0 二化十的程序流程 二进制串地址b二进制串长m十进制串地址d 十进制串长k i 0 k 十进制串长 d全串除以10余数送b i i i 1 b i 调整为ASCII 商 0 数据来自调用者 为了方便操作 串长占一个字 二进制串存放待转换的数 十进制串存放转换结果 十进制转化完毕 用k保存串长 加30h即可 二进制长整数除以10 类似于多位数除以一位数的除法 程序比较麻烦 编程时 实际用100去除 得到的余数做十进制调整 每

温馨提示

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

评论

0/150

提交评论