您如何从 x86-64 中的 gdb 访问 r8-r15 的低字节寄存器?

问题描述

在 gdb 中,我似乎无法访问任何伪寄存器:r8br9br10br11br12br13br14br15b(不过,r15dr15w 似乎有效,对于 sil 也是如此)。

一个例子:

section .text
global main

main:
  xor esi,esi
  mov sil,0x1f
  xor r13d,r13d
  mov r13b,sil
  ret

使用 gdb 运行:

(gdb) p $sil
$1 = -15
(gdb) p $r13 
$2 = 241
(gdb) p $r13b
$3 = void
(gdb) p /x $r13b
$4 = 0x0

我在 gdb manual 中找不到任何东西,而且它们不是用 info all-registers 命令打印的。我正在使用 GDB 10。

解决方法

您可以使用 l 后缀引用这些寄存器的低字节:

r8lr9lr10lr11lr12lr13lr14lr15l .

(gdb) p $r13l
$1 = -15
(gdb) p /x $r13l
$2 = 0xf1

除了 gdb codebase 中的定义外,我在任何地方都找不到这些别名:

/* Register names for byte pseudo-registers.  */

static const char * const amd64_byte_names[] =
{
  "al","bl","cl","dl","sil","dil","bpl","spl","r8l","r9l","r10l","r11l","r12l","r13l","r14l","r15l","ah","bh","ch","dh"
};

此外,如果为 print 命令指定了格式,gdb 代码库中的 was a bug 将打印 0 而不是 void,就像在最后一个示例中发生的那样。如果您要打印的值未定义,则 gdb 的未来版本应显示 void