首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么这个编译器在翻译成NASM的时候会被GCC输出错误?

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

Stack Overflow用户
提问于 2018-06-07 03:36:51
回答 1查看 96关注 0票数 3

我稍微玩弄了一下GCC的汇编输出,尝试了一下快速的整数平均。下面是我最初使用的C代码:

代码语言:javascript
复制
unsigned int average (unsigned int x, unsigned int y) {
    return (x&y)+((x^y)>>1);
}

下面是它发出的程序集(使用Intel语法):

代码语言:javascript
复制
average:
  mov edx, edi
  and edi, esi
  xor edx, esi
  shr edx
  lea eax, [rdx+rdi]
  ret

当我把它翻译成NASM时:

代码语言:javascript
复制
average:
    mov edx, edi
    and edi, esi
    xor edx, esi
    shr edx, 1
    lea eax, [rdx+rdi]
    ret

lea行上,它会报告此错误

代码语言:javascript
复制
<source>:6: error: impossible combination of address sizes
<source>:6: error: invalid effective address

我对汇编不是特别熟悉,但这看起来非常奇怪。有人能给我解释一下这到底是怎么回事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-07 04:13:21

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

代码语言:javascript
复制
nasm -f elf64 source.asm

或在Windows上:

代码语言:javascript
复制
nasm -f win64 source.asm
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50728256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档