为什么这个编译器在翻译成 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
我稍微研究了一下 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