2011-09-06 39 views
5

好了,所以我处理下面的代码片段:奇怪的结果与movzwl,斧头%和负值

​​

因此,这表现为正值打交道时预期。复制到%edx的值是%eax(或%ax)的后16位。

但是,如果你把一个负数,一切都开始变得古怪,它似乎并没有被表现如预期。

例如,如果%eax中的值是-67043552,然后复制到%EDX值是65312.

我是相当新的组件,对不起,如果这是在我的部分明显的误解。任何帮助将不胜感激。

+0

['movswl'](http://www.felixcloutier.com/x86/MOVSX:MOVSXD.html)可用于签名扩展2的补码有符号值而不是零扩展二进制无符号值。 (参见[86标签维基(http://stackoverflow.com/tags/x86/info)。 –

+0

另外,如果你打印你的号码为十六进制,它会少了很多混乱/较为明显发生了什么事。 –

+0

另外,除非你确实需要在'%eax'的全部价值,您应该'movzwl 0x8中(%EBP),%edx',而不是直接的浪费指令单独做这件事。英特尔的CPU可以处理'movzx' /'movsx'作为一个负载uop,不需要ALU。 –

回答

16

请记住,movzwl只会将%ax中的位复制到%edx中,并用零填充%edx的高16位。

所以%edx始终以正数小于或等于65535。

详细地结束:-67043552十六进制是fc00ff20。因此,如果这是在%eax,然后%ax包含ff20。如果移动到%edx零扩展,然后%edx得到0000ff20。这是65312.