【汇编语言与计算机系统结构笔记16】子程序设计:子程序的嵌套与递归,多个模块之间的参数传送
程序员文章站
2024-03-23 23:28:58
...
本次笔记内容:
23.子程序设计-2-1
24.子程序设计-2-2
注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库。因此,为了节省时间,我只记录老师上课强调的内容与对应ppt页码。
本节课对应幻灯片:汇编语言程序设计-循环与分支,第23页起。
上节课讲了子程序设计:
- 子程序的定义(简化形式):
子程序名字 PROC
- 子程序调用基本指令:
CALL
- 如果是段内调用,子程序可以定义为一个进的属性,
ret
也是近的调用; - 不在一个代码段中,则是远调用,要定义为
far
; - 关于子程序的保存和恢复,要放在堆栈里;
- 子程序间的参数传递:通过寄存器、通过存储器(子程序取程序变量的名字,但是这样不能重复操作,因为主程序变量名变了,子程序就得重写)、因此使用地址表;此外,还有
通过堆栈传参
,最为常用,也是高级语言的习惯。
P23 子程序的嵌套与递归
P24 以n!为例
把问题一步步化小,并且还有个回归问题。
对于参数部分,我们压了个 result
的地址。放了个cs_ip
,看样子也做了个远程调用。
如上,在主程序中压了 result 与 n 。
然后开始调用了,call
。
如上,把 0 压入时,已经压倒最深处了,此刻相当于剥洋葱剥到芯处了。
BP不压到堆栈不可以,因为没有BP没法不做嵌套返回。
实际运行与偏移量如上。
如上,堆栈段的显示。
P29 更简单的写法
如上,每次返回返回到上一层的部分。
递归调用结束,要 pop 。
此外,老师还举了不少实例,但是PPT里没有,视频里也没有。还举了用高级语言的递归,其编译后是什么样的。
P32 多个模块之间的参数传送
之前涉及的,都是在一个模块中的传参。
- 局部符号:在本模块中定义,在本模块中引用的符号。
- 外部符号:在某一模块中定义,在另一模块中引用的符号。
PUBLIC 符号
EXTRN 符号:类型
P33 举例
如上,调用了其他模块,后面的会覆盖前面的同名片段。
拓展
此外,老师还介绍了:
- 模式
- 可视区域
- 一些高级语法,子程序传参,这可以帮助我们自动地压入参数(在调用子程序时)
- 将 proc 改为 proto ,声明子程序
- 一般把子程序声明放在头文件中
- 一般会把定义写在调用的后面,这样可以先调用后定义
- 使用 involve 来调用,则传参必须用堆栈来调用,并且汇编器会自动完成堆栈平衡
- 可以用别的方式传参吗?放到内存,也像一帧一帧的,但是在内存中,同一条语句,存到了同一个位置;但是堆栈中,默认sp的位置,同一条指令的具体操作可能不同。
但是都没有资料。