x86_64中的i386 movsxw指令

时间:2014-06-01 05:51:28

标签: macos assembly clang x86-64 att

我正在尝试编译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

2 个答案:

答案 0 :(得分:1)

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使用gcc / as(4.8.1 / 2.24)在64位模式下组装好。我没有在这台机器上安装x86的clang,但你可以尝试指定第二个操作数的大小(即将movsxw更改为movsxwl,这将是“符号扩展字长期“)。

答案 1 :(得分:1)

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