我正在尝试编译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
答案 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
,尽管至少有一些汇编程序版本似乎也接受了前者。