gpt4 book ai didi

assembly - 将有符号数乘以无符号数时,我应该使用 "mul"还是 "imul"?

转载 作者:行者123 更新时间:2023-12-04 02:03:41 24 4
gpt4 key购买 nike

我发现 mulimul可用于将有符号数乘以无符号数。

例如:

global _start

section .data
byteVariable DB -5

section .text
_start:

mov al, 2
imul BYTE [byteVariable]

您可以更换 imulmul ,结果仍然相同( -10 )。

mulimul乘以 时完全相同签名 号码到 未签名 数量,或者它们之间有区别吗?

最佳答案

如评论中所述,上半部分不同。如果你不关心上半部分,你可以使用 mulimul , 在它们的所有形式中(单操作数形式产生上半部分,但在这种情况下你会忽略它)。

如果你确实关心上半部分,那么 mul也不是 imul自己工作,因为它们只是乘以无符号*无符号和有符号*有符号,但您可以很容易地修复它。

考虑到有符号字节的位权重为 -128、64、32、16、8、4、2、1,而无符号字节的位权重为 + 128, 64, 32, 16, 8, 4, 2, 1. 所以你可以表示x的无符号值以签名格式(我知道这很令人困惑,但这是我能做的最好的)如 x + 256 x_7 (其中 x_7x 的第 7 位)。最简单的查看方法可能是将其拆分:x + 2 * 128 * x_7 .这里发生的事情是补偿-128 权重,首先通过将第 7 位的值相加 128 次来删除它,然后通过再次执行一直到 +128 权重,当然这可以一步完成。

无论如何,乘以某个有符号数 y并解决了 256 x_7 y + xy ,其中 xyimul 的(双倍宽度)结果和 256 x_7 y表示“如果设置了 y 的符号,则将 x 添加到上半部分”,因此可能的实现是(未测试)

; al has some unsigned value
mov dl, al
sar dl, 7
and dl, [signedByte]
imul BYTE [signedByte]
add ah, dl

自然地,您可以对一个操作数进行符号扩展,对另一个操作数进行零扩展,并使用 16 位乘法(任意,因为上半部分与这种方式无关)。

关于assembly - 将有符号数乘以无符号数时,我应该使用 "mul"还是 "imul"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45495711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com