【问题标题】:How do you access low-byte registers for r8-r15 from gdb in x86-64?如何从 x86-64 中的 gdb 访问 r8-r15 的低字节寄存器?
【发布时间】:2021-07-05 20:14:47
【问题描述】:

在 gdb 中,我似乎无法访问任何伪寄存器:r8br9br10br11br12br13br14b 或 @ 987654331@(但是,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。

【问题讨论】:

  • 这已经出现过几次了,就像Unable to set the lowest byte in a register x86-64?(Ruslan 的回答链接了你所做的相同的 GDB 错误)和Moving indirect-addressed value into AL works, but moving it into an 8-bit rXb register doesn't in yasm。这个有一个更好的标题,所以我关闭了其他的作为这个好的规范问答的副本。
  • 等一下,在您的 NASM 源代码中,我认为您的意思是 mov r13b, sil,因为 mov r13, sil 是操作数大小不匹配的问题。 (另外,通常你会使用 movzx r13d, sil 而不是 xor-zero 和字节 mov,但这个例子的重点是表明 NASM 理解 GDB 不理解的寄存器名称。)
  • @PeterCordes,感谢您修复代码!是的,我是在事后编写代码的,可能有错误的指令:P。感谢您的指点,我错过了另一个stackoverflow问题......我搜索了这个但找不到太多信息,所以最终查看了gdb代码。

标签: gdb x86-64 cpu-registers


【解决方案1】:

您可以使用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"
};

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

【讨论】:

  • l-suffix 名称实际上并不是 GDB 独有的:Intel 的手册使用 r8l 作为 r8 的低字节,与 AMD 选择的 r8b 不同:Why does Apple use R8l for the byte registers instead of R8b? 和 @ 987654324@。 AMD 是 AMD64 的原始架构师,它们的名称在大多数用途中更为普遍。 (但如果除此之外没有任何 GDB 文档关于只允许这些版本的名称,我不会感到惊讶。)
  • 我读到 Intel 是怎么称呼它们的,但是在 Intel SDM 第 1 卷中,它们被称为 r8b-r15b,所以我不知道 l-suffix 来自哪里。
  • 哦,最近没查;也许英特尔更改了他们的手册以遵循更广泛使用的约定,或者英特尔手册的不同部分使用 r8l-r15l。带有指令编码细节的当前第 2 卷手册(2021 年 4 月)也仅使用 r8b-r15b。
  • 为了结束混乱,我选择在我的汇编程序中接受R8LR8B 两种变体:-)
猜你喜欢
  • 2018-07-29
  • 1970-01-01
  • 2011-12-12
  • 2021-01-14
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多