2012-01-23 158 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