在 GDB 中打印 (%r12,%rbx,1)
Print (%r12,%rbx,1) in GDB
In GDB how do I print 0xc(%rsp)?
我看到上面的 link 当有两个参数时打印值,但是当有三个时我该怎么办?如何处理偏移量 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
来自此类表达式的地址。例如地址 0x28(%rdx, %rsi, 4) 可以用 GDB 打印:
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
查看之前提供的 link 中 eXamine 命令的完整文档,以获得命令及其参数的完整描述。
在您的示例中,您没有位移,因此假定为 0。(%r12,%rbx,1)
的 GDB 表达式是 0+$r12+$rbx*1
,可以简化为 $r12+$rbx
In GDB how do I print 0xc(%rsp)?
我看到上面的 link 当有两个参数时打印值,但是当有三个时我该怎么办?如何处理偏移量 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
来自此类表达式的地址。例如地址 0x28(%rdx, %rsi, 4) 可以用 GDB 打印:
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
查看之前提供的 link 中 eXamine 命令的完整文档,以获得命令及其参数的完整描述。
在您的示例中,您没有位移,因此假定为 0。(%r12,%rbx,1)
的 GDB 表达式是 0+$r12+$rbx*1
,可以简化为 $r12+$rbx