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

ebe*_*ing 5 x86 assembly sign-extension zero-extension

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

push   %ebp
mov    %esp,%ebp   
push   %ebx
mov    0x8(%ebp),%eax 
movzwl %ax,%edx
Run Code Online (Sandbox Code Playgroud)

所以这在处理正值时表现得像预期的那样.复制到%edx中的值是%eax(或%ax)的尾随16位.

但是,如果你输入一个负数,一切都开始变得怪异,它似乎没有像预期的那样表现.

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

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

Ray*_*oal 16

请记住,movzwl只复制在位%ax%edx中的高16位填充%edx零.

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

详细说明:-67043552以十六进制表示fc00ff20.所以,如果是%eax,那么%ax包含ff20.如果你将其移动到%edx零扩展,那么%edx得到0000ff20.那是65312.