2011-06-10 70 views

回答

2

不,這是立竿見影的價值。 pushq將值推入堆棧,其中可能是是一個寄存器,但是您會發現它們由操作數表示,如%rbx

$0x1a是一個立即值 - 你也可以通過該指令的長度(5個字節,從x+6x+10)來告訴它。指令pushq能夠推送一個寄存器,一個存儲器內容(64位)或一個32位立即值(符號擴展爲64位)。

在這種情況下,五個字節是操作碼0x68以及要推送的32位值。如果你要檢查內存,它可能看起來像0x68 0x1a 0x00 0x00 0x00

不要被該代碼所迷惑,它根本不是「真正的」read調用。它是一個存根,用於在運行時修復引用,其中代碼段可以在處理器之間共享,即使在不同的基址中也是如此。

PLT是一個小尺寸的進程存根,它首次跳轉到真正的共享代碼,在進程中自行修復,以便在將來直接跳轉到那裏。有關此過程的解釋,請參閱here

+0

所以'$ 0x1a'確實是一個寄存器,'%rbx'具體是? – cpuer 2011-06-10 07:11:52

+1

不,$ 0x1a不是寄存器,它是Windows及其前輩的十六進制'1a'(十進制數26)文件結束指示符的立即值。 – paxdiablo 2011-06-10 07:13:27

+0

所以我可以想象還有其他類似的調用是否最終進入相同的系統調用,但使用與$ 0x1a不同的參數? – cpuer 2011-06-10 07:18:37

0

寄存器不(通常)有一個內存位置,它們是一個CPU寄存器。

+0

當我們說註冊時,除CPU註冊之外,我們永遠不會意味着什麼,對吧? – cpuer 2011-06-10 07:27:39

+0

不,根據上下文,「寄存器」可能意味着其他事情,但如果上下文是低級彙編,那麼是的,它幾乎總是一個CPU寄存器。 – Arafangion 2011-06-10 07:53:15

0

尚未提及,但前導$符號表示常數。查看裝配轉儲時很簡單。

一個簡單的錯誤:當查看未鏈接的二進制文件的轉儲時,不要被0x00000000遍佈整個地方。沒有前導$,那些是鏈接器重定位,而不是常量0值。