第6章-汇编语言程序设计.pptVIP

  1. 1、本文档共73页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第6章-汇编语言程序设计

6.3.4 子程序的设计与返回 子程序又叫过程,是程序设计中经常用到的设计方法,可使程序简化。可将输入、输出过程、特殊的处理程序等设计为子程序的形式。实现程序的模块化。 其中过程名为符合标识符定义的任意名字,实际上是子程序的入口地址;PROC为过程定义伪指令,表示过程开始, ENDP为过程结束,成对出现;NEAR/FAR是过程的属性操作符,缺省时为NEAR,当调用程序和子程序在一个程序段时,属性选择NEAR,不在同一个程序段时,应选择FAR;过程体是子程序的主体,实现完成的功能;过程体内必须有一条RET(return)返回指令,以便子程序返回主程序。汇编程序不会通过ENDP实现子程序的返回,而是通过RET。 1.子程序的结构定义 过程名 PROC [NEAR/FAR] 过程体 RET 过程名 ENDP 2 .子程序的调用与返回 子程序的调用与返回通过CALL和RET实现。当主程序需要调用子程序时,应用CALL 指令实现。CALL指令后为子程序的入口地址。将同时将断点地址压入堆栈进行保护,将子程序的入口地址赋给IP(段内)和CS(段间)。进入子程序,执行完成,则应用RET指令返回主程序,同时将保护的断点内容重复赋给IP和CS。 (1)在子程序中用到的寄存器在执行子程序之前应进行保存,执行完子程序后再恢复。 (2)堆栈的使用,进行子程序设计时,首先要设置堆栈,保证堆栈的长度;应用堆栈保存断点信息;保护主、子程序要均使用的寄存器;应用堆栈实现参数的传递;保持堆栈指针的平衡,即压入、弹出的内容必须对应等。 3.子程序的参数传递 主程序和过程之间需要进行参数的相互传递。主程序向子程序传 递的参数称为子程序的入口参数,子程序向调用它的程序传递的参数 称为子程序的出口参数。通常使用4种方法实现过程的参数传递。 (1)寄存器传送 (2)存储器传送 (3)堆栈传送 (4)地址表传送 4.子程序的嵌套与递归 (1)子程序嵌套 在一个子程序中又调用另一个子程序,称为子程序的嵌套,嵌套的层次理论上不限,但会受到堆栈容量的不限,其嵌套层数称为嵌套深度。 子程序嵌套调用时,注意正确使用CALL和RET指令,注意保护和恢复寄存器,正确使用堆栈,保证子程序正常返回。 (2)子程序递归调用 当子程序嵌套调用时,如果一个子程序调用的另一个子程序就是它自身,称为递归调用,这样的子程序称为递归子程序。递归调用需要用堆栈来传递参数。 设计递归子程序的关键是:每次调用时将入口/出口参数、寄存器内容及 所有的中间结果保存在堆栈中,并且必须保证每次调用都不破坏以前调用存放 在堆栈中的所以数据,当达到递归结束条件时,再一层层从堆栈中弹出递归调 用时保存的参数与之间结果,完成递归计算和操作。 【例6.29】主程序压入堆栈3个数100,200,300及数的个数。调用过程访问堆栈,求3个数的平均值并将其送入AX中,然后调用另一过程将其以十进制形式输出。 (1)分析:AVERAGE_N通过堆栈获取数的个数和每个数,然后将平均值送入AX中,过程OUTPUT_PROC将AX中二进制数转化为十进制数并输出。 (2)源程序见教材 6.3.5 汇编语言与高级语言的连接 1 .嵌入式混合编程 (1)格式 在C/C++程序中,嵌入汇编非常简单,即在需要的地方写上汇编指令,并在嵌入的指令前加上关键字ASM或_ _ASM即可。 格式1: asm 操作码 操作数;换行符 格式2: _ _asm操作码 操作数;换行符 格式3: _asm{汇编指令} 格式1适用于在C程序中嵌入汇编指令。 格式2和格式3适用于在Visual C++程序中嵌入汇编指令。 嵌入的汇编指令可以用分号“;”结束,也可用换行符结束。一行中可以有多个汇编语句,相互之间用分号分隔,但不能跨行书写。嵌入式汇编语句的分号不是注释的开始,要对语句注释,应使用C语言的注释,如/*…..*/。例如: ASM MOV AX,0; /*AX清0,ASM语句在C程序中可以不用分号结尾*/ ASM ADD AX,BX; /*计算AX和BX的和*/ ASM PUSH AX;PUSH BX; /*3条语句可以写在一行*/ 在C程序的函数内部,每条汇编语句都是一条可执行语句,它被编 译进入程序的代码段。在函数外部,一条汇编语句是一个外部说明, 在编译时被放在程序的数据段中,这些外部数据可以被其他程序引用 (2)嵌入汇编的编译过程 C语言程序中含有嵌入式汇编语言语句时,C编译器要完成以

文档评论(0)

zijingling + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档