所以我正在尝试使用移位和添加算法在汇编语言程序中实现乘数。我在此 ISA 中没有可用的左移指令,但我确实了解向自身添加一个数字会将左移一个数字。
假设我想乘以 5 * 15,这将101
乘以1111
.我知道我需要将 5 乘以 15 中的每个部分位,但我对如何访问/使用这些部分位感到困惑。从右到左,我将1
乘以101
得到 101,添加一个占位符以左移,然后继续每个连续的位,得到1010
、10100
和101000
。然后我把这些数字加起来得到1001011
是75,这是正确的答案。
那么,我如何在组装中做到这一点呢?我很困惑。谢谢!
也许是 如何仅使用位移位和加法来乘除? 其中有更多细节。
在 x86 上,给定 EDX 中的15
,你会这样做
lea eax, [rdx + rdx*4]
要做EAX = (EDX<<2) + EDX = EDX*5
,因为101
是(1<<2) + (1<<0)
。
另请参阅如何使用逻辑门将二进制表示乘以十? computerscience.SE 以获取有关乘法的更多背景信息。
轮班指令比IMUL指令快吗? 有一些东西。