2017-02-09 51 views
0

Assemblers And Loaders符號是絕對的還是可重定位的,意味着什麼?

在未來符號的情況下,彙編器不知道類型 缺少的符號(絕對或重定位)。因此它不能 生成重定位位...

未來的符號是一個符號之前遇到它已被聲明。例如:

JMP TO 
    ... 
TO: ADD 1,2 

JMP TO指令組裝,符號TO是未來的象徵,因爲它的定義還沒有遇到過。

由於符號是指內存中的一個位置,它怎麼可能而不是可重定位?

+1

很難說,沒有更多的背景知道本書認爲「重定位位」是什麼。據猜測,架構對絕對和相對地址採用不同的指令編碼。如果是這樣,那麼程序中可能會發射相對偏移量,允許在沒有修復的情況下任意重新定位程序。相反地​​,如果TO以操作系統中的絕對地址('EQU $ 1000')結束引用ROM向量,則絕對尋址模式將是適當的。 – doynax

+0

這是一個非常過時的問題。那麼,這本書不是所謂的「彙編器,連接器和裝載機」。沒有人再使用單程彙編程序,這只是在60年代才重要的一件事情,那就是彙編程序可以對內存進行嚴格的限制。 –

回答

0

我沒去讀過你的書。我喜歡它談論當時正在做的彙編器和鏈接器的歷史,但是現在工具好了很多。

你是非常正確的。我認爲這個概念有一些指令集,不需要特定的指令集,提供接近版本的東西或通過引用的指令,基本上應用於程序計數器的某些偏移量是引用東西或跳轉到的地方。並且在某種程度上還提供了一種方法來使用(可變長度)指令中編碼的絕對地址,或者可以跳轉到從位置(pc相對)或通過即時mov等加載的寄存器中的地址。我認爲這個作者暗示的是,一旦你對這個地址進行了硬編碼,它就永遠是固定的,絕對的,鏈接器永遠不會再改變它。

那麼只需要幾秒鐘就可以證明連接器今天可以做什麼。他們可以並且將會修改指令,或者生成所需的指令,而不是彙編器完成所有指令生成。即使你有彙編器完成所有的事情,你仍然沒有被卡住,彙編器也不能完成整個事情,彙編器會例如做一個pc的相對讀取附近的位置,這個位置對於彙編器和鏈接器是已知的成爲某個不在此對象中的標籤的地址,即外部標籤。彙編程序將所有的CODE寫入寄存器中的跳轉到註冊,鏈接器填入地址。一旦鏈接看起來像一個絕對地址,但鏈接器可以重新定位,並且可以爭論使用的二進制格式可以指示該位置是某個標籤的地址,以便即使在加載時加載器也可以改變它。

一些指令集可以將絕對地址放在指令中,並且沒有真正的理由說明爲什麼鏈接器不能負責在鏈接時填寫指令的這一部分。

我認爲唯一的問題就是設計不好,如果在一個對象中你已經解決了一個標籤並且使用了一個pc相對跳轉,但是某種程度上,工具鏈允許你撕開那個對象的一部分,其餘的部分。那隻會是糟糕的設計。一種情況是gnu工具至少可以很好地處理,而其他人卻不能這麼做的原因是採取手臂和拇指的方式,bl指令不能改變模式,所以如果不告知其他情況,彙編器會假設某個標籤將會處於相同的模式因爲你的程序員使用bl而不是blx或bx。鏈接器出現並發現標籤處於另一種模式,如果它能夠找到可觸及的空間,則它會在同一模式下添加一些蹦牀,這些指令在功能上是不可見的(返回地址被保留,模式被更改並且目的地標籤/地址到達)。真的很酷,我在SO上發佈了這個例子。

問題出在連接器無法找到空間被繪製到一個角落,它不能製作蹦牀,它需要插入對象的指令不適合,它們不能在指令集的規則內蹦牀,以及那麼鏈接器必須保釋出來。我認爲今天救市的門檻與當時的門檻大不相同。即使在上面提到的gnu連接器和其他人並不是那麼聰明,只有少數幾個版本以前,少數幾年或更少的時候,他們會在這種情況下救助而不是僅僅修復它。我認爲,如果你保持在相同的模式,並試圖在地址空間太遠,它將保釋出來,而不是僅僅修復它。它也可以很容易地解決這種情況。