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)
我不是超级熟悉汇编,但这似乎超级奇怪.有人可以向我解释这里到底发生了什么事吗?
错误消息具有误导性.此错误的原因是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)
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |