X86 在GDB中打印(%r12,%rbx,1)

X86 在GDB中打印(%r12,%rbx,1),x86,gdb,memory-address,att,addressing-mode,X86,Gdb,Memory Address,Att,Addressing Mode,我看到了上面的链接,当有两个参数时打印值,但是当有三个参数时我该怎么办?如何处理偏移量1 如何找到(%r12,%rbx,1)的地址并打印其内容?在x86/x86-64 AT&T语法中,地址的形式为位移(basereg,indexreg,scale)。它被计算到一个地址,作为位移+basereg+indexreg*标度,其中标度为1、2、4或8。你可以省略方程式的任何部分。在GDB中,您可以使用print命令从这样的表达式中输入地址。例如,地址0x28(%rdx,%rsi,4)可以使用以下GDB打

我看到了上面的链接,当有两个参数时打印值,但是当有三个参数时我该怎么办?如何处理偏移量1


如何找到(%r12,%rbx,1)的地址并打印其内容?

在x86/x86-64 AT&T语法中,地址的形式为位移(basereg,indexreg,scale)。它被计算到一个地址,作为位移+basereg+indexreg*标度,其中标度为1、2、4或8。你可以省略方程式的任何部分。在GDB中,您可以使用
print
命令从这样的表达式中输入地址。例如,地址0x28(%rdx,%rsi,4)可以使用以下GDB打印:

print 0x28+$rdx+$rsi*4
如果你想打印出这样一个地址的内容,你可以使用GDB的。要打印该地址处的字符串,可以使用:

x/s 0x28+$rdx+$rsi*4
要以十六进制显示该地址的字节,请执行以下操作:

x/bx 0x28+$rdx+$rsi*4
x/3gx 0x28+$rdx+$rsi*4
要以十进制显示从该地址开始的12个16位有符号值,请执行以下操作:

x/12hd 0x28+$rdx+$rsi*4
x/6wu 0x28+$rdx+$rsi*4
要以十进制显示从该地址开始的6个32位无符号值,请执行以下操作:

x/12hd 0x28+$rdx+$rsi*4
x/6wu 0x28+$rdx+$rsi*4
要以十六进制显示从该地址开始的3个64位值,请执行以下操作:

x/bx 0x28+$rdx+$rsi*4
x/3gx 0x28+$rdx+$rsi*4
查看前面提供的链接中有关eXamine命令的完整文档,以获取该命令及其参数的完整描述



在您的示例中,没有位移,因此假定为0。
(%r12,%rbx,1)
的GDB表达式是
0+$r12+$rbx*1
,可以简化为
$r12+$rbx

在x86/x86-64 AT&T语法中,地址的形式是
置换(basereg,indexreg,scale)
。它被计算到一个地址,作为位移+basereg+indexreg*标度,其中标度为1、2、4或8。你可以省略方程式的任何部分。在GDB中,您可以使用
print
命令从这样的表达式中输入地址。例如,地址0x28(%rdx,%rsi,4)可以使用以下GDB打印:

print 0x28+$rdx+$rsi*4
如果你想打印出这样一个地址的内容,你可以使用GDB的。要打印该地址处的字符串,可以使用:

x/s 0x28+$rdx+$rsi*4
要以十六进制显示该地址的字节,请执行以下操作:

x/bx 0x28+$rdx+$rsi*4
x/3gx 0x28+$rdx+$rsi*4
要以十进制显示从该地址开始的12个16位有符号值,请执行以下操作:

x/12hd 0x28+$rdx+$rsi*4
x/6wu 0x28+$rdx+$rsi*4
要以十进制显示从该地址开始的6个32位无符号值,请执行以下操作:

x/12hd 0x28+$rdx+$rsi*4
x/6wu 0x28+$rdx+$rsi*4
要以十六进制显示从该地址开始的3个64位值,请执行以下操作:

x/bx 0x28+$rdx+$rsi*4
x/3gx 0x28+$rdx+$rsi*4
查看前面提供的链接中有关eXamine命令的完整文档,以获取该命令及其参数的完整描述



在您的示例中,没有位移,因此假定为0。
(%r12,%rbx,1)
的GDB表达式是
0+$r12+$rbx*1
,可以简化为
$r12+$rbx

我以前尝试过类似的方法,但我得到了一堆奇怪的数字。也许我在什么地方打错了什么。我刚试过你的方法,现在它起作用了。非常感谢。我以前试过类似的方法,但是我得到了一堆奇怪的数字。也许我在什么地方打错了什么。我刚试过你的方法,现在它起作用了。非常感谢你。