编译原理——运行时存储空间组织

参数传递

在这里插入图片描述
在这里插入图片描述

传地址

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

得结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

传值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

传名

在这里插入图片描述
函数中怎么确定那个是局部变量A,那个是全局变量A那?
方法就是会把局部变量A替换个名字比如说TA来进行区别
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

目标程序运行时的活动

在这里插入图片描述
在这里插入图片描述
比如 c/c++ 动态申请的内存必须显示释放,比如用 free
但对于java来说,通过new得到的内存,程序员无需显示释放,java有个垃圾收集程序,会自动帮你释放

在这里插入图片描述
在这里插入图片描述

运行时的存储组织

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里假设返回地址是1byte
在这里插入图片描述
上图的T就是临时变量, DA是数据区的编号
这个局部数据区是在将来运行子程序时分配给子程序的,不是在编译时分给子程序的,但是编译程序知道分配给子程序的数据区的格局,按照这个格局,在编译的时候,确定每个名字的地址

动态存储管理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
内存栈就是随着活动的进行在栈顶建立活动记录,随着活动的结束而撤销所建立的活动记录

非嵌套过程语言存储管理

在这里插入图片描述
sp是指向活动记录起点的指针或寄存器,top是指向记录终点
老sp是调用当前活动的活动记录的那个起始地址
在这里插入图片描述
栈顶始终是当前执行的活动的栈指针
建立好活动记录后再进行活动的执行
下图是 main调用了 Q , Q调用了R, R又调用了 Q
在这里插入图片描述
前n个指令 par 是传递参数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

嵌套过程语言的动态处理

在这里插入图片描述
在这里插入图片描述

静态链方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
老SP为0表示主程序没有调用者
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面是可以的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Display方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上图这个是R的display表,display表放在活动记录中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(d+k) [sp] 是 sp+d + k 先找到display表然后取出其中第k层的活动记录放到R1中
dx [R1] 就是 R1+dx 把R1中存储的第k层的活动记录中的第dx项取出来送入R2中
在这里插入图片描述
在这里插入图片描述
主程序没有外层就没有全局display单元,然后主程序的display表中只有一项就是自己起始位置也就是0
全局display就是调用者的display表在内存中的位置,注意是调用者!!!

标红的是表示display表中的内容
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

过程调用和过程返回

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新城里的旧少年^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值