在 32 位机器上实现 64 位算法 - 汇编代码
implement 64-bit arithmetic on a 32-bit machine - assembly code
以下代码计算 x 和 y 的乘积并将结果存储在内存中。数据类型 ll_t 定义为
相当于long long.
gcc 生成以下执行计算的汇编代码:
typedef long long ll_t;
void store_prod(ll_t *dest, int x, ll_t y)
{
*dest = x*y;
}
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 , %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 行是做什么的?
第 5 行:它正在将某个局部变量的值复制到 ECX。截至此清单,该值未知,因为我们缺少部分原始功能代码。
第11行:等价于:EDX = EDX+ECX。 LEA 指令用于计算内存值的 EA 并将该 EA 存储到目标寄存器中,因此,它可用于快速进行加法和常数乘法。
以下代码计算 x 和 y 的乘积并将结果存储在内存中。数据类型 ll_t 定义为 相当于long long.
gcc 生成以下执行计算的汇编代码:
typedef long long ll_t;
void store_prod(ll_t *dest, int x, ll_t y)
{
*dest = x*y;
}
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 , %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 行是做什么的?
第 5 行:它正在将某个局部变量的值复制到 ECX。截至此清单,该值未知,因为我们缺少部分原始功能代码。
第11行:等价于:EDX = EDX+ECX。 LEA 指令用于计算内存值的 EA 并将该 EA 存储到目标寄存器中,因此,它可用于快速进行加法和常数乘法。