2017-01-01 61 views
3

我正在編寫我的8086彙編程序。 問題在於彙編程序通過。彙編程序通過問題

在通1你計算相對於片段每個標籤的位置。

我們做到這一點每個指令的大小必須被計算並添加到偏移。

在8086一些指令應更小,如果標籤的位置的範圍內。例如,「jmp _label」會選擇一個短暫的跳躍,如果它不能跳轉的話。

現在問題出現在第1遍標籤尚未到達,因此它不能確定指令的大小,因爲「jmp short _label」小於「jmp near _label」指令。

所以我怎麼能決定耐候「JMP _label」變成了「JMP短_label」與否?

三道也可能是一個問題,因爲我們需要的電流指令,甚至給偏移之前需要了解每一個指令的大小。

謝謝

+0

我想過一個可能的解決方案,讓我知道你是否同意? – NibbleBits

+0

我想過一個可能的解決方案讓我知道,如果你同意? 我能做的就是猜測並選擇短暫的跳躍。在它完成計算段的大小後,它會追溯並查看它們是否是一個錯誤,如果它們是它會糾正每個指令抵消?這將是緩慢的,但會工作,如果任何人有更好的方式,請讓我知道 – NibbleBits

+0

我正在編寫一個8086的彙編程序。因爲我寫了一個編譯器,從那裏生成彙編程序將創建機器代碼。 – NibbleBits

回答

3

你可以做的是開始假設短暫的跳躍就足夠了。如果在找出跳躍距離(或跳躍距離發生變化)時該假設變得無效,則可以將短跳躍擴展到近跳躍。擴展之後,必須調整擴展跳轉之後的標籤偏移量(按近跳轉指令的長度減短跳轉指令的長度)。這種調整可能會使其他一些短暫的跳躍不足,並且它們將不得不更改爲接近跳躍。因此,有可能實際上是幾個迭代,超過2

在實現這一點,你應該避免在內存擴展跳轉指令時,移動代碼。這將嚴重拖慢組裝。您不應該重新彙編程序集源代碼。

您也可以預先計算某種跳躍和標籤之間的相互關係表,所以你可以跳過標籤和跳轉指令通過擴展跳轉指令的影響。

另一件需要考慮的事情是,您的短跳轉具有127個字節的前進距離,並且當以下指令總計超過127個字節且目標標籤仍未遇到時,可以將跳轉更改爲近那麼跳吧。請記住,在任何時候,您可能會有多達64個可能以這種方式接近的前進短跳轉。

+0

我在我自己的帖子的評論中提出了一個相似的東西,你的文章是一個更深入的解決方案謝謝。當我改變一跳時,我也會想到自己,這可能會影響到其他人,你完全正確。我很高興有人同意我的意見,這意味着我走在正確的軌道上。非常感謝:) – NibbleBits

+0

我不認爲你可以幫助我的其他問題嗎?沒有人回答,並且已經有一個月左右的時間了:http://stackoverflow.com/questions/41022380/omfobject-module-format-length-field-appears-incorrect – NibbleBits

+0

跟蹤開放可能 - 近跳躍不應該花太多時間時間,因爲它通常只有一個手工滿(Alexey提到<64),它可以防止你移動內存塊。我希望通過一個(也許是巨大的)交叉鏈接相關跳轉列表來選擇這個選項。你可以預測:如果2個跳轉是打開的,並且已經使用了'128-2x(打開跳轉數)'字節,則兩個跳轉都會很長 – Tommylee2k