5
好了,所以我处理下面的代码片段:奇怪的结果与movzwl,斧头%和负值
因此,这表现为正值打交道时预期。复制到%edx的值是%eax(或%ax)的后16位。
但是,如果你把一个负数,一切都开始变得古怪,它似乎并没有被表现如预期。
例如,如果%eax中的值是-67043552,然后复制到%EDX值是65312.
我是相当新的组件,对不起,如果这是在我的部分明显的误解。任何帮助将不胜感激。
好了,所以我处理下面的代码片段:奇怪的结果与movzwl,斧头%和负值
因此,这表现为正值打交道时预期。复制到%edx的值是%eax(或%ax)的后16位。
但是,如果你把一个负数,一切都开始变得古怪,它似乎并没有被表现如预期。
例如,如果%eax中的值是-67043552,然后复制到%EDX值是65312.
我是相当新的组件,对不起,如果这是在我的部分明显的误解。任何帮助将不胜感激。
请记住,movzwl
只会将%ax
中的位复制到%edx
中,并用零填充%edx
的高16位。
所以%edx
始终以正数小于或等于65535。
详细地结束:-67043552
十六进制是fc00ff20
。因此,如果这是在%eax
,然后%ax
包含ff20
。如果移动到%edx
零扩展,然后%edx
得到0000ff20
。这是65312.
['movswl'](http://www.felixcloutier.com/x86/MOVSX:MOVSXD.html)可用于签名扩展2的补码有符号值而不是零扩展二进制无符号值。 (参见[86标签维基(http://stackoverflow.com/tags/x86/info)。 –
另外,如果你打印你的号码为十六进制,它会少了很多混乱/较为明显发生了什么事。 –
另外,除非你确实需要在'%eax'的全部价值,您应该'movzwl 0x8中(%EBP),%edx',而不是直接的浪费指令单独做这件事。英特尔的CPU可以处理'movzx' /'movsx'作为一个负载uop,不需要ALU。 –