为什么将 LEA 与反向操作数一起使用会引发操作数大小不匹配而不是 GAS 中的语法错误?

Why does using LEA with reversed operands throw an operand size mismatch and not syntax error in GAS?

我在 x86 机器上使用 GNU as

我知道 LEA 在 AT&T 语法中只能用作 lea <mem>, <reg32>,以寄存器目标和内存寻址模式作为源。例如,lea 100(%eax), %eax 可以很好地组装。

但为什么当您反转操作数时,GAS 在其错误消息中将其称为 大小 不匹配,而不是某种语法错误?

lea %eax, 100(%eax)

当我组装它时,我得到 operand size mismatch for `lea'

从技术上讲,语法错误意味着无法根据给定的语法识别和解析文本。

大小错误似乎是 post 解析。

一般来说,语法错误(parsing/recognizing 中的错误)比语义错误(post 解析)提供更差的用户体验。

当解析失败时,文本的其余部分有疑问(尽管在汇编中,重新开始解析可能很简单,只需丢弃该行并继续下一行)。当解析失败时,我们对实际错误也知之甚少。

如果在通过语法限制某些内容与通过语义检查限制某些内容之间做出选择,后者通常是首选,因为它(两者都允许解析继续,然后)提供了更好的错误机会消息。

在这种特殊情况下,错误消息确实有很多不足之处 — 因此它可能是在许多地方使用的一般错误消息。