好的,我正在处理以下代码片段:
push %ebp
mov %esp,%ebp
push %ebx
mov 0x8(%ebp),%eax
movzwl %ax,%edx
因此,在处理正值时,此行为与预期一致。复制到%edx中的值是%eax(或%ax)的尾随16位。
但是,如果你输入一个负数,一切都开始变得怪异,它似乎没有按预期行事。
例如,如果%eax的值为-67043552,则复制到%edx的值为65312。
我对集会很新,对不起,如果这对我来说是一个明显的误解。任何帮助将不胜感激。
答案 0 :(得分:16)
请注意,movzwl
仅将%ax
中的位复制到%edx
,用零填充%edx
的高16位。
所以%edx
总是以小于或等于65535的正数结束。
详细信息:十六进制中的-67043552
为fc00ff20
。因此,如果它位于%eax
,则%ax
包含ff20
。如果您将其移至%edx
且展开为零,则%edx
会获得0000ff20
。那是65312。