2

我在 .data 中声明了一个字节数组的字符

chars db 'spipopd'

我已将 rdi 设置为指向该数组的基本索引

mov rdi, chars

在某些时候,我想将数组中的一个字符放入一个 8 位寄存器中。下面的第一条语句产生一个有效值,但第二条语句void在输入 gdb 命令时导致 r9b 包含print $r9b

mov al, [rdi]   ; produces valid value in gdb
mov r9b, [rdi]  ; r9b = void, according to gdb

寄存器 r8b 到 r15b 中的任何一个都具有相同的效果。据我了解,alr9b都是 8 位的,那么为什么一个可以工作,而另一个不能呢?我的预感是,虽然它们都是 8 位大小,但它们有一些我无法理解的细微差别。

英特尔文档指出:

“REX 前缀用于生成 64 位操作数大小或引用寄存器 R8-R15。”

这与我的问题有关吗?

4

1 回答 1

1

“void”实际上并不是寄存器可以具有的值,因此看起来 gdb 只是没有将 r9b 识别为寄存器名称。

请注意,低字节寄存器有两种不同的表示法,r9br9l,并且不同的源使用不同的名称。

在 main 中破坏一个随机程序并自己尝试,我得到以下输出:

(gdb) print $r9b
$1 = void
(gdb) print $r9l
$2 = 16

显然 gdb 只识别$r9l符号。

于 2012-07-22T18:32:37.060 回答