implementar aritmética de 64 bits em uma máquina de 32 bits

O código a seguir calcula o produto de x e y e armazena o resultado na memória. O tipo de dados ll_t é definido para ser equivalente a long long.

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

O gcc gera o seguinte código de montagem implementando o cálculo: dest em% ebp + 8, x em% ebp + 12, y em% 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)

Esse código usa três multiplicações para implementar a aritmética de multiprecisão necessária para implementar a aritmética de 64 bits em uma máquina de 32 bits. Descreva o algoritmo usado para calcular o produto e anote o código de montagem para mostrar como ele realiza seu algoritmo.

Eu não entendo a linha 8 e a linha 9 no código de montagem acima. Alguém pode ajudar?

questionAnswers(3)

yourAnswerToTheQuestion