※ 引述《gglk (锦州挖挖)》之铭言:
: ※ 引述《gglk (锦州挖挖)》之铭言:
: : 老师,不好意思,可以麻烦再解释一次
: : PC-relative的好处(relocatable code)吗?
: : A档案说
: : we can move the code from one block of memory to another without changing
: : the target addresses
: : 并不是很懂(move 什么 code?? code 不是一直那里给你读吗?),
: : PC-relative 跟 Absolute address 不是只有“计算下一个指令在哪”的方式不同而已?
: : 算完以后还是都把PC移过去了不是嘛?
: : 谢谢您。
: 恩,老师很忙,那我把今天老师回答的打在下面,如果理解的不对,
: 麻烦老师指出来谢谢。
: 假如现在PC指到Instructuin A
: 要从Instructuin A 跳到Instructuin B有两种跳法,
: 1.一种是告诉它B的绝对位址(Absolute address),
: 2.一种是告诉他B离现在的PC多远(PC relative),
: 差别就在于当整个程式码的位置有调动
: (即A档案所谓:move the code from one block of memory to another)时,
: 若当初采的是第一种方法,我必须重新计算B的绝对位址,
: 若是第二种,B离A多远并不会因为整个程式码位置改了而有变动,
: 不用重算。
: 所以A档案说 without changing the target addresses
: 这就是relocatable code。
: 不过还是有一些地方我想再确认:
: 1.所以说,B离A多远这个资讯,他是在程式执行时会被保存起来囉?
在 assembler 组译时即可算出, 此距离编码后以 binary 型式保存, 程式执行时
会 decode, 参考当时 PC 的值, 即可得知要跳到哪里执行
: 2.所谓 整个程式码位置改变 是指“程式在跑的时候”,程式码不会固定放在那里给你读,
: 而是有可能位置变来变去这样吗? 还是说“每次打开这个程式的时候”它的被放的
: 位置都不同这样?
: 应该不会是后者因为执行完应该早就没有B离A多远的资讯了吧?可是又觉得执行时整个
: CODE会移来移去很怪...
在提供 virtual memory 的作业系统中, 一般加载的位址相同, 但不表示 loader
一定要将程式加载到相同的内存位址
: 谢谢