微机原理34.ppt_第1页
微机原理34.ppt_第2页
微机原理34.ppt_第3页
微机原理34.ppt_第4页
微机原理34.ppt_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

本次课内容与要求 理解和掌握汇编语言递归程序的设计方法和技巧了解汇编语言与高级语言的程序接口的基本内容 一 递归程序设计 子程序嵌套 在子程序中又调用另外的子程序称为子程序嵌套 子程序嵌套层数受堆栈空间限制 只要堆栈空间允许 嵌套层数一般不限 子程序嵌套 堆栈结构可以对各级调用程序的现场有序地进行保护和恢复 子程序递归 递归调用 一个子程序自己调用自己 直接递归调用在子程序中直接调用子程序自己 间接递归调用在子程序中调用的其它子程序内再调用自己 递归调用非常适合求阶乘这样的递归类运算 过程可递归的条件 必须要有递归结束条件 后一次调用不能破坏上一次调用的参数和产生的中间结果 使用堆栈保存 堆栈中的数据帧 帧 将一次调用时所要保存的信息作为一个 帧 一 帧 信息包括入口参数 出口参数 返回地址 有关寄存器的内容和局部变量 每次调用时将帧信息压入堆栈 每次返回时则从堆栈中弹出一帧信息 PUSHBPMOVBP SPPUSHSIPUSHAXMOVAX BP 4 MOVSI BP 6 ORAX AXJEONEPUSHSIDECAXPUSHAXCALLFACTORMOVSI BP 6 MOVAX SI MULWORDPTR BP 4 JMPSHORTGO BACKONE MOVAX 1GO BACK MOV SI AXPOPAXPOPSIPOPBPRET4 第3帧 第2帧 第1帧 BP1 BP2 BP3 递归过程调用时堆栈的变化 N 2 递归过程说明 容易出错 除非有保证或要求高效率 在程序执行效率和工作完成效率二者中进行权衡选择 二 汇编语言与高级语言的程序接口 汇编语言可以和高级语言 如TurboC C BorlandC C PASCAL BASIC等 混合编程 1 进行混合编程的必要性高级语言的优点 面向问题 面向对象 功能强大方法灵活 易修改和维护低级语言的优点 擅长解决硬件的接口和驱动运行速度快 代码效率高 C语言既具有优良的高级语言特性 又具有某些低级语言的特征 如寄存器变量 位操作等 因此C语言程序和汇编语言程序能平滑衔接 它们混合编程有嵌入式和多模块混合式两种实现方法 下面以TurboC为例说明 2 汇编语句嵌入式编程 TurboC语言程序中 嵌入的汇编语句前面必须加 ASM 关键字 ASM 操作数 回车换行符 操作码是CPU指令和某些伪指令 操作数是操作码可以接受的数据 如立即数 寄存器名 存储器数 还可以是C语言程序中的常量 变量或标号 内嵌的汇编语句可以用分号 或回车换行符结束 一行中可以有多个汇编语句 相互间用分号 隔开 但不能跨行书写 对汇编语句的注释 应使用C语言的注释符 如 等 汇编语句在C程序的函数内部是条可执行语句 被编译在程序的代码段 在函数外部是一个外部说明 被编译在程序的数据段 这些数据可被其它函数引用 不同版本的C 对嵌入的汇编指令语句有不同的限制 TurboC2 0的限制是 支持8086指令集 内嵌80286指令 编译时必须在TCC命令行选择 1 否则编译程序不能识别 仅支持有限的汇编语言伪指令 如变量定义伪指令DB DW DD和外部数据说明伪指令EXTERN等 嵌入的汇编语言可以使用条件 无条件转移指令和循环指令 但只能在一个函数内部转移 转移的目标必须是C语言的标号 ASM语句不能定义标号 嵌入的一组汇编语句 可用大括号 和 把它们括起来 在左大括号 前加关键字ASM即可 在TurboC语言中可直接使用通用寄存器和段寄存器 但寄存器名字要大写 前面要加一个下划线 内嵌汇编语句的TurboC2 0程序 只能采用命令行方式执行TCC EXE来完成编译 并在命令中使用带 B 选项的编译连接 若C源程序中使用预处理语句 Progmain line 就可以不用选项 B 运行TCC EXE C编译器完成代码转换 编译 连接 代码转换 将扩展名为 C的源程序代码转换成扩展名为 ASM的汇编语言代码源程序 编译 用默认的TASM EXE将转换后的 ASM汇编语言源程序编译成 OBJ的目标文件 若在编译命令行中加入 EMASM 选项 则选用MASM EXE来汇编 连接 用TLINK把目标文件连接成 EXE的可执行文件 例 用C中嵌入汇编语句方式编程 将字符串中的首个字母转为大写 其它字母转为小写 并显示出来 INCLUDE STDIO H VOIDULOWER CHAR DVAR CHAR SVAR ASM MOVSI SVAR SVAR原串的地址指针 MOVDI DVAR DVAR新串的地址指针 CLDLODSB 取首个字母 CMPAL a 判首个字母是否小写 JBAGAIN 不是小写转C的标号AGAIN CMPAL z JAAGAIN 不是小写转C的标号AGAIN SUBAL 20H 是小写字母则转换成大写字母 STOSB 存入新串中 AGAIN ASMLODSB C定义的标号AGAIN ASMCMPAL A 判后续字母是否大写 ASMJBREPLICA 不是大写转REPLICA ASMCMPAL Z ASMJAREPLICA 不是大写转REPLICA ASMADDAL 20H 是大写字母就转换成小写字母 REPLICA ASMSTOSB 存入新串中 ASMCMPAL 0 C语言中字符串用 0 结尾 ASMJNZAGAIN main C语言主程序 charoldstr artificialINTELLIGENCE charnewstr 100 ulower newstr oldstr printf OLDSTRINGIS S N oldstr 打印原串 printf NEWSTRINGIS S N newstr 打印新串 若文件编辑后名为exame C 键入命令行 选项 I 和 L 分别指定头文件和库函数所在的目录 TCC B Iinclude Llibexame C执行后生成可执行文件exame exe 该程序运行后输出的结果是 OLDSTRINGISartificialINTELLIGENCE NEWSTRINGISArtificialintelligence 3 多模块混合编程 多种语言混合编程 各种语言的源程序分别编写 在各自的开发环境中编译成目标模块文件 obj 再将各个目标模块连接在一起 生成一个可执行文件 各个模块编写时都必须遵守共同的约定规则 汇编语言源程序若要被C语言程序调用 其所有标识符前都要加下划线 因为C语言源程序编译后 其中的函数名 变量名 过程名等标识符前面都有下划线 如果汇编语言源程序在段定义时采用C语言类型 编程时标识符前就可不加下划线 标识符区别大小写 并且只取前8个字符 为了让C语言程序有效调用 汇编语言标识符 过程名和变量名等 必须用PUBLIC语句定义 汇编语言程序和TurboC语言程序必须具有相同的存储模式 前者用 MODEL伪指令 后者用TCC命令行的选项 m 指定各自的存储模式 TurboC有6种存储模式 与汇编语言程序的前6种存储模式一致 相同的存储模式将自动产生相互兼容的调用 返回类型 段名和属性 汇编语言子程序使用段寄存器CS DS SS及BP SP时 要先入栈保护 退出时再出栈恢复 因为变址寄存器SI和DI一般作为TurboC的寄存器变量 汇编语言子程序使用时通常也要保护和恢复 C语言程序和汇编语言程序共用一个堆栈段 混合编程时汇编程序可不必设置堆栈段 连接后 汇编语言程序和C程

温馨提示

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

评论

0/150

提交评论