使用movzwl,%ax和负值的奇怪结果

时间:2011-09-06 06:03:28

标签: assembly x86 sign-extension zero-extension

好的,我正在处理以下代码片段:

push   %ebp
mov    %esp,%ebp   
push   %ebx
mov    0x8(%ebp),%eax 
movzwl %ax,%edx

因此,在处理正值时,此行为与预期一致。复制到%edx中的值是%eax(或%ax)的尾随16位。

但是,如果你输入一个负数,一切都开始变得怪异,它似乎没有按预期行事。

例如,如果%eax的值为-67043552,则复制到%edx的值为65312。

我对集会很新,对不起,如果这对我来说是一个明显的误解。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:16)

请注意,movzwl仅将%ax中的位复制到%edx,用零填充%edx的高16位。

所以%edx总是以小于或等于65535的正数结束。

详细信息:十六进制中的-67043552fc00ff20。因此,如果它位于%eax,则%ax包含ff20。如果您将其移至%edx且展开为零,则%edx会获得0000ff20。那是65312。