※ 引述《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
一定要將程式載入到相同的記憶體位址
: 謝謝