参数传递
传地址
得结果
传值
传名
函数中怎么确定那个是局部变量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表中的内容
过程调用和过程返回