64 位汇编中的寻址模式中的 32 位寄存器不允许吗?

Hai*_*der 2 assembly x86-64 cpu-registers addressing-mode

以下指令有什么问题:

movb $0xF, (%ebx)
Run Code Online (Sandbox Code Playgroud)

答案指出%ebx不能用作地址寄存器。我是装配新手,有人可以解释这意味着什么吗?

如果该指示是movb $0xF, (%rbx)有效的吗?另外,地址寄存器到底是什么?最后,在寄存器周围写括号是否直接引用寄存器指向的内存位置?

Mar*_*oom 5

1没有什么问题movb $0xf, (%ebx)

\n

即使在 64 位模式下,s\xc3\xa8 也没有问题。当然,x32 程序不会介意使用它,并且r/e/bx肯定可以用作基址寄存器(事实上,bx它是少数可以在 16 位模式下充当基址的原始寄存器之一)。

\n

我的建议是找到更好的学习来源。

\n
\n

1 ,它在 64 位和 16 位模式下正确组装,在 32 位模式下67 C6 03 0F没有地址大小覆盖字节 ( )。67

\n

  • 确实,大多数程序*不应该*使用`(%ebx)`,而是使用`(%rbx)`,因为这样可以避免在`67h`地址大小前缀上花费额外的机器代码大小字节。但你是对的,更好的指南会告诉你这是允许的,但效率低下,并将你的指针截断为 32 位(如果你不想要并且不需要它,这可能是一个错误。) (3认同)