movzwl、%ax 和负值的奇怪结果
好吧,我正在处理以下代码片段:
push %ebp
mov %esp,%ebp
push %ebx
mov 0x8(%ebp),%eax
movzwl %ax,%edx
因此,在处理正值时,这会表现出预期的效果。复制到 %edx 中的值是 %eax(或 %ax)的尾随 16 位。
然而,如果你输入一个负数,一切都会开始变得奇怪,并且它似乎没有按预期运行。
例如,如果 %eax 的值为 -67043552,则复制到 %edx 中的值为 65312。
我对汇编还很陌生,如果这是我的明显误解,我很抱歉。任何帮助将不胜感激。
Alright, so I am dealing with the following snippet of code:
push %ebp
mov %esp,%ebp
push %ebx
mov 0x8(%ebp),%eax
movzwl %ax,%edx
So this behaves as expected when dealing with positive values. The value copied into %edx is the trailing 16 bits of %eax (or %ax).
However, if you put a negative number in, everything starts getting weird and it does not seem to be behaving as expected.
For example, if the value of %eax is -67043552, then the value copied into %edx is 65312.
I'm fairly new to assembly, sorry if this is an obvious misinterpretation on my part. Any help would be greatly appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
请记住,
movzwl
仅将%ax
中的位复制到%edx
中,填充%edx
的高 16 位带零。因此,
%edx
始终以小于或等于 65535 的正数结束。具体来说:十六进制的
-67043552
是fc00ff20
。因此,如果它位于%eax
中,则%ax
包含ff20
。如果您将其移动到具有零扩展名的%edx
中,则%edx
会得到0000ff20
。那是65312。Remember that
movzwl
copies only the bits in%ax
into%edx
filling in the high 16 bits of%edx
with zeros.So
%edx
always ends up with a positive number less than or equal to 65535.In detail:
-67043552
in hex isfc00ff20
. So if that is in%eax
, then%ax
containsff20
. If you move that into%edx
with zero-extension, then%edx
gets0000ff20
. That's 65312.