我现在正在上大学的一门机器架构课程,我们开始学习汇编。我们有一个问题说:
下面的x86-64汇编指令将从A寄存器复制16位到B寄存器指向的主存储器位置。
我的实验室合作伙伴和我正在尝试找出答案。他认为:movw%ax,(%rbx)
因为我们将其复制到指针的位置。
我认为是:movw%ax,(%bx)因为那表示它的16位。
任何解释都会有所帮助,因为我们迷路了,对此没有很多明确的信息!
16位地址大小在64位代码中不可用。指针是64位。您可能会尝试组装movw %ax, (%bx)
,尽管产生的错误消息foo.s:1: Error: `(%bx)' is not a valid base/index expression
并非超级有用。 (我使用gcc -c foo.s
在x86-64 Linux桌面上在其上运行GAS。)
地址大小和操作数大小是分开的东西。
mov %ax, (%rbx)
是RBX指向的存储器的16位存储。 %ax
是一个16位寄存器,因此它意味着16位操作数的大小。 (是的,在助记符上带有操作数大小的覆盖后缀的movw
也是一种有效的写入方式。)
mov %ax, (%ebx)
在64位模式下是可编码的,但是它将仅使用RBX的低32位作为内存操作数的地址。您基本上从不希望在64位模式下使用32位地址大小,即使在LEA指令中也是如此。