x86 - 在 GDB 中打印 (%r12,%rbx,1)
问题描述
当那里有两个参数时,我看到上面的链接打印值,但是当有三个参数时我该怎么办?偏移量 1 怎么办?
如何找到(%r12,%rbx,1)的地址并打印其内容?
解决方案
在 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