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

How do you access low-byte registers for r8-r15 from gdb in x86-64?

在 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
 = -15
(gdb) p $r13 
 = 241
(gdb) p $r13b
 = void
(gdb) p /x $r13b
 = 0x0

我在 gdb manual 中找不到任何内容,并且它们没有使用 info all-registers 命令打印。我正在使用 GDB 10。

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

r8lr9lr10lr11lr12lr13lr14lr15l.

(gdb) p $r13l
 = -15
(gdb) p /x $r13l
 = 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