为什么使用NASM组装时lea esi, dword [edx + ecx * 4]会产生错误?

我得到错误:


insert_sort.asm:19:错误:操作数大小不匹配


但是,lea的目的只是加载dword [edx + ecx * 4]的地址,所以即使引用是针对DWORD值的,这也没关系吗?

另一方面,

mov eax, dword [edi]


如预期般完美运作。在这里,我声明[edi]引用一个DWORD值。

最佳答案

lea的情况下,大小说明符不相关。您不会从内存中加载任何内容-您只是在计算地址(甚至不必是您打算用作地址的内容-您可以使用lea进行一般算术运算)。 lea esi, byte [edx]lea esi, dword [edx]之间没有区别,因此完全没有大小说明符是没有意义的。

在您的mov示例中,它实际上是多余的,因为可以从目标操作数中推断出大小。但是在mov的情况下,它在某些情况下(例如mov byte [edi], 1)实际上是相关的,而在lea的情况下却没有关系。

请注意,您可以让lea计算一个16位地址并将其零扩展到32位目标寄存器中(或计算一个32位地址并将其截断为16位目标寄存器)。但是,地址大小是根据Intel的手册确定的,而不是您在指令中指定的值,而是由“代码段的属性”确定的。

关于assembly - 为什么使用NASM组装时`lea esi,dword [edx + ecx * 4]`产生错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38784319/

10-11 15:15