微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将两个负数相乘时 imul 的 MASM32 问题

如何解决将两个负数相乘时 imul 的 MASM32 问题

我想注册编号-100,现在在al中以十六进制存储9C,与我对寄存器bl所做的相同,因此在bl中也存储了9C。 这就是问题所在,当我这样做时:

imul ebx

我在寄存器 eax 中得到 00005F10h,它是十进制的 24336,而不是我预期得到的 10000。 我究竟做错了什么? 这是我进行乘法运算的代码部分:

mov eax,0
mov ebx,0
mov ecx,0
mov al,[sbAval+esi]
mov bl,[sbAval+esi]

power:
imul ebx
cmp ecx,2
je powerDone
inc ecx
jmp power

sbAval 是 SBYTE 数据类型

这里我有 9C 存储在 eax 和 ebx 中 registers before imul

这里是 imul registers after imul

之后的寄存器

解决方法

-100 在 32 位中不是 0x9c,而是 0xffffff9c。如果您将 0x9c 放入寄存器(而不是实际的整数 -100),那么您就有 156。156*156=24336 可能会让您感到惊讶。这很可能是混淆的来源。

在您编辑之后,您似乎无法使用 SBYTE 自然地做到这一点,因为指令的性质用 0 填充较短的数据类型(并将其视为正数)。在将 SBYTE 移动到寄存器时使用 movsx 保留符号。

,

假设采用二进制补码系统,0x9C 存储在单个字节中时为负数,而使用两个或更多字节存储时为正数。

这是因为在二进制补码系统中,最高有效位(即最左边的一位)表示符号,而 1 使其为负。

当您将空间扩展到 32 位时,其中 MSB 为 0 - 该数字被“处理”为正数。

一种可能的解决方案是将 100 存储在 ALBL 中(在清除 EAXEBX 之后,就像您在代码中所做的那样),并且然后否定 EAXBAX。例如。 NEG EAX ( How to convert a positive number to negative in assembly )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。