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.