如何从 x86-64 中的 gdb 访问 r8-r15 的低字节寄存器?
How do you access low-byte registers for r8-r15 from gdb in x86-64?
在 gdb 中,我似乎无法访问任何伪寄存器:r8b
、r9b
、r10b
、r11b
、r12b
、r13b
、r14b
或 r15b
(但是,r15d
和 r15w
似乎有效,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
后缀引用这些寄存器的低字节:
r8l
、r9l
、r10l
、r11l
、r12l
、r13l
、r14l
、r15l
.
(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
。
在 gdb 中,我似乎无法访问任何伪寄存器:r8b
、r9b
、r10b
、r11b
、r12b
、r13b
、r14b
或 r15b
(但是,r15d
和 r15w
似乎有效,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
后缀引用这些寄存器的低字节:
r8l
、r9l
、r10l
、r11l
、r12l
、r13l
、r14l
、r15l
.
(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
。