在 x86 汇编中有些东西让我困惑了一段时间,这是 NASM 如何/何时可以推断操作的大小,这是一个示例:
mov ebx, [eax]
在这里,我们将存储在 eax 中保存的地址的 4 个字节移动到 ebx 中。由于寄存器是 32 位,因此操作的大小被推断为 4 个字节。
但是,此操作不会被推断并引发编译错误:
mov [eax], 123456
当然解决方案是这样的:
mov dword [eax], 123456
这会将数字 123456 的 32 表示移动到存储在 eax 中保存的地址的字节中。
但这让我很困惑,它肯定可以看到 eax 是 32 位的,所以不应该假设我想将它存储为 32 位值而无需在 mov 之后指定 dword 吗?
当然,如果我想将 12345 的 16 位表示(适合 16 位的较小数字)放入 eax 我会这样做:
mov ax, 12345