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

Assembly 为什么“lea esi,dword[edx+;ecx*4]”在使用NASM组装时会产生错误?,assembly,x86,nasm,Assembly,X86,Nasm,为什么lea esi,dword[edx+ecx*4]在使用NASM组装时会产生错误 我得到一个错误: 插入\u排序.asm:19:错误:操作数大小不匹配 然而,lea的目的仅仅是加载dword[edx+ecx*4]的地址,因此即使引用的是dword值,也不重要 另一方面, mov eax, dword [edi] 像预期的那样工作得很好。在此我声明[edi]引用DWORD值。对于lea,大小说明符不相关。你没有从内存中加载任何东西-你只是在计算一个地址(甚至不需要是你计划用作地址的东西-你

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

我得到一个错误:

插入\u排序.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位目标寄存器)。但是地址大小是根据英特尔的手册由“代码段的属性”确定的,而不是在指令中指定的。

在稍作修改后,我相信
dword
前缀是导致nasm出现问题的原因。如果不使用它,nasm会很高兴的。

那么,nasm产生的错误是因为“没有必要使用大小说明符”?那么,NASM不应该忽略说明符而不生成错误吗?对NASM源代码有更好了解的人必须回答这个问题。我当然可以看到默默忽略意外标记的危险,因为程序员对汇编程序产生的结果的期望可能与实际情况不同。我同意错误消息似乎有点神秘。谢谢@Michael。注意,您可以使用地址大小覆盖将地址大小更改为与代码段指示相反的大小。实际上,您可以在指令中指定地址大小。如果您使用
leaeax[bx+di]
,那么汇编器将生成一条带有fuzzxl提到的地址大小覆盖前缀(假设位32有效)的指令。