2011-03-25 47 views

回答

3

在這種情況下,-0x7ec55ec0只是編寫0xffffffff813aa140(換句話說,-0x7ec55ec0 + 0x10000000000000000)的一種較短的方式。

假設在該地址有一個跳轉表,由rax索引。

如果它的任何幫助,在Intel彙編語法相同的指令是:

call qword ptr [0xffffffff813aa140 + rax*8] 
+0

因此,'*'在程序集中評估爲'[]',對吧? – compiler 2011-03-25 02:48:39

+0

@compiler:非常好,是的。 – 2011-03-25 02:55:58

2

有沒有負面的地址。地址是無符號的。

這是什麼意思是你用高位設置了一個地址,並將其格式化爲一個有符號的數字(或者使用了一種將其格式化爲有符號數的方法)。

+0

地址是否有簽名或未簽名幾乎取決於解釋和/或個人偏好。一種看待它的方法是,例如在x64/x86_64中,如果您接受地址爲47位帶符號,則地址空間是連續的,即[[-2^48 .. 2^48-1]'。如果你堅持對它們進行無符號處理,你最終會得到兩個單獨的有效地址範圍「[0..2^48-1]」和[2^64-2^48]的「規範」/「非規範」 .. 2^64-1]'(以及之間的任何事物都是「非規範的」,不可表示)。 – 2011-03-25 10:31:20

+0

如果通過「解釋」,你的意思是數字如何被格式化爲一個字符串,那麼這就是我所說的。但是,我沒有看到這與「個人偏好」有什麼關係。你在哪裏見過計算機地址被描述爲負面? – 2011-03-25 22:24:25

+0

這是一個簡單的結果,它是如何「規範」尋址(地址空間中有空洞)的工作原理 - 容易接受,總尋址範圍是連續的(也可以是負的),或者只有一系列「值」那不是地址?另外,您接受地址_offsets_可以爲負數,您沒有任何問題,那麼會阻止_addresses_變爲負數? – 2011-03-28 09:20:34

0

「0x7ec55ec0」是否定地址偏移量。是的,它將從8 *%rax的值中減去。這種減法是在64位無符號數的兩個補碼錶示中相當於添加「0xffffffff8100b9e4」。

推測%rax * 8的值將大於0x7ec55ec0,這樣代碼或數據段通常範圍內的值就會生成。

請注意,x86平臺上的地址偏移確實總是被簽名(包括8位和32位錯誤),但結果地址當然是未簽名的。