我在.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中的任何一个都具有相同的效果。据我所知,al
和r9b
都是8位,所以为什么一个工作,另一个不工作?我的预感是,虽然它们都是8位大小,但它们有一些微妙的差异让我望而却步。
英特尔文档声明:
“REX前缀用于生成64位操作数大小或引用 寄存器R8-R15。“
这与我的问题有关吗?
答案 0 :(得分:1)
“void”实际上不是寄存器可以拥有的值,因此看起来像gdb只是没有将r9b识别为寄存器名称。
请注意,低字节寄存器r9b
和r9l
有两种不同的符号,不同的源使用不同的名称。
在main中打破一个随机程序并自己尝试,我得到了这个输出:
(gdb) print $r9b
$1 = void
(gdb) print $r9l
$2 = 16
显然gdb只识别$r9l
符号。