问题描述
In GDB how do I print 0xc(%rsp)?
我看到上面的链接在有两个参数时打印值,但是当有三个参数时我该怎么办?偏移量1怎么办?
如何找到(%r12,%rbx,1)的地址并打印其内容?
解决方法
在x86 / x86-64 AT&T语法中,地址的格式为displacement(basereg,indexreg,scale)
。计算得出的地址为 displacement + basereg + indexreg * scale ,其中 scale 是1、2、4或8。您可以保留方程式的任何部分。在GDB中,您可以使用print
命令从这样的表达式中print
来地址。例如,可以使用GDB打印地址为0x28(%rdx,%rsi,4)的
print 0x28+$rdx+$rsi*4
如果要打印出该地址的内容,可以使用GDB的x
(examine) command。要在该地址打印出字符串,可以使用:
x/s 0x28+$rdx+$rsi*4
以十六进制形式在该地址显示一个字节:
x/bx 0x28+$rdx+$rsi*4
以十进制显示从该地址开始的12个16位带符号值:
x/12hd 0x28+$rdx+$rsi*4
要以十进制显示从该地址开始的6个32位无符号值:
x/6wu 0x28+$rdx+$rsi*4
要以十六进制显示从该地址开始的3个64位值:
x/3gx 0x28+$rdx+$rsi*4
在前面提供的链接上查看eXamine命令的完整文档,以获取对该命令及其参数的完整描述。
在您的示例中,您没有位移,因此假设它为0。(%r12,%rbx,1)
的GDB表达式为0+$r12+$rbx*1
,可以简化为$r12+$rbx