将间接寻址值移入AL工作,但将其移入8位rXb寄存器不是yasm

时间:2012-04-30 06:31:34

标签: assembly x86-64 nasm yasm

我在.data

中声明了一个字节数组字符
chars db 'spipopd'

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

mov rdi, chars

在某些时候,我想将数组中的一个字符放入一个8位寄存器中。下面的第一个语句产生一个有效值,但第二个语句在输入gdb命令void时导致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。“

这与我的问题有关吗?

1 个答案:

答案 0 :(得分:1)

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

请注意,低字节寄存器r9br9l有两种不同的符号,不同的源使用不同的名称。

在main中打破一个随机程序并自己尝试,我得到了这个输出:

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

显然gdb只识别$r9l符号。