5

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

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

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

然而,如果你输入一个负数,一切都会变得很奇怪,而且它的行为似乎不像预期的那样。

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

我对组装很陌生,如果这对我来说是一个明显的误解,我很抱歉。任何帮助将不胜感激。

4

1 回答 1

16

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

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

详细说明:-67043552十六进制是fc00ff20. 因此,如果那在 中%eax,则%ax包含ff20。如果您将其移入%edx零扩展名,则%edx得到0000ff20. 那是65312。

于 2011-09-06T06:07:02.320 回答