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

Assembly 为什么这个编译器在翻译成NASM时会输出GCC错误?,assembly,compiler-errors,nasm,x86-64,code-translation,Assembly,Compiler Errors,Nasm,X86 64,Code Translation,我在玩弄GCC汇编输出,尝试使用快速整数平均值。以下是我最初使用的C代码: unsigned int average (unsigned int x, unsigned int y) { return (x&y)+((x^y)>>1); } 以下是它发出的程序集(使用英特尔语法): 当我为NASM翻译时: average: mov edx, edi and edi, esi xor edx, esi shr edx, 1 le

我在玩弄GCC汇编输出,尝试使用快速整数平均值。以下是我最初使用的C代码:

unsigned int average (unsigned int x, unsigned int y) {
    return (x&y)+((x^y)>>1);
}
以下是它发出的程序集(使用英特尔语法):

当我为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
:6:错误:无法组合地址大小
:6:错误:无效的有效地址

我不太熟悉组装,但这似乎非常奇怪。有人能给我解释一下这到底是怎么回事吗?

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

nasm -f elf64 source.asm
或在Windows上:

nasm -f win64 source.asm

当从GCC输出翻译/插入NASM时,其他输出是否有效?根据我的经验,通常有效,但不是100%有效。我只是好奇是什么让这个例子不起作用。我更新了问题名称和标签,以澄清我问的是一个失败的代码翻译,而不是一个简单的插入输出到输入。这太奇怪了…我验证了这一点,事实上是这样的。
nasm -f win64 source.asm