在32位机器上实现64位算术 - 汇编代码

时间:2015-10-05 18:29:51

标签: c assembly 32bit-64bit 32-bit

以下代码计算x和y的乘积并将结果存储在内存中。数据类型ll_t定义为 相当于漫长的。

gcc生成以下汇编代码来实现计算:

 typedef long long ll_t;

 void store_prod(ll_t *dest, int x, ll_t y)
 {
 *dest = x*y;
 }

目标为%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)

该代码使用三次乘法来实现实现64位算术所需的多精度算术 在32位机器上。描述用于计算产品的算法,并注释汇编代码以显示如何 它实现了你的算法。

问题:第5行有什么作用?注册ecx有什么价值? 第11行也做了什么?

1 个答案:

答案 0 :(得分:2)

第5行:它正在将某个局部变量的值复制到ECX。由于我们缺少原始功能代码的一部分,因此该列表中的值未知。

第11行:相当于:EDX = EDX + ECX。 LEA指令用于计算存储器值的EA并将该EA存储到目标寄存器中,因此,它可用于快速执行加法和常数乘法。