私は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がコードを16ビットまたは32ビットコードとしてアセンブルしようとすることです。どちらも64ビットレジスタをサポートしていません。この問題を修正するには、Linuxなどで64ビットコードをアセンブルするオプションを指定してnasmを呼び出します。
nasm -f elf64 source.asm
またはWindowsの場合:
nasm -f win64 source.asm
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加