首页 > 解决方案 > 在 GDB 中打印 (%r12,%rbx,1)

问题描述

在 GDB 中如何打印 0xc(%rsp)?

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

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

标签: x86gdbmemory-addressattaddressing-mode

解决方案


在 x86/x86-64 AT&T 语法中,地址的格式为displacement(basereg, indexreg, scale)。这被计算为位移+basereg+indexreg*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

查看前面提供的链接中的 eXamine 命令的完整文档,以获取命令及其参数的完整描述。


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


推荐阅读