为什么这个编译器在翻译成 NASM 时会输出 GCC 错误?

Why does this compiler output by GCC error when translated into NASM?

我稍微研究了一下 GCC 程序集输出,尝试使用快速整数平均值。这是我最初使用的 C 代码:

unsigned int average (unsigned int x, unsigned int y) {
    return (x&y)+((x^y)>>1);
}

这是它发出的程序集(使用 Intel 语法):

average:
  mov edx, edi
  and edi, esi
  xor edx, esi
  shr edx
  lea eax, [rdx+rdi]
  ret

当我为 NASM 翻译它时:

average:
    mov edx, edi
    and edi, esi
    xor edx, esi
    shr edx, 1
    lea eax, [rdx+rdi]
    ret

它抱怨这个错误,在 lea:

<source>:6: error: impossible combination of address sizes
<source>:6: error: invalid effective address

超级不熟悉汇编,但这看起来很奇怪。有人能给我解释一下这到底是怎么回事吗?

错误消息具有误导性。此错误的原因是 nasm 尝试将您的代码 assemble 作为 16 位或 32 位代码,这两种代码都不支持 64 位寄存器。要解决此问题,请调用 nasm 并使用使其成为 assemble 64 位代码的选项,例如在 Linux:

nasm -f elf64 source.asm

或 Windows:

nasm -f win64 source.asm