【问题标题】:i386 movsxw instruction in x86_64x86_64 中的 i386 movsxw 指令
【发布时间】:2014-06-01 05:51:28
【问题描述】:

我正在尝试编译 Apple 的 Libm (version 2026, tarball here)。唯一无法正确编译的文件是Source/Intel/frexp.s,因为

/<path>/Libm-2026/Source/Intel/frexp.s:239:5:
error: invalid instruction mnemonic 'movsxw'
    movsxw 8+(8 + (32 - 8))(%rsp), %eax
    ^~~~~~
/<path>/Libm-2026/Source/Intel/frexp.s:291:5:
error: invalid instruction mnemonic 'movsxw'
    movsxw 8(%rsp), %eax
    ^~~~~~

在互联网上环顾四周,我只能找到很少的 movsxw 指令细节,但它似乎确实存在于 i386 架构中。我正在使用 Core i5 处理器运行 OS X 10.9.3。宏 __x86_64__ 是预定义的,但似乎 __i386__ 宏不是 *

我的印象是 x86_64 指令集与 i386 集完全兼容。这是不正确的吗?我只能假设 x86_64 指令集中不存在 movsxw 指令,因此我的问题是:它是做什么的,我可以从 x86_64 指令集中用什么替换它?

*检查:clang -dM -E -x c /dev/null

【问题讨论】:

    标签: macos assembly clang x86-64 att


    【解决方案1】:

    movsxw 的规范 at&t 语法是 movswl,尽管至少一些汇编器版本似乎也接受前者。

    【讨论】:

    • 所以只是为了确认一下,它们是相同的指令,但由于不接受 Intel 语法,我应该用 movswl 替换所有 movsxw 实例?
    • movsx 是 intel 语法(适用于所有大小),movswl 是规范的 at&t 语法(用于单词到长),movsxw 是我拥有的两者的奇怪组合从未听说过,但我的汇编程序接受它并创建相同的指令。
    • 啊,我和你在一起。非常感谢!
    【解决方案2】:
    movsxb : Sign-extend a byte into the second operand
    movsxw : Sign-extend a word (16 bits) into the second operand
    movsxl : Sign-extend a long (32 bits) into the second operand
    

    movsxw 在 64 位模式下使用 gcc/as (4.8.1/2.24) 对我来说组装得很好。我没有在这台机器上安装 x86 的 clang,但您可以尝试指定第二个操作数的大小(即将 movsxw 更改为 movsxwl,这将是 "sign-extend word into long")。

    【讨论】:

      猜你喜欢
      • 2016-07-20
      • 2013-01-17
      • 2014-05-28
      • 2012-07-25
      • 2013-02-05
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      相关资源
      最近更新 更多