将16位复制到内存位置

问题描述 投票:0回答:1

我现在正在上大学的一门机器架构课程,我们开始学习汇编。我们有一个问题说:

下面的x86-64汇编指令将从A寄存器复制16位到B寄存器指向的主存储器位置。

我的实验室合作伙伴和我正在尝试找出答案。他认为:movw%ax,(%rbx)

因为我们将其复制到指针的位置。

我认为是:movw%ax,(%bx)因为那表示它的16位。

任何解释都会有所帮助,因为我们迷路了,对此没有很多明确的信息!

assembly x86-64 att
1个回答
0
投票

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指令中也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.