欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【汇编语言与计算机系统结构笔记16】子程序设计:子程序的嵌套与递归,多个模块之间的参数传送

程序员文章站 2024-03-23 23:28:58
...

本次笔记内容:
23.子程序设计-2-1
24.子程序设计-2-2

注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库。因此,为了节省时间,我只记录老师上课强调的内容与对应ppt页码。

本节课对应幻灯片:汇编语言程序设计-循环与分支,第23页起。

上节课讲了子程序设计:

  • 子程序的定义(简化形式):子程序名字 PROC
  • 子程序调用基本指令:CALL
  • 如果是段内调用,子程序可以定义为一个进的属性,ret也是近的调用;
  • 不在一个代码段中,则是远调用,要定义为far
  • 关于子程序的保存和恢复,要放在堆栈里;
  • 子程序间的参数传递:通过寄存器、通过存储器(子程序取程序变量的名字,但是这样不能重复操作,因为主程序变量名变了,子程序就得重写)、因此使用地址表;此外,还有通过堆栈传参,最为常用,也是高级语言的习惯。

P23 子程序的嵌套与递归

【汇编语言与计算机系统结构笔记16】子程序设计:子程序的嵌套与递归,多个模块之间的参数传送

P24 以n!为例

把问题一步步化小,并且还有个回归问题。

【汇编语言与计算机系统结构笔记16】子程序设计:子程序的嵌套与递归,多个模块之间的参数传送
对于参数部分,我们压了个 result 的地址。放了个cs_ip,看样子也做了个远程调用。
【汇编语言与计算机系统结构笔记16】子程序设计:子程序的嵌套与递归,多个模块之间的参数传送
如上,在主程序中压了 result 与 n 。

然后开始调用了,call

【汇编语言与计算机系统结构笔记16】子程序设计:子程序的嵌套与递归,多个模块之间的参数传送
如上,把 0 压入时,已经压倒最深处了,此刻相当于剥洋葱剥到芯处了。

BP不压到堆栈不可以,因为没有BP没法不做嵌套返回。

【汇编语言与计算机系统结构笔记16】子程序设计:子程序的嵌套与递归,多个模块之间的参数传送
实际运行与偏移量如上。

【汇编语言与计算机系统结构笔记16】子程序设计:子程序的嵌套与递归,多个模块之间的参数传送
如上,堆栈段的显示。

P29 更简单的写法

【汇编语言与计算机系统结构笔记16】子程序设计:子程序的嵌套与递归,多个模块之间的参数传送
如上,每次返回返回到上一层的部分。

递归调用结束,要 pop 。

此外,老师还举了不少实例,但是PPT里没有,视频里也没有。还举了用高级语言的递归,其编译后是什么样的。

P32 多个模块之间的参数传送

之前涉及的,都是在一个模块中的传参。

  • 局部符号:在本模块中定义,在本模块中引用的符号。
  • 外部符号:在某一模块中定义,在另一模块中引用的符号。
PUBLIC 符号
EXTRN 符号:类型

【汇编语言与计算机系统结构笔记16】子程序设计:子程序的嵌套与递归,多个模块之间的参数传送

P33 举例

【汇编语言与计算机系统结构笔记16】子程序设计:子程序的嵌套与递归,多个模块之间的参数传送
【汇编语言与计算机系统结构笔记16】子程序设计:子程序的嵌套与递归,多个模块之间的参数传送
如上,调用了其他模块,后面的会覆盖前面的同名片段。

拓展

此外,老师还介绍了:

  • 模式
  • 可视区域
  • 一些高级语法,子程序传参,这可以帮助我们自动地压入参数(在调用子程序时)
  • 将 proc 改为 proto ,声明子程序
  • 一般把子程序声明放在头文件中
  • 一般会把定义写在调用的后面,这样可以先调用后定义
  • 使用 involve 来调用,则传参必须用堆栈来调用,并且汇编器会自动完成堆栈平衡
  • 可以用别的方式传参吗?放到内存,也像一帧一帧的,但是在内存中,同一条语句,存到了同一个位置;但是堆栈中,默认sp的位置,同一条指令的具体操作可能不同。

但是都没有资料。

相关标签: 汇编