计算机中乘法是什么函数,c - 分解简单的C函数。 (在64位计算机中为128位乘法) - 堆栈内存溢出...

我正在一本名为“计算机系统”的书中解决问题。 这是我正在努力解决的问题。

问题:以下代码计算两个64位带符号值x和y的128位乘积并将结果存储在内存中:

1 typedef __int128 int128_t;

2

3 void store_prod(int128_t *dest, int64_t x, int64_t y){

4 *dest = x * (int128_t) y;

5 }

Gcc生成以下实现该计算的汇编代码:

1 store_prod:

2 movq %rdx, %rax

3 cqto

4 movq %rsi, %rcx

5 sarq $63, %rcx

6 imulq %rax, %rcx

7 imulq %rsi, %rdx

8 addq %rdx, %rcx

9 mulq %rsi

10 addq %rcx, %rdx

11 movq %rax, (%rdi)

12 movq %rdx, 8(%rdi)

13 ret

对于在64位计算机上实现128位算术所需的多精度算术,此代码使用三个乘法。 描述用于计算乘积的算法,并注释汇编代码以显示其如何实现您的算法。

我试图注释每个汇编代码。 但是我从第四条指令中完全迷失了。 我了解每个汇编代码的工作原理,但是在将它们组合在一起的过程中,我迷失了方向。

1 store_prod:

2 movq %rdx, %rax // copy y to rax

3 cqto // sign-extend to upper 8 bytes of rax

4 movq %rsi, %rcx // copy x to rcx

5 sarq $63, %rcx // right arithmetic shift 63 times (why..?)

6 imulq %rax, %rcx // multiply rcx by rax (why..?)

7 imulq %rsi, %rdx // multiply rdx by x (why..?)

8 addq %rdx, %rcx // add rdx to rcx (why..?)

9 mulq %rsi // multiply by x [rax = x*y]

10 addq %rcx, %rdx // add rcx to xy (why..?)

11 movq %rax, (%rdi) // store rax at dest

12 movq %rdx, 8(%rdi) // store rdx at dest+8

13 ret //

对不起,我的英语不好,希望您能理解我的意思。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值