movzwl、%ax 和负值的奇怪结果

发布于 2024-12-03 06:00:16 字数 340 浏览 3 评论 0原文

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

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

时光匆匆的小流年 2024-12-10 06:00:16

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

因此,%edx 始终以小于或等于 65535 的正数结束。

具体来说:十六进制的 -67043552fc00ff20。因此,如果它位于 %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 is fc00ff20. So if that is in %eax, then %ax contains ff20. If you move that into %edx with zero-extension, then %edx gets 0000ff20. That's 65312.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文