【发布时间】:2016-01-02 12:17:25
【问题描述】:
以下代码计算 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 $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 行是做什么的?
【问题讨论】:
-
如果您的偏移量是 8、12、16 和 20,那么它们都是 32 位的。 64 位操作数将有 8 个字节的偏移量。
-
@stark 错了。
dest是一个指针,所以 4 个字节。x确实是 32 位。y是 64 位,从 +16 的低位 dword 和 +20 的高位 dword 开始。
标签: c assembly 32bit-64bit 32-bit