鉴于以下x86-64 AT& T装配线:
cmpl $0x7,0xc(%rsp)
这是从内存中的$ rsp访问第12个偏移量。那么它是访问12*4 = 48
,在内存中rsp
之后的第48个字节还是12*8 = 96
之后的rsp
第96个字节?由于这是64位架构,因此寄存器长8个字节,因此96?
无论如何,要在gdb
中访问该位置,我会x/96s $rsp
吗?是否有一种简单的方法可以在没有整个偏移列表的情况下打印出来?
如果我写x/12s $rsp
,那么我会从0x7FFFFFFFE1F0
到0x7FFFFFFFE20D
获取内存地址。因此开始和结束之间的偏移差异是29个字节。当我指定12时,这是怎么合理的?
谢谢
答案 0 :(得分:4)
程序集中的偏移量是一个字节偏移量,因此该指令正在查看rsp
以上12个字节的数据。这是因为x86允许访问任何地址,但SSE指令除外,其中一些需要16字节对齐。
在gdb中,/
后面的数字表示您想要查看的数据量,而不是偏移量。如果要偏移寄存器,则需要将其添加到该位置。此外,您看到30个字节,因为您使用的是s
类型说明符,这意味着gdb会显示一个以null结尾的字符串。要查看数据,您需要使用其他格式。一些选项是:o
(八进制),x
(十六进制),d
(十进制),t
(二进制)和i
(指令)。 (使用help x
查看完整列表)。您还应指定要为任何数字类型查看的数据大小。使用b
(字节),h
(2个字节),w
(4个字节)或g
(8个字节)。
例如,如果要查看在rsp
之后的12个字节开始的2个4字节字,并将它们以十六进制显示,则可以使用:
x/2wx $rsp + 12