2012-01-23 212 views
2

鑑於以下X86-64 AT & T彙編行:的x86寄存器值

cmpl $0x7,0xc(%rsp)

這是訪問的第12 RSP內存從$抵消。那麼它是在訪問內存中的rsp之後訪問12*4 = 48,第48個字節,還是rsp之後的第96個字節,訪問12*8 = 96?由於這是64位體系結構,因此寄存器的長度應爲8個字節,因此96?

無論如何,要訪問gdb中的那個位置,我會做x/96s $rsp嗎?有沒有一個簡單的方法來打印沒有整個偏移列表?

如果我寫x/12s $rsp,那麼我得到的內存地址從0x7FFFFFFFE1F00x7FFFFFFFE20D。所以開始和結束之間的偏移量差異是29個字節。當我指定12時,這是合乎邏輯的嗎?

謝謝

回答

4

的組件內偏移字節偏移,所以該指令在看着上述rsp數據12個字節。這是因爲x86允許訪問任何地址,除了SSE指令的情況,其中一些需要16字節對齊。

在gdb中,/後面的數字表示要查看多少條數據,而不是偏移量。如果你想偏移寄存器,你需要將它添加到該位置。另外,由於使用的是s類型說明符,因此您會看到30個字節,這意味着gdb會顯示一個以null結尾的字符串。要查看數據,您需要使用其他格式。一些選項是:o(八進制),x(十六進制),d(十進制),t(二進制)和i(指令)。 (使用help x查看完整列表)。您還應該指定您想要查看的任何數字類型的數據大小。使用b(字節),h(2字節),w(4字節)或g(8字節)。

例如,如果你想看到2 4字節字rsp後啓動12個字節,並以十六進制顯示他們,你可以使用:

x/2wx $rsp + 12 
+0

IIRC,'cmpl'指令是32位(cmpb是一個字節,cmpw是一個16位值),所以我不驚訝地看到它使用+ 3 * 4作爲偏移量......它會使用「cmpq」位值,不是嗎? – PypeBros