x86注册值

时间:2012-01-23 18:09:13

标签: assembly gdb x86 x86-64

鉴于以下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,那么我会从0x7FFFFFFFE1F00x7FFFFFFFE20D获取内存地址。因此开始和结束之间的偏移差异是29个字节。当我指定12时,这是怎么合理的?

谢谢

1 个答案:

答案 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