use*_*783 2 binary assembly arm multiplication integer-arithmetic
例如,ARM 处理器有一条mul指令,它执行 32 位 x 32 位乘法并返回结果的最低有效 32 位。它们还有umull和smull指令,再次执行 32 位 x 32 位乘法,但返回完整的 64 位结果。umull进行无符号乘法,并smull进行有符号乘法。
为什么不需要单独的未签名和签名版本mul?在 32 位 x 32 位乘法的情况下,结果的最低有效 32 位在这两种情况下可能是相同的?32 位是完全相同的还是比 32 位更多?
更一般地,在 m 位 x n 位乘法(产生 (m+n) 位结果)的情况下,无符号乘法和有符号乘法的最低有效位有多少个相同?
你可以用铅笔和纸来做这个...小学风格
-1 * 3 = -3, 7 * 3 = 21 smull 与 umull
0b111*0b011
111111
* 000011
==========
111111
111111
000000
...
+
==========
11111101
Run Code Online (Sandbox Code Playgroud)
(从技术上讲,符号的扩展范围与内部 alu 输入一样宽)
这是-3
采用相同的 3 位数字,但使用 umull
0b111*0b011
000111
* 000011
=============
000111
000111
000000
+ ...
==============
0010101
Run Code Online (Sandbox Code Playgroud)
结果是 21。
二进制补码的美妙之处在于,加法和减法使用相同的逻辑,但乘法和除法必须符号扩展才能得到正确的答案,这就是问题所在。无符号符号扩展零,有符号符号扩展符号。最差情况下乘以存储结果所需位数的两倍,因此需要使用 32 位操作数来完成 16 位乘 16 乘法,并且填充到高 16 位的内容在有符号乘法和无符号乘法之间有所不同。一旦你签署了扩展,那么确保你可以提供相同的乘法逻辑,因为那里没有区别。我想有人可能会争辩说,这也是加法和减法的工作原理,您输入相同的加法器逻辑的内容会根据加法与减法的不同而变化,同样,您最后取出的内容也可能会有所不同(如果您反转进位位将其称为借位)
现在,根据你的问题,是的,如果你输入 3 位乘 3 位,并且只查看输出的 3 个较低位,这几乎总是错误的答案,但无论如何都是相同的小学数学
AAAabc
DDDdef
=========
AAAabc
AAAabc
AAAabc
AAAabc
...
===========
Run Code Online (Sandbox Code Playgroud)
3x3 位输入的低 3 位严格由原始 3 位输入决定,umull 和 smull 之间变化的符号扩展不发挥作用。这是一个有趣的练习,但在现实世界中没有太多用途,大多数操作数组合都会溢出,但比例很高。
如果对 M * N 位重复此练习,则应该是 M 或 N 位中较小的一个不受符号扩展影响。这个简单的练习留给读者。
| 归档时间: |
|
| 查看次数: |
802 次 |
| 最近记录: |