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

Isi*_*ows 3 assembly compiler-errors x86-64 nasm code-translation

我正在玩GCC组件输出一点点,尝试快速整数平均值.这是我最初使用的C代码:

unsigned int average (unsigned int x, unsigned int y) {
    return (x&y)+((x^y)>>1);
}
Run Code Online (Sandbox Code Playgroud)

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

average:
  mov edx, edi
  and edi, esi
  xor edx, esi
  shr edx
  lea eax, [rdx+rdi]
  ret
Run Code Online (Sandbox Code Playgroud)

当我为NASM翻译时:

average:
    mov edx, edi
    and edi, esi
    xor edx, esi
    shr edx, 1
    lea eax, [rdx+rdi]
    ret
Run Code Online (Sandbox Code Playgroud)

它抱怨这个错误,在线lea:

<source>:6: error: impossible combination of address sizes
<source>:6: error: invalid effective address
Run Code Online (Sandbox Code Playgroud)

我不是超级熟悉汇编,但这似乎超级奇怪.有人可以向我解释这里到底发生了什么事吗?

fuz*_*fuz 8

错误消息具有误导性.此错误的原因是NASM试图组装代码为16位或32位的代码,这两者都不支持64个寄存器.要解决此问题,请使用导致它组装64位代码的选项调用nasm,例如在Linux上:

nasm -f elf64 source.asm
Run Code Online (Sandbox Code Playgroud)

或在Windows上:

nasm -f win64 source.asm
Run Code Online (Sandbox Code Playgroud)