реализовать 64 -битную арифметику на 32 -битной машине

Следующий код вычисляет произведение 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 генерирует следующий ассемблерный код, реализующий вычисления :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 -битной машине. Опишите алгоритм, используемый для вычисления продукта, и аннотировать ассемблерный код, чтобы показать как он реализует ваш алгоритм.

Я не понимаю строку 8 и строку 9 в ассемблерном коде выше. Кто-нибудь может помочь?

5
задан Mikhail 25 September 2012 в 22:57
поделиться