我稍微玩弄了一下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
我对汇编不是特别熟悉,但这看起来非常奇怪。有人能给我解释一下这到底是怎么回事吗?
发布于 2018-06-07 04:13:21
该错误消息具有误导性。此错误的原因是nasm试图将您的代码汇编为16位或32位代码,这两种代码都不支持64位寄存器。要解决此问题,请使用可使nasm汇编64位代码的选项来调用nasm,例如在Linux上:
nasm -f elf64 source.asm
或在Windows上:
nasm -f win64 source.asm
https://stackoverflow.com/questions/50728256
复制相似问题