-1

我認爲「調用」指令是一種「跳轉」指令。 「跳轉」指令有地址去哪裏。 而「call」指令應該有一個目標地址。 但是,當我拆解二進制文件時,「call」指令只具有目標函數的標籤。那麼,他們如何知道去哪裏?換句話說,我在哪裏可以找到每個函數的目標地址? x86,ARM不管。「調用」指令位置的地址

+0

_「但是當我拆開二進制文件時,」call「指令只有目標函數的標籤。」_這是反彙編程序爲了讓拆卸更容易閱讀而做的。 「call」指令的實際機器碼序列將包含目標地址(可以是相對或絕對的)。 – Michael 2015-04-01 15:06:11

+0

你應該看到沒有什麼區別,反彙編跳轉或呼叫。 – Jester 2015-04-01 15:06:41

+1

爲什麼不在拆解和詢問這些問題之前閱讀一些書 – 2015-04-01 15:53:57

回答

2

彙編程序設計中的地址通常標有一些符號名稱。這不僅適用於通話指示,而且適用於所有其他指示。

這種方法有一個原因 - 地址總是取決於程序在內存中的加載位置。此外,某些指令不包含地址本身,而是包含相對於執行程序的當前地址的偏移量。

另一方面,程序員通常不關心地址的確切值。他只想知道這個地址的位置。這就是使用符號標籤的原因。

使用具有有意義名稱的符號標籤可以提高源代碼的可讀性並使程序易於支持和擴展。

這些符號地址(標籤)在將源代碼組裝到可執行二進制文件期間被轉換爲數字。

根據可執行的格式,有時翻譯是部分的 - 只計算相對於代碼開頭的偏移量。這些都是所謂的「可重新定位」標籤。

稍後,當操作系統將二進制文件加載到內存中的某個特定地址時,所有可重定位地址都將被固定,以便獲取加載二進制文件的正確數值。

這種方法對於動態加載庫(DLL)很常見,因爲每次將庫加載到內存中時,加載地址都是未知的(並且是不同的)。