【发布时间】:2012-07-25 17:08:00
【问题描述】:
以下代码计算 x 和 y 的乘积并将结果存储在内存中。数据 ll_t 类型被定义为等价于 long long。
typedef long long ll_t;
void store_prod(ll_t *dest, int x, ll_t y) {
*dest = x*y;
}
gcc 生成以下实现计算的汇编代码: dest 在 %ebp+8,x 在 %ebp+12,y 在 %ebp+16
1 movl 16(%ebp), %esi
2 movl 12(%ebp), %eax
3 movl %eax, %edx
4 sarl $31, %edx
5 movl 20(%ebp), %ecx
6 imull %eax, %ecx
7 movl %edx, %ebx
8 imull %esi, %ebx
9 addl %ebx, %ecx
10 mull %esi
11 leal (%ecx,%edx), %edx
12 movl 8(%ebp), %ecx
13 movl %eax, (%ecx)
14 movl %edx, 4(%ecx)
此代码使用三个乘法来实现多精度算术 需要在 32 位机器上实现 64 位算法。描述 用于计算产品的算法,并注释汇编代码以显示 它是如何实现你的算法的。
我看不懂上面汇编代码中的第 8 行和第 9 行。谁能帮忙?
【问题讨论】:
-
似乎它正在做一些非常棘手的事情,不需要 add-with-carry 指令......
-
@Mysticial 没什么棘手的。在计算截断乘积时不需要 ADC,就像这里一样。
-
标准 SO 响应:您尝试过什么?从您下面的评论中,您真正要问的是:算法是什么。好吧,那是你的功课;这就是你应该弄清楚的。到目前为止,您在试图弄清楚这一点时做了什么?你说你知道这些说明是做什么的……然后也许先把它写下来。