问题描述
在 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
$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
后缀引用这些寄存器的低字节:
r8l
、r9l
、r10l
、r11l
、r12l
、r13l
、r14l
、r15l
.
(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
。