次のコードは、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 は、計算を実装する次のアセンブリ コードを生成します: %ebp+8 の dest、%ebp+12 の x、%ebp+16 の y
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 ビット演算を実装するために必要な多倍精度演算を実装するために、3 つの乗算を使用します。積の計算に使用されるアルゴリズムを説明し、アセンブリ コードに注釈を付けて、アルゴリズムがどのように実現されるかを示します。
上記のアセンブリ コードの 8 行目と 9 行目がわかりません。誰でも助けることができますか?