關於 Mr.K 的第四封來信

On Thu, 13 Jan 2011 23:32:25 +0800, Mr.K wrote

陳老師您好:
請問
P3-14
範例 3.13 看不太懂所要表達的意思
似乎也沒此用到X陣列 感覺不出修正後版本使用PC相對位址的好處

宣告 X 的目的僅僅只是為了讓 指令 LD R1, B (PC 的值) 與變數 B 之間的距離超過 32767,以突顯出定址範圍會不夠的問題,因為 address(B) - PC > 100000,如此就無法用相對於 PC 的定址法了,只好改用相對於 R9 的定址法。

但是在該範例中,X 確實沒有用到,這或許是範例設計的不夠好,我會再想想。

P5-8
範例5.5
例如:T0004 LD R2,TOP => T(002F0000), M(T,0004,top,pc) 這個修改紀錄中的addr為0004 不是紀錄為pc+4(0008)?
而之後連結時T002F0000就會變成P5-17圖5.12中的00200000 所以只有在產生目標檔PC相對定址才有用?
在連結時無需理會PC相對定址?最後做修改重新定位的符號的是載入器…

在這裡書中有點錯誤,因為範例 5.5 與 圖 5.12 之間有矛盾,範例 5.5 都是用 PC 相對定址的方式,先將 PC=F 編進去,但是到了圖 5.8 之後卻沒有將 F 編進去,只放入了 0,也就是 T(002F0000),在圖5.12中變成了 00200000,這是錯誤的。

我打算修正範例 5.5 與 5.6,將所有相對於 PC 定址的 F 都改為 0,這樣兩邊就一致了,但是這樣內文也會有一部分變動,在下一次印刷時也會一併修改。

由於程式被載入到何處還未確定,因此連結時只能處理程式段的相對定址,像是 JMP,CALL 等指令的相對定址,但是還無法處理資料段的相對定址,像是 LD, ST 等,這些資料段的定址必需留到載入時才能真正確定。

P5-20
圖5.15
位址1220 31100000 00200044 00300044
00200044的44
是為了要找到Top:126C
怎麼會是126C-1228=44?
00300044也是一樣
是為了要找到stack:1270
怎麼會是1270-122C=44?
是CPU固定只抓32Bits資料(一行指令)的關係?

還是說最後執行檔不需要使用PC相對定址嗎?

圖 5.15 有錯,最後執行檔應該還是要使用相對於 PC 的定址,在此將圖 5.15 修正如下

圖 5.15 (修正後)

Fig5.15correct.png

同理,圖 5.14 ,圖 5.11 也有錯,更正如下。

圖 5.14 (修正後)

Fig5.14correct.png

圖 5.12 (修正後)

Fig5.12correct.png

圖 5.11 (修正後)

Fig5.11correct.png


P5-22 圖5.17最右邊f2 in meory應該是memory

是的,應該改為 memory


P5-28 範例5.12那些size的單位是Byte?

是的,size 的單位是 byte


Sorry 因為以前沒修過系統程式課 所以有些地方看不太懂想請教您一下

非常抱歉,第 5 章的連結器由於我沒有實作程式,錯誤實在有點多,敬請見諒!

有您這樣的讀者,是筆者的榮幸,我很高興能為您解答問題,如果有任何疑問,也歡迎再度來信。

陳鍾誠 敬上

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License